您好,谢谢您抽出宝贵时间阅读我的问题。我一直在使用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;
非常感谢您的宝贵时间,
答案 0 :(得分:0)
Pointer_To_A_WORD是指向对象实例的指针,而0x4B6E是结构中某个字段的静态偏移量。很有可能是ASM代码中的0x96DC,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偏移struct中的字段,而Pointer_To_A_WORD是指向struct的指针,那么它将把您的代码反编译为
DWORD required_bits = obj->some_status_field & 0xFF03;
相同的逻辑适用于Some_Array 是
uint8_t *some_field = &obj2->some_field;