2013-08-04 43 views
0

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

祝用C在004116D5从JE 004116DE地址(选择的灰度地址)改变到JNZ/JNE 004116DE ++。

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

的DllMain下,我用微软的Detours 1.5

DetourFunction((PBYTE)asmAddy,(PBYTE)changeasm); 
图像后

,好像它跳到注入dll.Can人的记忆帮助我吗?我已经改变使用OllyDbg的操作码,它工作正常。

回答

0

我觉得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可能会重新定位并且地址将会出错。

+0

感谢您的答复。我发现使用谷歌Detours工作通过将一个jmp放置在我想要挂钩的地址,因此在后映像中有一个jmp而不是jnz/jne,然后它的地址跳转到我的函数(解释为什么它是注入的DLL中的地址)。然而,我的目标是像你说的那样做,但不写入内存字节,而是直接使用asm来更改它。 – Imaginarys

+0

地址已分配。 如果您尝试写入受保护的内存,则只能对其进行更改。 在你看来,asm不会成为这里的“特殊解决方案”。 – icbytes

+0

cdmh提到,如果修改dll,地址可能会改变。虽然这在某种程度上是正确的,但您可以也可能应该使用EnumerateProcessModules来查找要写入的代码的模块基址。这也将避免ASLR问题。 – XtrmJosh