我试图在注入的DLL中重新编写以下函数。

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,则无法获得静态链接。

评论

调用GetModuleHandleEx或OpenProcess / ReadProcessMemory有什么问题?

您的最终目标是什么?您要重新实现的功能完全一样吗?如果您有特定的更改,最好在适当位置进行修补。要么将其挂在一个更具体的级别。

是的,我需要完全替换该功能。完全一样。

您的第二个片段应显示为“ call [memXXXX_content]”,因为在x86中没有绝对绝对调用的形式,但这使整个事情等同于“ call [memXXXX]”。

彼得,我试过了,但是不行。调用[memXXXX]会调用mem本身而不是其内容

#1 楼

我相信,如果要动态加载DLL,则无法获得静态链接。

感谢所有感兴趣的人。