mov edi,edi
push ebp
mov ebp,esp
mov eax, [sound.dll+1AE0]
push eax
mov ecx,[ebp+08]
mov eax,[ecx]
mov eax,[eax+0C]
push eax
call sound.dll+7C640
pop ebp
ret 0004
我通过CreateRemoteThread加载DLL。有没有一种方法可以在加载DLL时获取sound.dll + 1AE0(或链接)的地址,而不必执行GetModuleHandleEx并动态地计算地址?
谢谢!
编辑:
GetModuleHandleEx方法看起来像:
DWORD mem1AE0 = 0;
用sound.dll + 1AE0地址加载mem1AE0,然后在我的函数中:
_declspec(naked) void MyFunction() {
__asm {
mov edi,edi
push ebp
mov ebp,esp
mov eax, mem1AE0
mov eax, [eax]
push eax
mov ecx,[ebp+08]
mov eax,[ecx]
mov eax,[eax+0C]
push eax
call sound.dll+7C640
pop ebp
ret 0004
}
}
问题是当我有一个调用[sound.dll + XXXX]的指令时,该情况下我需要创建一个指向该内存的变量
DWORD memXXXX = 0;
用正确的地址加载它并创建一个代理调用DWORD
DWORD memXXXX_content = 0;
然后执行:
push eax
mov eax, memXXXX
mov eax, [eax]
mov memXXXX_content, eax
pop eax
call memXXXX_content
除非我做错什么,否则这是完全无效的?
感谢
编辑:我相信,如果您正在动态加载DLL,则无法获得静态链接。
#1 楼
我相信,如果要动态加载DLL,则无法获得静态链接。感谢所有感兴趣的人。
评论
调用GetModuleHandleEx或OpenProcess / ReadProcessMemory有什么问题?您的最终目标是什么?您要重新实现的功能完全一样吗?如果您有特定的更改,最好在适当位置进行修补。要么将其挂在一个更具体的级别。
是的,我需要完全替换该功能。完全一样。
您的第二个片段应显示为“ call [memXXXX_content]”,因为在x86中没有绝对绝对调用的形式,但这使整个事情等同于“ call [memXXXX]”。
彼得,我试过了,但是不行。调用[memXXXX]会调用mem本身而不是其内容