gpt4 book ai didi

c++ - 在不调试正在运行的程序的情况下弄清楚对象的内存布局?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:12:07 25 4
gpt4 key购买 nike

我正在对一个程序进行逆向工程。我正在使用 IDA Pro 和 Hex-Rays Decompiler。我遇到了一大块代码,我知道有一个对象并且有一个对该对象的方法调用,但它以我无法弄清楚的方式显示。例如:

 if ( (*(*interfacePtr + 24))(interfacePtr, &v23) >= 0 )

我在这里知道 interfacePtr 指向一个 ICLRRuntimeHost 对象。 (C++、.NET CLR 运行时)但是....我不知道 *(*interfacePtr + 24) 是什么。我知道这是一种方法,但我如何找出位于 +24 的内容?

最佳答案

类的虚表只是函数指针的列表。它为每个虚函数包含一个指针,顺序为:非常非常顶级的基类,下一个基类,它的子类,。 . .大多数派生类。

例子:

struct A {
virtual ~A() {}
virtual void foo() = 0;
}
struct B : public A {
virtual void foo() { // do something }
virtual void bar() { // do something else }
}

B 的 vtable 将按以下顺序包含:

  • ~A
  • 酒吧

(A 的那些必须先出现,这样相同的 vtable 可以被具有指向该对象的 A 类型指针的部分代码使用;该代码不知道底层对象实际上是 B .)

如果您正在查看 32 位源代码,指针是 4 个字节,所以 24 = 4 * 6,您正在查看第 7 个虚函数(索引从 0 开始)。如果你在 64 位上,指针是 8 个字节,所以 24 = 8 * 3,你正在寻找第 4 个。实际上,我没有使用 IDA 的“转换为 C++”功能,所以 24 实际上可能是表中的第 24 个条目。

确认的简单方法:编写自己的程序。声明 ICLRRuntimeHost 类型的变量。调用您怀疑的函数(基于查看头文件并计数为 7 或 4,具体取决于位数,如果我误解了您的示例,则为 24)。查看生成的汇编代码,确认你的索引是否正确。 (我总是在那种事情上偏离一个,所以这将提供一个检查。)

关于c++ - 在不调试正在运行的程序的情况下弄清楚对象的内存布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11918796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com