DLL注入替换已知偏移量C ++的字符串

Posted

技术标签:

【中文标题】DLL注入替换已知偏移量C ++的字符串【英文标题】:DLL inject replace a string at known offset C++ 【发布时间】:2013-08-11 04:58:43 【问题描述】:

简单的问题,我对 c++ 或 windows api 不是很好,但我设法编写了一个 dll 来注入。基本上我知道我想替换的行的内存偏移量。

来自 IDA: .text:0051CA30 推送 16D8h

从 REC 反编译: _push(5848);

5848 或 16D8h 只不过是从文件中读取的值。我想要做的就是挂钩偏移量并打印我自己的文本。这应该很简单,但我一生都无法弄清楚,我尝试的一切只会让程序崩溃。可悲的是,替换文件中的文本不是一种选择,因为它很容易被替换并用于作弊。

我对刚才提到的所有功能替换都使用了弯路,以防万一。

【问题讨论】:

是否有某些原因需要注入 DLL 而不是使用 WriteProcessMemory 写入其内存? 我不必注入,但它必须与我的其他注入函数在同一个 dll 中。 【参考方案1】:

如果要替换目标进程中的字符串,可以在注入的 DLL 中使用以下 sn-p。

char* buffer = reinterpret_cast<char*>(base + 0x16D8);
size_t length = strlen(buffer) + 1;

char myStr[length] = "...";

DWORD oldProtect;
VirtualProtect(buffer, length, PAGE_EXECUTE_READWRITE, &oldProtect);
memcpy(buffer, myStr, length);
VirtualProtect(buffer, length, oldProtect, nullptr);

注意:新字符串的长度必须小于或等于原字符串的长度。

【讨论】:

如果可能有代码与字符串在同一页面上(一些编译器将只读常量放入代码段),请使用 PAGE_EXECUTE_READWRITE,以防在修补字符串时另一个线程执行代码。 the value of variable "length" cannot be used as a constant ?

以上是关于DLL注入替换已知偏移量C ++的字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用scanf从用户输入十六进制指令并将其保存在char中。 (C)

如果数组大小发生变化以及定义的宏如何在此处计算偏移量,为啥 C 结构中的字符数组的偏移量会有所不同? [复制]

怎么用C语言对文件操作用特定内容替换其中某些内容

使用 C 崩溃记事本进行 DLL 注入

C / C ++编译器可以报告结构成员偏移量[重复]

用C语言编程恺撒密码加密解密程序