我正在使用 IDA 来尝试了解特定的可执行文件是如何工作的。我发现了我对 IDA Pro 感兴趣的例程,这一切都非常有意义,因为我可以准确地看到过程按照我的预期进行。
但是,我非常困惑的是,我到达了例程的顶部,但找不到任何对它的引用调用。需要明确的是,这是一个可执行文件,没有导出函数——它实际上是一个 Windows 服务。
如果我右键单击并列出交叉引用,我只会在 rdata 中得到一行?有没有办法找到调用这个程序的东西?
我正在使用 IDA 来尝试了解特定的可执行文件是如何工作的。我发现了我对 IDA Pro 感兴趣的例程,这一切都非常有意义,因为我可以准确地看到过程按照我的预期进行。
但是,我非常困惑的是,我到达了例程的顶部,但找不到任何对它的引用调用。需要明确的是,这是一个可执行文件,没有导出函数——它实际上是一个 Windows 服务。
如果我右键单击并列出交叉引用,我只会在 rdata 中得到一行?有没有办法找到调用这个程序的东西?
除了调试它并在 vtable/vfunction 上添加硬件断点之外,这可能会给您一些额外的信息。这是否足够,或者它是否会在这种情况下起作用,我不能说。
安装并运行Class Informer插件。
转到您提到的那个外部参照,然后向上滚动直到到达 vtable 的开头。请注意,它实际上可能不是虚拟函数,在这种情况下,您只需向上滚动无穷无尽的偏移量列表,这些步骤将无济于事。
.rdata:0000000141A0E088 ; const BonusEventHttpTask::`vftable'
.rdata:0000000141A0E088 ??_7BonusEventHttpTask@@6B@ dq offset HttpTask__m_0
.rdata:0000000141A0E090 dq offset return_null
.rdata:0000000141A0E098 dq offset HttpTask__m_10
.rdata:0000000141A0E0A0 dq offset HttpTask__m_18
.rdata:0000000141A0E0A8 dq offset return_1
.rdata:0000000141A0E0B0 dq offset return_0
.rdata:0000000141A0E0B8 dq offset return_0
...
单击作为 vtable 名称的损坏名称,在本例中它是 ??_7BonusEventHttpTask@@6B@
查看外部参照(按X)
您通常应该会看到大约 2 个外部参照,它们用于构造函数和析构函数。
查看两个/所有外部参照,如果幸运的话,您会看到如下所示的内容,尽管第一个参数很可能是__int64. 您可以UnknownStruct*通过选择a1,按下Y并键入来将其更改为(包括在下面)UnknownStruct*
CPickupPlacement *__fastcall CPickupPlacement::__construct(CPickupPlacement *a1,
int a2, Vector4 *position, Vector4 *rotation, int a5, int a6)
{
// ...
pPickupPlacement->__vftable = &CPickupPlacement::`vftable';
//...
return pPickupPlacement;
}
//...
v14 = pPickupPlacement ? CPickupPlacement::__construct(pPickupPlacement, a2, a1, a3, a4, a8) : 0i64;
// ...
qword_140000000 = v14;
// ...
如果您很幸运并且确实如此,您可以查看所有外部参照qword_140000000并获得一些正在调用您的虚拟函数的函数的列表。如果你不太幸运,你将不得不继续关注这些函数(通过外部参照),并希望你确实找到一个被分配给类似于上述点的“全局”变量的函数实例(呻吟)。
根据您的发现,可以采取进一步的步骤,但我认为这足以让您朝着正确的方向前进。
这是第UnknownStruct5 点中引用的定义。打开“本地类型”并按下Ins然后粘贴:
struct UnknownVtable {
void* Function[1024];
};
struct UnknownStruct {
UnknownVtable* vtable;
__int64 qword[1024];
};