C++ IDA Pro,QT诺基亚库,dll调用,它实际上在做什么?
我使用IDA Pro反转了一个dll。看看IDA生成的伪代码,我对QT库中的一组调用感兴趣,它是否试图找到函数的位置以便调用它们?我想尝试并重复正在发生的事情,但对IDA生成的代码有点困惑,有人能给我一些关于什么是真正必要的建议吗?我特别感兴趣的是在定义函数调用时使用“this”,因为我不太确定它的含义。谢谢C++ IDA Pro,QT诺基亚库,dll调用,它实际上在做什么?,c++,visual-studio-2008,ida,C++,Visual Studio 2008,Ida,我使用IDA Pro反转了一个dll。看看IDA生成的伪代码,我对QT库中的一组调用感兴趣,它是否试图找到函数的位置以便调用它们?我想尝试并重复正在发生的事情,但对IDA生成的代码有点困惑,有人能给我一些关于什么是真正必要的建议吗?我特别感兴趣的是在定义函数调用时使用“this”,因为我不太确定它的含义。谢谢 int v2; // eax@10 int v3; // eax@10 char v12; // [sp+14h] [bp-368h]@10 int v13; // [sp+20h
int v2; // eax@10
int v3; // eax@10
char v12; // [sp+14h] [bp-368h]@10
int v13; // [sp+20h] [bp-35Ch]@10
...
v2 = sub_100010B3((int)&v12, "QtGui4.dll");
v19 = sub_10001115((int)&v12, v2, "?rowsInserted@QListView@@MAEXABVQModelIndex@@HH@Z");
Buf2 = -1;
v21 = 21;
v24 = (unsigned int)v19 >> 24;
v23 = (unsigned int)v19 >> 16;
v22 = v19;
v3 = sub_100010B3((int)&v12, "QtCore4.dll");
v13 = sub_10001115((int)&v12, v3, "?endInsertRows@QAbstractItemModel@@IAEXXZ");
int __thiscall sub_10001115(int this, int a1, const char *Str1)
{
int v3; // eax@5
int v5; // [sp+0h] [bp-10h]@1
char v6; // [sp+4h] [bp-Ch]@4
int *v7; // [sp+8h] [bp-8h]@1
int v8; // [sp+Ch] [bp-4h]@1
v5 = this;
v7 = (int *)sub_10001470(this, *(_DWORD *)a1);
v8 = 0;
while ( *v7 )
{
if ( *v7 & 0x80000000 )
{
v6 = (*v7 & 0xFFFF) == (_DWORD)Str1;
}
else
{
v3 = sub_10001470(v5, *v7);
v6 = stricmp(Str1, (const char *)(v3 + 2)) == 0;
}
if ( v6 )
return sub_10001470(v5, *(_DWORD *)(a1 + 16)) + 4 * v8;
++v7;
++v8;
}
return 0;
}
int __thiscall sub_100010B3(int this, const char *Str1)
{
int result; // eax@2
int v3; // eax@4
int v4; // [sp+0h] [bp-8h]@1
int v5; // [sp+4h] [bp-4h]@1
v4 = this;
v5 = sub_10001090(this, 1);
if ( v5 )
{
while ( *(_DWORD *)(v5 + 16) )
{
v3 = sub_10001470(v4, *(_DWORD *)(v5 + 12));
if ( !stricmp(Str1, (const char *)v3) )
return v5;
v5 += 20;
}
result = 0;
}
else
{
result = 0;
}
return result;
}
int __thiscall sub_10001090(int this, int a2)
{
return sub_10001470(this, *(_DWORD *)(*(_DWORD *)(this + 4) + 8 * a2 + 120));
}
int __thiscall sub_10001470(int this, int a2)
{
int result; // eax@3
if ( *(_DWORD *)(this + 8) && a2 )
result = a2 + *(_DWORD *)(this + 8);
else
result = 0;
return result;
}
它看起来像是首先在表中查找某个DLL条目,该表返回一个结构,该结构似乎包含该DLL提供的函数列表。然后,它在Dll条目结构中查找可用函数列表,按序号(将Str1视为DWORD)或名称(在Str1上执行stricmp)进行检查,然后可能返回找到的函数指针。似乎v12是某个执行Dll查找的类的实例。sub_100010B3似乎大致对应于LoadLibrary,sub_10001115对应于GetProcAddress。“这个”是指调用C++方法时传递的隐式“这个”对象实例指针。
<>参见和关于C++如何在低级上工作。 jopHona:我猜我正在努力的概念是,好的,所以你有一个函数的指针,这有助于你从应用程序中获取信息,这就是DLL所做的吗?