您好,感谢您花时间阅读我的问题。我一直在使用 IDA Pro 来反编译一小段代码,该代码相当古老,是在 MFC (2003-2004( 中开发的。
我无法理解我一遍又一遍看到的以下说明:
_WORD *Some_Word;
_WORD *Some_Array;
Some_Word = Pointer_To_A_WORD + 0x4B6E;
Some_Array = Pointer_To_Char_Array + 18;
Some_Condition = *Some_Word & 0xFF03;
- 3号线和4号线的"+ 0x4B6E"和"+ 18">有什么意义?它们出现在我反编译的 c 代码中。
- 在第 5 行,Some_Condition检查什么?
非常感谢您的时间,
Pointer_To_A_WORD是指向对象实例的指针,0x4B6E是结构中某个字段的静态偏移量。 最有可能的是,它0x96DC在ASM代码中,IDA将其转换为0x4B6E。
您没有告诉 IDA ASM 代码引用带有 Pointer_To_A_WORD 的结构,因此它将其解释为 unit16 和位于索引 0x4B6E 处的元素数组。
所以它本质上是一些带有屏蔽非固定位的状态字段
some_status = arr[0x4B6E] & (SOME_MASK_1 | SOME_MASK_FIELD)
最有可能的是,您的代码检查是否设置了某些状态位
if(Some_Condition){
//then
}
如果您告诉 IDA 0x96DC偏移到结构中的字段,并且Pointer_To_A_WORD是指向结构的指针,那么它会将您的代码反编译为
DWORD required_bits = obj->some_status_field & 0xFF03;
同样的逻辑也适用于Some_Array 是的
uint8_t *some_field = &obj2->some_field;