如何恢复结构域

逆向工程 艾达 C++ 反编译 结构
2021-06-17 10:36:42

我有一个名为的对象ComputeService::RPC,它被用作二进制文件内函数的输入:

__int64 __fastcall ComputeService::Rpc::GetClientProcessId(ComputeService::Rpc *this)  
pc *this)
{
  unsigned int v1; // ebx
  int RpcCallAttributes[32]; // [rsp+20h] [rbp-98h] BYREF

  v1 = -1;
  memset_0(RpcCallAttributes, 0, 0x78ui64);
  RpcCallAttributes[1] = 16;
  RpcCallAttributes[0] = 3;
  if ( !RpcServerInqCallAttributesW(0i64, RpcCallAttributes) )
    return (unsigned int)RpcCallAttributes[16];
  return v1;
}

* 我使用 IDA 中的伪代码来提取这些信息。

我去了“本地类型”的窗口,它显示它是一个,struct但就是这样。
在此处输入图片说明

有没有办法检查里面的字段是什么struct

2个回答

IDA 知道由于包含对它的引用的损坏名称而存在struct命名ComputeService::RPC- 例如,您的问题中显示的函数的损坏名称。但是,IDA 没有struct声明,所以它创建了一个空的struct——你可以这么说,因为该条目的描述字段只是简单地说struct如果 IDA 可以访问struct声明,您会在第二个屏幕截图中看到它。

所以简短的回答是:不,您似乎没有访问struct声明的权限(例如,从具有完整类型信息的 PDB 文件),否则 IDA 将已经创建它。你将不得不自己重建它。但是,您可能还想查看Ghidra 10.0 针对此类情况的新功能

脚本。添加了原型 RecoverClassesFromRTTIScript 并使用 RTTI 信息来增强 Ghidra 对类层次结构、类成员函数类型(构造函数、析构函数、删除析构函数、克隆)和类成员数据的了解。该脚本将标记成员函数并将其放入正确的类命名空间,并应用使用 PDB 信息(如果可用)或反编译器 pcode 信息创建的新类结构。(GP-339)

有没有办法检查这个结构中的字段是什么?

旧时尚的方式。沿着该指针在整个装配体中四处走动,看看使用了哪些偏移量以及如何使用。如果你能找到它的创建位置,你就可以知道它的总大小。如果您可以实时调试程序,则可以设置观察点并查看实际放入每个偏移量中的数据。在每个偏移处操作的“对象”的大小以及它们的使用方式可以让您了解它们是什么。如果你真的很幸运,有些会被传递给系统调用、操作系统 API 或其他有据可查的函数,这样你就可以查找预期的参数。

如果你打算这样做,你需要刷新结构 padding/packing如果RTTI是虚拟类或曾经用作异常的一部分,您可能能够找到它,这会给您更多提示。