【发布时间】:2019-02-15 01:28:58
【问题描述】:
所以我想做的很简单;我想将一个函数写入另一个进程的内存并执行它。我所做的是获取函数的大小,并使用 WriteProcessMemory 来执行此操作。我已经成功创建了一个线程来运行这个函数,并使用作弊引擎的调试功能确认。 函数如下所示:
inline void __cdecl Test( )
{ }
看起来很简单。它不应该依赖任何需要重新定位的东西,所以它应该可以正常工作。它是内联的,因为我在标题中定义了它,如果相关的话。虽然这个函数什么都不做,但这就是作弊引擎中发生的事情:
奇怪的是它正在复制一个字符串,但更奇怪的是它正在调用一个函数?由于这个随机函数调用正在发生,程序崩溃,因为地址没有重新定位以匹配函数在新进程中的位置。所以,我的问题是:为什么它会调用一个函数,我该如何阻止这种情况发生?
【问题讨论】:
-
你怎么知道这是有问题的函数?你如何获得函数的大小?这在 C 或 C++ 中不是一件容易的事。
-
我正在禁用优化和增量链接,并在它下面创建另一个函数。然后我从第二个函数的地址中减去第一个函数的地址。这给了我 64 的大小,这与我在作弊引擎中看到的一样。我知道这是我的函数,因为我从 VirtualAllocEx 的返回中得到了这个地址,然后看着内存被写入。
-
这些都不能证明什么。
-
inline函数通常不会在任何地方有独立的定义。也许当您在禁用优化的情况下编译时,但是 IDK 如果您想从其独立定义中获取机器代码,为什么要声明它inline。 -
mov eax, 0xCCCCCCCC/rep stosd让我想知道您是否正在查看复制函数的函数,而不是函数本身。0xcc是int3的操作码,MSVC 用int3在函数之间填充。所以也许你正在复制int3的块?嗯,但是 IDK 怎么会立即结束。无论如何,那是什么反汇编?
标签: c++ assembly c++17 shellcode cheat-engine