【问题标题】:IDA Pro, QT Nokia Library, dll call, what is it actually doing?IDA Pro、QT诺基亚库、dll调用,它到底在做什么?
【发布时间】:2011-05-30 12:26:51
【问题描述】:

我使用 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] [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;
}

【问题讨论】:

    标签: c++ visual-studio-2008 ida


    【解决方案1】:

    看起来它首先在一个表中查找某个 DLL 条目,该表返回一个结构,该结构似乎具有该 DLL 提供的函数列表。然后,它在可用函数列表中查找 Dll 条目结构,通过序号(将 Str1 视为 DWORD)或名称(在 Str1 上执行 stricmp)检查,然后可能返回它找到的函数指针。

    【讨论】:

    • jcopenha:我想我正在努力解决的概念是,好的,所以你有一个指向函数的指针,它如何帮助你从应用程序中获取信息,这就是这个 .dll有吗?
    【解决方案2】:

    似乎 v12 是某些执行 DLL 查找的类的实例。 sub_100010B3 似乎大致对应于 LoadLibrary 和 sub_10001115 到 GetProcAddress。 “this”是指调用C++方法时隐含的“this”对象实例指针。

    请参阅 my articletalk,了解 C++ 如何在底层工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      相关资源
      最近更新 更多