看完郁金香第020課總結:
同樣的一句指令 JMP 88881234在不同位置有以下現象
找規律:
88881234 - 010073bb = 87879E79
88881234 – 010073c0 = 87879E74
88881234 – 010073c5 = 87879E6F
因為機器碼 如E9 749e8787 是按字節排列的所以87879E74顯示出來是749e8787
所以可得以下公式
JMP的地址(88881234) – 代碼地址(010073bb) – 5(字節) = 機器碼跳轉地址(E9 87879e74)
typedef struct _JMPCODE
{
BYTE E9;
ULONGJMPADDR;//88881234=B
}JMPCODE,*PJMPCODE
應用:
跳過ssdt_hook
例如:NtOpenProcess 被hook 真正的地址為 0xAAAAAAAA(old) ,hook之后的地址為0xBBBBBBBB(cur)。
那么我們可以修改0xBBBBBBBB里的內容,內容為一條JMP指令。以達到繞過ssdt_hook的目的。
//jmp結構 typedef struct _JMPCODE { BYTE E9; ULONGJMPADDR;//88881234=B }JMPCODE,*PJMPCODE //定義jmp結構 JMPCODE JCode; JCode.E9=0xE9; //jmp機器碼 JCode.JMPADDR=cur-old-5;//計算JMP 后面的數值 _asm { mov ebx,cur //取當前地址 lea ecx,Jcode //取結構地址 mov ax,byte ptr [ecx] Mov byte ptr[ebx],ax //寫jmp mov eax,[ecx+1] //移動指針 mov [ebx+1],eax //寫跳轉 }