1.文件类型分析
逆向分析的第一步就是文件类型分析
文件使用什么写的 使用什么编译器编译的
是否被加密过
然后才能进入下一步
有很多工具可以进行分析
我选择exeinfo来查看
但是并不是工具就可以直接分析完成
因为有些会存在欺骗
把入口代码改造成和Visual C++ 6.0类似的代码
就可以对该类软件进行欺骗
2.静态反汇编
先对程序进行检测工具查看是否加壳
如果加壳 先进性脱壳再反汇编
我们这里使用IDA Pro来进行静态反汇编的演示
取得随书文件 ReverseMe.exe
查壳
发现没有加壳 并且是32位的 我们放入32位的ida
IDA是通过区块加载PE文件的
例如
.text 代码块
.data 数据块
.rsrc 资源块
.idata 输入表
.edata 输出表
等
我们思索ida的分析过程
两个阶段
第一阶段:
将程序的代码和数据分开 分别标记函数
并且分析其参数调用、分析跳转、调用等指令 并且赋值
第二阶段:
如果ida能识别文件的编译类型 就装载对应的编译器特征文件
给各个函数赋名
然后 ida会创建数据库,他的组名分别保存在
.id0 .id1 .nam .til 四个文件中
如果我们关闭进程 就会保存为一个 IDB文件
ida一旦创建了数据库 就不需要重新访问可执行文件
除非需要动态调试
我们只需要打开数据库 就可以访问我们之前调试的进程
"kernel potion1" "kernel potion2" "processor potion"
是可以控制反汇编引擎工作状态的,一般是默认的
ida会自动识别程序类别和处理器类型
如果ida的代码分析出现问题
就把 kernel option2的 make final analysis pass 关闭
某些情况 会因为代码不在预计位置而不被确认
选中 kernel opinion2的 Coagulate Data Segments in the final pass 即可
2.ida的配置
我们如果只是想 更改一次
在主程序界面的 Options选项修改即可
但是我们如果想一次性修改默认 就需要编辑 ida.cfg文件才可以
并且我们不能使用 记事本 因为有一些无法读取 会破坏文件
应该使用 EditPlus等软件
ida.cfg
ida.cfg由两个部分组成
第一部分是定义文件的扩展名、内存、屏幕等
第二部分是配置普通参数
例如代码显示格式等
反汇编选项(Disassembly)
这个选项直接控制反汇编窗口的显示
在 options->General->Disassembly可以配置
我们也可以在ida.cfg中配置
ASCII字符串和符号(ASCC strings & names)
3.ida的主窗口
一.反汇编窗口
有两个方式 图形视图(默认)和文本视图
图形视图的时候
是以程序流程图的形式显示代码
将函数分成很多基本块
可以生动的显示函数的跳转和逻辑判断
我们可以使用空格来实现 图形文本视图的切换
或者 右键->Text view
当我们需要两个的时候
View -> Open subviews-> Disassembly 打开反汇编子窗口
这样就可以用多个窗口来分析
其他常用的窗口 "Functions" "Proximity browser"也可以打开
二.导航栏
View->Toolbars -> Navigation 可以打开导航栏
这里是可以看到线性视图
在右键-> Zoom in 和Zoom out 可以调整显示倍率
三.注释
右键 ->Enter comment(:)/Enter repeatable(;)
';' 是在所有交叉参考处都会出现
':' 只出现在该处
如果一个地址有两个注释 就只会显示 非重复注释
四.提示窗口
IDA界面下面的提示窗口是IDA的输出控制台
用于反馈各种信息 例如 文件分析进度 状态消息 错误消息 ida脚本等
五.字符串窗口
View->Open Subviews->Strings
就可以打开字符串窗口
这里面是显示从二进制文件中提取的一组字符串
双击字符串 反汇编窗口就会调到字符串所在的地址
右键->Setup 可以设置扫描字符串的类型
六.输入窗口
输入窗口包含了所有函数
在输入窗口的每一条目都列出了一个函数名称和函数的库的名称
每一条目列出的地址都是相关函数的虚拟地址
虚拟地址可以写为“段:偏移量”的形式
双击函数可以调到反汇编窗口的函数地址
七.跳转到地址窗口
我们可以在反汇编窗口进行滚动
直到看到想要访问的地址
如果我们知道目标地址
可以使用IDA的跳转到地址窗口
快捷键 G
如果我们想要返回
点击 <- 即可 或者 按ESC
4.交叉参考(XREF)
例如这里
可以知道指令代码相互调用的关系
CODE XREF: sub_401120+B↑j
表示 该调用地址是 00401120h
j表示跳转
此外 这里 o表示是偏移量 offset
p 表示 子程序 procedure
双击 或者按 enter 可以跳转到调用该处的地方
同时 在 loc_401164 按 X 可以打开交叉参考窗口