我们已经讨论过使用反汇编或本地类型来创建结构,但在反编译器中也有一种方法,特别是在处理程序使用的未知自定义类型时。当你看到代码以不同的偏移量解引用一个变量时,很可能这是一个结构指针,函数正在访问它的不...
IDA技巧(119)强制调用类型
在处理已编译的二进制代码时,反编译器缺乏源代码中存在的信息,比如函数原型,因此必须猜测或依赖用户提供的信息(这时其交互功能就显得很有用)。一个特别棘手的情况是间接调用:在没有确切的调用目标信息时,反编...
一种基于unicorn的寄存器间接跳转混淆去除方式
重新梳理一遍加固,从寄存器间接跳转开始学起吧。寄存器间接跳转的基本概念寄存器存储地址:寄存器间接跳转依赖于寄存器内的值来指定要跳转到的地址,而这个地址可以在程序运行时动态改变。跳转指令:在汇编语言中,...
IDA技巧(108)伪代码中的原始内存访问
有时候在伪代码中,你可能会遇到看起来很奇怪的代码:代码似乎在解引用一个名为MEMORY的数组,并且用红色高亮显示。然而,这个变量在任何地方都没有定义。它是什么呢?这种表示法是反编译器在代码访问数据库中...
IDA技巧(106)函数外联
IDA 8.0 的发布说明中提到了函数外联。那么什么是函数外联,以及如何在IDA中处理它们呢?函数外联是一种优化技术,通过识别重复出现的机器代码序列,并用调用包含这些操作序列的新函数来替换每个实例,从...
IDA技巧(107)多重返回值
Hex-Rays反编译器最初是为了解析C代码而创建的,因此其伪代码输出主要使用C语法。然而,输入的二进制文件可能是用其他语言编译的:C++、Pascal、Basic、ADA等。虽然大多数代码可...
JADXecute:用于动态反编译器操作的 JADX-gui 脚本插件
JADXecute JADXecute是JADX 的一个插件 ,它通过添加 动态代码执行 功能来增强其功能。 使用 JADXecute,您可以动态运行 Java 代码来修改或打印 jadx-gui ...
IDA技巧(102)反编译重置反编译器信息
在处理伪代码时,你可能会对其进行各种更改,例如:添加注释重命名局部变量并更改其类型折叠代码块映射变量标记可跳过的指令拆分表达式调整可变参数选择联合体成员等等如果某些操作的结果看起来不太理想,你总是可以...
IDA技巧(101)反编译可变参数函数调用
可变参数函数是指根据调用者需要接受不同数量参数的函数。典型的例子包括C和C++中的printf和scanf,但也有其他函数,甚至一些自定义函数(特定于正在分析的二进制文件)。由于每次调用可变参数函数时...
IDA技巧(87)函数块和反编译器
我们讨论了函数块,今天我们将展示一个如何在实践中使用它们来处理常见编译器优化的例子。共享函数尾部优化在处理一些ARM固件时,你可能会遇到以下情况:我们对sub_8098C的反编译以一个奇怪的JUMPO...
IDA 技巧(83) 反编译器选项:默认基数
我们之前已经讨论过主要的伪代码格式选项,但还有一个选项可以影响输出,那就是用于打印伪代码中数字的基数。★在位置计数系统中,基数或底数是用于表示数字的唯一数字的数量,包括数字零。例如,对于十进制/十进制...
IDA 技巧(82) 反编译器选项:伪代码格式化【文末抽奖】
Hex-Rays 反编译器的默认输出在简洁性和可读性之间寻求平衡。然而,每个人的偏好不同,因此它提供了一些选项来控制伪代码的布局和格式。访问选项由于其作为 IDA 第三方插件的起源,反编译器选项不是通...