有一个函数,其中一部分将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