带有DLL注入的Asm到C++
Asm to C++ with DLL Injection
我制作了一个控制台来测试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可能会被重新定位,并且地址将是错误的。
相关文章:
- 使用C++获取程序的 ASM
- 在 c++ 中使用 x86 DIV 的这个 asm 块有什么用?
- g++ -O3 为 loop 创建了奇怪的指令 - 两个具有相同 asm 的版本
- Extern "C"错误在'int'之前'asm'或'__attribute__'
- 了解 C/C++ 中 Windows / MSVC 的一些反调试内联 asm
- 尝试使用 x86 asm SSSE3 将大端转换为小端序
- 如何使用"asm volatile"编写 btr 指令
- objdump 不显示机器代码,但显示 ASM
- 未使用的 asm() 在不受支持的体系结构上的行为
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 为什么发出空asm命令会交换变量
- C++-更改另一个文件的ASM指令
- 尝试用纯 c 编程 arduino,得到以下错误:预期的"="、""、";",'asm'或"打印"之前的'__attribute__'|
- C++/ASM:按值传递使用 xmm0,但按引用使用 rdi
- 有人知道可以使用 c++ 以字节为单位编码 asm 字符串的任何东西吗?
- 优化了 VC++ 和 ASM 中的代码
- 如何在 Linux asm 中正确返回双精度值
- 使用读取[EBP 4]的MSVC内联ASM移植到64位
- 从 ASM 调用C++代码中标准库的链接