【问题标题】:Strange behavior when obtaining addresses of functions获取函数地址时的奇怪行为
【发布时间】:2012-08-16 18:14:35
【问题描述】:

我又一次面临着对我的代码进行轻微修改以适应无法修改的一些编写不佳代码的库的挑战。

经过数小时的研究(在发现您无法将任何类型的状态传递给函数指针之后),我需要在将 EAX 重置为 0xCCCCCCCC 的函数标头中删除 ASM 字节。

通过使用内置的 VC++ 调试器获取函数的“地址”并在作弊引擎中手动创建一个字节数组条目(这对这类事情非常有用),它成功提取了字节,我可以手动 NOP 5 字节序列。

但是,以编程方式执行此操作有点不同。

当我执行以下任何操作时,地址明显高于调试器报告的地址,这给了我一个指向错误字节的指针。

unsigned int ptr = reinterpret_cast<unsigned int>(testhack);
unsigned char* tstc = (unsigned char*)&testhack;
FARPROC prc = GetProcAddress(GetModuleHandle("mod.dll"), "testhack"); // Still
                    // returns the incorrect address (same as the previous two)

调试器在做什么来找到正确的地址?如何以编程方式找到正确的地址?

【问题讨论】:

  • 为什么要投反对票?真的没有其他方法可以做到这一点。
  • 保存EAX,然后在它被破坏后恢复它?
  • @MarkB 我不能 - 我无法控制。
  • 那只是我曾经在Old New Thing上看到的一个问题:你确定你没有把一个问题分解成一个简单的问题和一个不可能的问题,然后解决了简单的问题而不是试图解决最初的问题?
  • @MarkB - 不。这个问题是两个问题的组合:该代码不允许将任何类型的用户数据传递给回调,以及 C++ 不允许'不允许将任何类型的状态传递给函数指针'回调'。

标签: c++ debugging visual-c++ function-pointers memory-address


【解决方案1】:

大概函数地址在 DLL 中。在这种情况下,您看到的是加载程序将例如&amp;testhack 的地址重新定位到加载程序的内存的正确位置。调试器可能已经知道重定位,并且会自动为您处理这些问题,让您可以修改字节。

不幸的是,我不知道有什么机制可以解决这个问题,但是如果您静态链接,地址将在链接时而不是运行时固定。

【讨论】:

    【解决方案2】:

    想通了。

    完全忘记了(我相信被称为)查找表。我收到的地址是指向查找表条目的指针,它是一个简单的 5 字节无条件 JMP 到 real 函数体。我所要做的就是获取偏移量,将其添加到查找表条目的末尾,然后我就有了正确的地址。

    这是到达函数正确起始地址的代码。

    // Get the lookup table address
    const char* ptr = (const char*)&testhack;
    // Get the offset (+ 1 byte retrieved as a long)
    unsigned int offset = (unsigned int)(*((unsigned int*)(ptr + 1)));
    // Add to the original look up pointer, +5 (the offset starts after the
    //    end of the instruction)
    const char* tst = (const char*)(ptr + offset + 5);
    

    tst 则持有正确的地址!

    到目前为止,调用 ASM 指令将指向包含函数指针的结构的指针放入 EAX。通常,回调函数会重置 EAX。但是,我已经应用了这个 hack 并且 NOP 删除了那部分。函数内的第一行代码创建一个本地指针,然后内联汇编以将mov [ptr],eax 的地址插入到指针中。然后我可以正常使用指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 2019-06-03
      • 2011-06-14
      相关资源
      最近更新 更多