想用VC2008写个HOOK API的DLL,先拿GetClassName做实验
static BYTE OldCode[12];//原GetClassName头代码
static BYTE NewCode[12];//新GetClassName头代码
PVOID OldFunEntry;//GetClassName地址,在我的机器上是77d2f420
void Change()//修改GetClassName头
{
WriteProcessMemory(hHandle, OldFunEntry, NewCode, 12, &RetSize);//替换GetClassName头成功
}
void Restore()//还原GetClassName头
{
VirtualProtect(OldFunEntry,12,PAGE_READWRITE,&dwold);
WriteProcessMemory(hHandle, OldFunEntry, OldCode, 12, &RetSize);//。。。。。。
VirtualProtect(OldFunEntry,12,dwold,&dwold2);
}
原版GetClassName:
77D2F420 > [COLOR="Green"]6A[/COLOR] [COLOR="Blue"]14[/COLOR] push 14
77D2F422 [COLOR="Blue"]68 A0F4D277[/COLOR] push 77D2F4A0
77D2F427 [COLOR="Blue"]E8 9491FEFF[/COLOR] call 77D185C0
77D2F42C 8B4D 08 mov ecx, dword ptr [ebp+8]
77D2F42F E8 9C90FEFF call 77D184D0
77D2F434 85C0 test eax, eax
DLL注入后先执行Change,执行成功,修改后函数头变为
77D2F420 > [COLOR="Red"]8B[/COLOR]FF mov edi, edi
再执行Restore,执行后GetClassName头变为:
77D2F420 > [COLOR="Red"]8B[/COLOR][COLOR="Blue"]1468[/COLOR] mov edx, dword ptr [eax+ebp*2]
77D2F423 [COLOR="Blue"]A0 F4D277E8[/COLOR] mov al, byte ptr [E877D2F4]
77D2F428 [COLOR="Blue"]94[/COLOR] xchg eax, esp
77D2F429 [COLOR="Blue"]91[/COLOR] xchg eax, ecx
77D2F42A [COLOR="Blue"]FE[/COLOR] ??? ; 未知命令
77D2F42B [COLOR="Blue"]FF[/COLOR]8B 4D08E89C dec dword ptr [ebx+9CE8084D]
77D2F431 90 nop
77D2F432 FE ??? ; 未知命令
77D2F433 FF85 C0745B83 inc dword ptr [ebp+835B74C0]
用OD看到的Restore内代码
100011E7 8B06 mov eax, dword ptr [esi] ; user32.GetClassNameA
100011E9 8D5424 08 lea edx, dword ptr [esp+8]
100011ED 52 push edx
100011EE 6A 0C push 0C
100011F0 68 10300010 push 10003010 //OldCode
100011F5 50 push eax ; user32.GetClassNameA
100011F6 57 push edi
100011F7 FF15 14200010 call dword ptr [<&KERNEL32.WriteProce>; kernel32.WriteProcessMemory
/////OldCode:
10003010 [COLOR="Green"]6A[/COLOR] [COLOR="Blue"]14 68 A0 F4 D2 77 E8 94 91 FE FF[/COLOR] 8B FF 55 8B jh狋襴钄扊?U
怎么12位的OldCode后11位都写入成功,只有第1位失败了呢?
之前Change时没有用VirtualProtect也写入成功了啊....
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课