我用delphi和c分别写了dll钩子内存补丁,c编译后运行完全正确。但delphi会出现问题,OD提示说 xxxxxx 无法实现,请尝试修改 eip。
程序功能:调用主程序的函数(已找到指针) 函数参数我自己定义.
主程序函数有4个参数,我只修改3个,一个不修改。
后面注解的是 寄存器的变化
我跟了一下 delphi 如下
03BB2B2A 50 push eax //EAX 0012F504 ASCII "sss"
03BB2B2B 52 push edx //ESP 0012F4E8
03BB2B2C 51 push ecx
03BB2B2D 6A 00 push 0 //这个是第1个参数自定义
03BB2B2F B9 FFFFFF00 mov ecx,0FFFFFF //这个是第2个参数自定义
03BB2B34 8B55 FC mov edx,dword ptr ss:[ebp-4] //EDX 0012F504 ASCII "sss" //这个是第3个参数自定义
03BB2B37 B8 8C7D4F00 mov eax,4F7D8C //这个是第4个参数默认地址 //EAX 004F7D8C jymir
03BB2B3C 8B00 mov eax,dword ptr ds:[eax] //EAX 00D3B314
03BB2B3E FF15 E09A4700 call dword ptr ds:[479AE0] //主程序地址
03BB2B44 59 pop ecx
03BB2B45 5A pop edx
03BB2B46 58 pop eax
03BB2B47 5F pop edi
03BB2B48 5E pop esi
03BB2B49 8BE5 mov esp,ebp
03BB2B4B 5D pop ebp
03BB2B4C C3 retn
以下是vc++
03B512CC |. 50 push eax //EAX 0012F99C ACCESS "12123"
03B512CD |. 52 push edx //ECX 0012F99C ACCESS "12123"
03B512CE |. 51 push ecx
03B512CF |. 6A 00 push 0 这个是第1个参数
03B512D1 |. B9 FFFFFF00 mov ecx,0FFFFFF 这个是第2个参数
03B512D6 |. 8B95 F4FEFFFF mov edx,[local.67] 这个是第3个参数
03B512DC |. B8 8C7D4F00 mov eax,4F7D8C //这个是第4个参数 //EAX 004F7D8C jymir EDX "123123"
03B512E1 |. 8B00 mov eax,dword ptr ds:[eax] //EAX 00D3B314
03B512E3 |. FF55 FC call [local.1] //主程序地址,保存在常量中
03B512E6 |. 59 pop ecx
03B512E7 |. 5A pop edx
03B512E8 |. 58 pop eax
03B512E9 |. 5F pop edi
03B512EA |. 5E pop esi
03B512EB |. 5B pop ebx
03B512EC |. 81C4 4C010000 add esp,14C
03B512F2 |. 3BEC cmp ebp,esp
03B512F4 |. E8 47030000 call dll.03B51640
03B512F9 |. 8BE5 mov esp,ebp
03B512FB |. 5D pop ebp
03B512FC \. C3 retn
以上是分析数据,小弟弄了2昼夜找到问题。delphi 到call 的地方后 好象找不到函数地址的一样,跟不进去了,也是这个地方出的错。
注:c的完全正确也没有出错。代码是用内嵌的汇编。
请各位高手指点下。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!