【问题标题】:Unwarranted Function Call [closed]无根据的函数调用[关闭]
【发布时间】:2019-02-15 01:28:58
【问题描述】:

所以我想做的很简单;我想将一个函数写入另一个进程的内存并执行它。我所做的是获取函数的大小,并使用 WriteProcessMemory 来执行此操作。我已经成功创建了一个线程来运行这个函数,并使用作弊引擎的调试功能确认。 函数如下所示:

inline void __cdecl Test( )
{ }

看起来很简单。它不应该依赖任何需要重新定位的东西,所以它应该可以正常工作。它是内联的,因为我在标题中定义了它,如果相关的话。虽然这个函数什么都不做,但这就是作弊引擎中发生的事情:

奇怪的是它正在复制一个字符串,但更奇怪的是它正在调用一个函数?由于这个随机函数调用正在发生,程序崩溃,因为地址没有重新定位以匹配函数在新进程中的位置。所以,我的问题是:为什么它会调用一个函数,我该如何阻止这种情况发生?

【问题讨论】:

  • 你怎么知道这是有问题的函数?你如何获得函数的大小?这在 C 或 C++ 中不是一件容易的事。
  • 我正在禁用优化和增量链接,并在它下面创建另一个函数。然后我从第二个函数的地址中减去第一个函数的地址。这给了我 64 的大小,这与我在作弊引擎中看到的一样。我知道这是我的函数,因为我从 VirtualAllocEx 的返回中得到了这个地址,然后看着内存被写入。
  • 这些都不能证明什么。
  • inline 函数通常不会在任何地方有独立的定义。也许当您在禁用优化的情况下编译时,但是 IDK 如果您想从其独立定义中获取机器代码,为什么要声明它inline
  • mov eax, 0xCCCCCCCC / rep stosd 让我想知道您是否正在查看复制函数的函数,而不是函数本身。 0xccint3 的操作码,MSVC 用int3 在函数之间填充。所以也许你正在复制int3 的块?嗯,但是 IDK 怎么会立即结束。无论如何,那是什么反汇编?

标签: c++ assembly c++17 shellcode cheat-engine


【解决方案1】:

所以基本上,调试模式是导致此问题的原因,并且不会在发布中发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多