Hex-Rays 反编译器:堆栈上的缓冲区

逆向工程 艾达 硬件 反编译器 司机 六线谱
2021-06-20 04:51:30

我目前正在反转 Windows 驱动程序,以便为 DVB 卡编写 Linux 兼容的驱动程序,但我遇到了一个我可以解决的小问题,但如果可能的话,我想让它更正。

有一个函数,该函数的一部分将 256 字节的 PCI 配置空间读入已在堆栈上分配的本地缓冲区。反编译显示输出为:

unsigned __int16 configSpaceBuffer[128];

.... SNIP ...

configSpace->vtable->tmRegisterAccess_ConfigSpace__tmIGetReg(
        configSpace,
        &address,
        4,
        configSpaceBuffer,
        256u,
        0)

 _this->field_4A = v74;
 _this->field_4C = *(unsigned __int16 *)configSpaceBuffer;
 _this->field_4E = v75;
 _this->field_50 = v77;
 _this->field_52 = v76;

是否可以修复检测到的函数变量以显示以下内容?

 _this->field_4A = configSpaceBuffer[0];
 _this->field_4C = configSpaceBuffer[1];
 _this->field_4E = configSpaceBuffer[2];
 _this->field_50 = configSpaceBuffer[6];
 _this->field_52 = configSpaceBuffer[8];
1个回答

我找到了解决方案。双击变量名称(configSpaceBuffer在本例中),它会显示该方法的堆栈窗口,您可以在其中取消定义无效变量,然后将其定义为数组。

这是更改后的输出:

      _this->ConfigSpace1 = configSpaceBuffer[1];
      _this->ConfigSpace0 = configSpaceBuffer[0];
      _this->ConfigSpace4 = LOBYTE(configSpaceBuffer[4]);
      _this->ConfigSpace23 = configSpaceBuffer[23];
      _this->ConfigSpace22 = configSpaceBuffer[22];