如何解释 IDA Pro 生成的这些代码?

Posted

技术标签:

【中文标题】如何解释 IDA Pro 生成的这些代码?【英文标题】:How do I interpret these codes generated by IDA Pro? 【发布时间】:2019-11-21 22:55:34 【问题描述】:

您好,感谢您抽出宝贵时间阅读我的问题。我一直在使用 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 检查什么?

非常感谢您的宝贵时间,

【问题讨论】:

如果没有上下文,这没有多大意义。您可能应该展示这些值是如何被使用的。 是的,很抱歉,这些值正准备传递给将这些数据发送到串行端口的 WriteFile 函数。 Some_Array 是字节缓冲区,Some_Condition 在 IfElse 语句中用于向字节数组添加内容。 没有上下文我们无法提供帮助。这只是一些我们一无所知的项目中的 5 行随机代码。逆向工程非常复杂,如果您要问这个问题,那么它可能超出了您的知识范围。 【参考方案1】:

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;

【讨论】:

你怎么知道这些东西?!所以基本上'Some_Word'是'Pointer_To_A_WORD'结构的成员(或类/对象?) 好吧。我已经忘记了我是怎么学会这些东西的。应该有多个解释这门科学的黑客教程。编译几行代码应用程序并在 IDA 中检查它也有帮助。此外,了解 c++ 编译器的工作原理也有助于解释 asm 代码和尝试反编译 IDA。 今天晚上我做了同样的事情,我尝试反编译我自己的 c++ 应用程序,我意识到了这些代码中的大部分。但是你指出的非常非常有帮助。

以上是关于如何解释 IDA Pro 生成的这些代码?的主要内容,如果未能解决你的问题,请参考以下文章

IDA Pro代码破解揭秘的内容简介

《恶意代码分析实战》-第五章 IDA Pro(含20种必备操作技能)

IDA PRO使用

ida pro静态分析

IDA Pro代码破解揭秘的编辑推荐

使用IDA Pro的REobjc模块逆向Objective-C二进制文件