我们讨论了函数块,今天我们将展示一个如何在实践中使用它们来处理常见编译器优化的例子。共享函数尾部优化在处理一些ARM固件时,你可能会遇到以下情况:我们对sub_8098C的反编译以一个奇怪的JUMPO...
IDA 技巧(83) 反编译器选项:默认基数
我们之前已经讨论过主要的伪代码格式选项,但还有一个选项可以影响输出,那就是用于打印伪代码中数字的基数。★在位置计数系统中,基数或底数是用于表示数字的唯一数字的数量,包括数字零。例如,对于十进制/十进制...
IDA 技巧(82) 反编译器选项:伪代码格式化【文末抽奖】
Hex-Rays 反编译器的默认输出在简洁性和可读性之间寻求平衡。然而,每个人的偏好不同,因此它提供了一些选项来控制伪代码的布局和格式。访问选项由于其作为 IDA 第三方插件的起源,反编译器选项不是通...
IDA 技巧(75) IDA 中使用联合体
在C语言中,联合体是一种类似于结构体的类型,但其所有成员(可能是不同类型)共享同一块内存,彼此重叠。它们被用于需要以不同方式解释相同数据的场合,或者在存储不同类型的数据时节省内存(这在脚本引擎等中很常...
IDA 技巧(71) 反编译为调用
尽管 Hex-Rays 反编译器最初是为处理编译器生成的代码而编写的,但它在处理手写汇编时也能表现得不错。然而,这类代码可能会使用非标准指令或以非标准方式使用它们,这种情况下,反编译器可能无法生成等效...
修复反编译器中的错误地址引用
最近常常遇到一个反编译的问题,当反编译没有高级元数据的代码(尤其是固件)时,你可能会看到看起来很奇怪的地址表达式(如上),这些表达式似乎没什么意义。这些是什么/如何修复/改进伪代码?因为在CPU级别上...
IDA 技巧(67) 反编译器辅助工具
我们之前已经描述过自定义类型在反编译代码中的使用,但你可能还会遇到一些类似函数调用的不寻常关键字。它们被反编译器用来表示无法映射到优雅C代码的操作,或者只是为了使输出更紧凑。它们列在反编译器提供的de...
IDA 技巧(66) 反编译器注释
当你在反编译器中处理伪代码时,可能会注意到变量声明和提示中有一些内容略显神秘的注释。那么它们是什么意思呢?Image虽然有些注释的含义显而易见,但有些则不那么明显,还有一些仅在罕见情况下出现。变量位置...
IDA 技巧(60) IDA 的类型库
类型库是为特定平台和编译器收集的高层次类型信息的集合体,可供IDA和反编译器使用。类型库可能包含:函数原型,例如:void *__cdecl memcpy(void *, const void *Sr...
IDA 9.0 发布:逆向工程领域迎来重大的新功能
IDA的许可机制经历了重大变革,现在许可证不再受平台限制,可以在Windows、Linux和macOS之间通用。多种反编译器包可供选择,其中包括新的IDA Home RISCV,取代了已退役的IDA ...
用ghidra中的列表修补程序中的bug
有了完整的多架构反编译器,很容易理解为什么我的许多学生会直接跳过列表视图,使用反编译器插件。反编译器中的类 C 代码对大多数人来说比列表视图中更神秘的汇编指令更加熟悉。然而,一名强大的逆向工程师必须在...
IDA 技巧(45) 反编译器生成的数据类型
反编译器生成的数据类型在之前的一篇文章中,我们讨论了如何编辑伪代码中使用的函数和变量的类型。在大多数情况下,您可以使用标准 C 类型: char、int 、long 等等。但是,在某些情况下,您可能需...
4