【加密与解密】第三章②
AsmJit
一个以C++封装的完整的JIT汇编器和编译器,生成兼容x86和x64架构的原生汇编指令。
它与之前的开源库并不一样,他只是一个汇编器,与别的汇编方式也不同,有个例子。
可以见得指令都被封装成了类成员函数,通过调用函数的方式来编码。参数可以使用寄存器,内存操作数,也可以用占位符变量,根据不同的逻辑给这些占位符变量赋值不同的操作数。
上面的例子用的是x86 assembler,还有更高层的x86 compiler(assembler可以看成汇编程序,是基础,而compiler对之进行封装是编译器,引入函数,参数,局部变量,局部空间等类型的定义方式。可通过栈堆,寄存器分配等方式转换成低级别的形式)
它作为有一个汇编器和编译器,可以做出功能强大代码简洁的产品。
Keystone
与capstone是同一系列引擎。cap负责跨平台多指令集反汇编,key负责跨平台多指令集汇编工作。与cap一致,只支持文本汇编,不想ASMJIT那样函数式汇编。
优缺点也和capstone相似,因为进行了很多额外的操作,所以显得臃肿,如果产品需要ARM指令集,key可能是唯一的方便的开源库。
小结
进行了一些比较
静态反汇编
本节介绍常用的反汇编工具机器用法(上一节讲的是引擎)进行反汇编前,先分析检测是否加壳,进行16章的脱壳技术脱壳,在进行反汇编。常用的是IDA PRO属于专家级产品,逆向必备。
IDAPRO简介
是一款交互式反汇编工具,功能强大操作复杂。特性是交互和多处理器。IDA不自动解决程序的问题,但会按用户的指令找到可疑之处。
IDA安装好后会有32和64版本。它支持的文件类型也很丰富,除了常见的pe格式,还支持DOS,Unix,Mac,java,.net等平台的格式。ida也会自己识别。
IDA按区块装载PE文件,例如.text代码块,.data数据块.rsrc资源块.idata输入表edata输出表。ida所消耗时间与复杂程度有关。过程分为两个阶段,一阶段中,将程序代码和数据分开,分别标记函数分析参数调用,分析跳转,指令关系等。第二阶段,若IDA能识别文件编译类型,就能装载对应的编译器特征文件,然后给各个函数赋名。随后创建一个数据库,组建保存在.id0.id1.nam.til这四个文件,关闭ida时,四个文件会存档进一个idb文件。一些tips如下
ida配置
合理配置ida文件可以大大提高效率。如果在options菜单配置ida,则仅对当前有效,新建项目时会恢复配置。要想改变默认配置,需要编辑ida.cfg。用不了记事本编辑,建议editplus,ultraedit等工具配置。
ida.cfg有两部分,一部分定义文件扩展名,内存,屏幕。第二部分配置不同参数比如代码显示格式等等。
1.反汇编选项
这个选项直接控制反汇编窗口的代码显示格式。项目较多,图片如下。
2.ascii字符串与符号
3.显示中文字符
从7.0开始支持中文字符串显示,但需要配置ida.cfg。需要在IDA\CFG目录下新建一个Chinese.clt,内容如下。
IDA主窗口
1.反汇编窗口
有两种形式,分别是图形视图(默认)和文本视图。图形视图中,ida以程序流程图形式显示代码,将函数分解成许多基本块。可以用ctrl+滚轮调整图形大小,空格键可以使图形试图和文本视图之间切换。view-》open subviews-》disassembly可以打开反汇编子窗口,使用多个子窗口来分析同一段代码。
2.导航栏
打开导航栏可以看到加载文件地址空间的线性视图,如图所示。
library function为库函数,data为数据,regular function为规则函数,unexplored为未查过的,instruction为指令,external symbol为外部符号。
3.注释
ida可以允许用户在代码后面输入注释。注释分为“:”enter comment只在注释处出现。“;”enter repeatable comment是在所有交叉参考处出现。如果一个地址有两种注释,只显示非重复注释。