带有DLL注入的Asm到C++

Asm to C++ with DLL Injection

本文关键字:C++ Asm DLL 注入 带有      更新时间:2023-10-16

我制作了一个控制台来测试IsDebuggerPresent,并试图更改其输出。注入DLL之前的内存区域:http://imageshack.us/photo/my-images/842/hso7.jpg/DLL注入后的内存区域:http://imageshack.us/photo/my-images/59/i1jw.jpg/

我希望使用C++将004116D5的地址(选定的灰色地址)从JE 004116DE更改为JNZ/JNE 004116DE。

DWORD asmAddy = 0x004116D5;    
#define Naked __declspec(naked)
Naked void changeasm()
{
_asm
{
jnz 0x004116DE
}
}

在DllMain下,我使用了Microsoft Detours 1.5

DetourFunction((PBYTE)asmAddy,(PBYTE)changeasm);

在after图像中,它似乎跳转到了注入dll的内存中。有人能帮我吗?我已经使用OllyDbg更改了操作码,它运行良好。

我认为Detours将通过挂接导入表来替换整个函数,不是吗?这听起来不像你真正想做的。

如果我回答了您的问题,您希望将操作码从JE(0x74)更改为JNE(0x75)。写入代码区域受到保护。在将新操作码写入已知位置之前,您需要更改内存的受保护状态。类似这样的东西(未经测试的代码,没有错误处理):

char *address = 0x004116d5;
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(address, &mbi, sizeof(mbi));
VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_READWRITE, &mbi.Protect);
*address = 0x75; // opcode of 
// restore the memory protection
DWORD oldProtect;
VirtualProtect(mbi.BaseAddress, mbi.RegionSize, mbi_thunk.Protect, &oldProtect);

不过,请注意,这一切都是非常危险的。如果这是DLL中的一个地址,那么DLL可能会被重新定位,并且地址将是错误的。