我目前正在反转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];


评论


您甚至不需要取消定义无效变量。一旦告诉IDA field_4A是一个数组,它将自动删除无效变量。

–詹森·格夫纳(Jason Geffner)
2013年9月5日13:42