1.源码阅读SI
1.1调用关系图(正向和方向关系调用)
Sourceinsight可以方便的查看函数调用关系,点击图标
打开如下:
点击函数的末尾可以展开下一级调用关系,如上图鼠标弹出”加号“的位置。调用关系图,右键可以设置查询的关系:
for types:查看变量类型关系设置
for functions:查看函数调用关系或索引关系
for variables,constants:查看变量值
for classes:查看类调用关系或继承关系
for files:查看文件调用关系
1.2 快捷键
Ctrl O:打开工程文件窗口
Ctrl ?:搜索内容窗口
Shit F8:高量标记变量或函数
Shit F9:搜索结果中,往前遍历查询结果的文件索引
Alt L:只有焦点处于代码文本窗口中时,可以是焦点快捷地调到左边的名称空间窗口
2.静态反汇编IDA
2.1反汇编算法
a.线性扫描反汇编:无法将嵌入的数据和代码区分开
b.递归下降反汇编:无法处理间接代码路径(如利用指针表来查询目标地址的跳转和调用)
2.2 常用操作与快捷方式(IDA6.5.1版本)
名称:sub_xxxx:地址xx子例程 loc_xxxx:地址xx指令 byte_xxxx:位置xx8位数据 unk_xxxx:位置xx大小未知数据
节:idata:函数导入段 edata:函数导出段 data:数据段 rdata:资源段
1.Num ”-“或” “ 图形视图和代码视图切换(6.5版本,5.5版本使用space空格切换)
2.Ctrl s 段跳转 Ctrl P 函数跳转 Ctrl E 跳转到函数入口点
3.Shift F3 函数名窗口 Shift F4 所有名称空间窗口 Ctrl X交叉引用(函数和数据交叉引用,交叉引用:引用其他位置的显示,Data Xref注释处)
4.代码调用关系,菜单栏结构图
5.text view和graph view(单个函数的流程图) 代码跳转关系
6.ESC 回退查看 Ctrl Enter 前进查看
7.F5插件 可以翻译汇编代码成pseudocode(伪代码)C语言版 -----使用IDA5.5版本较稳定
8.IDA加载过程出现oops错误,需要安装python 2.6版本
9.text view 模式,粗虚线:循环,细虚线:条件跳转,实线:非条件跳转,红线:同一函数内
10.Alt T 搜索字符串
11.菜单view->open subviews->cross renferences和function call视图 (alt num切换tab) function call和反汇编窗口组合查看阅读代码
12. Alt M标记---->Ctrl M跳转到标记处
13.IDA 不能确定函数分散到各个段里的函数边界,所以有sub_XX和.text的跳转
函数通过function call联系
.text这种分散的函数片段可以通过cross renferences确定
14.F1 IDA帮助文档查看INC脚本内部提供的系统函数编写脚本
2.3 exe文件修改
1.修改原则:
单条指令替换
retn返回的 call指令 ------->>替换 nop(0x90)
retn XX返回的 call指令 ---------->>替换 add esp XX
替换所有指令保持栈平衡
push、retn和retn XX call指令 ------------->>替换 nop(0x90)
汇编函数返回值:ret 前赋值给 EAX,数据过大高位存在EDX,再大指针
2.修改方法:
直接修改机械码,可能导致两条nop语句之间的汇编代码对应的机械码发生变化,使用如下操作修改
IDA->Options->General->设置opcode byte机器码显示
IDA配置文件cfg目录下的idagui.cfg,修改DISPLAY_PATCH_SUBMENU=YES,重启ida可以看到Edit->Patch Program->assembly
使用IDA查找到代码对应的16进制码,在UtrlEdit下查找后,使用以下原则进行全指令替换
2.4 堆栈平衡
call调用前,需要压栈参数,出栈需要弹出堆栈内所有数据,retn xx 或 ret后调用处add esp xx平衡,类似prinf函数参数数量不可确定,需要出栈时调整esp
(rop攻击:面向返回值的错误跳转攻击)
2.5 反汇编技巧
1.阅读反汇编时,数据最好从初始化源头追踪,如窗口句柄需要查看createwindow函数,否则很难以阅读
2.lea offset 函数,push入函数代表回调函数;如果在定义在数组里,数组首地址调用处,可能是事件循环
3.反编译工具未能识别的函数,以.text块跳转 (可以载入pdb文件导入本模块的符号表,需要设置pdb.cfg)
4.for、while循环:jmp无条件回跳的代码
if条件判断:cmp等标志寄存器控制 和 跳转命令
结构体:dword ptr 表明[]字寻址、双字寻址或字节寻址,其中Dword Ptr可能是4字节指针
switch:连续多处调转
2.6入口函数OEP
几种语言的入口函数特征:
代码语言:javascript复制 C 的入口函数GetVersion
汇编的入口API函数 GetModuleHandleA
DELPHI入口特征 GetModuleHandleA
易语言入口API函数 GetVersion
VC8入口特征查找 GetStartupInfoW
VB入口特征查找函数 ThunRTMain
2.7反汇编基础(16位AX、32位EAX、64位RAX)
AX 累加寄存器 (除法和函数返回值中隐含使用,数据过大DX辅助) CX 记数寄存器 (循环中隐含使用)
SI、DI 基址变址寄存器 SP、BP、IP 指针寄存器
C 入口函数在link配置里面可修改
关注call和jmp、lea(move offset),结构体和类反汇编相同
参考:
1.《IDA Pro权威指南 (第2版)》
2. http://blog.csdn.net/chenyujing1234/article/details/7766639
3.http://www.doc88.com/p-774671348081.html 博客实例
4.http://www.pediy.com/kssd/pediy12/142766.html 读书笔记
5.http://bbs.pediy.com/showthread.php?t=160887 连连看新人外挂入门
6.http://ajiannet.cnblogs.com/游戏外挂
7.http://www.eefocus.com/book/09-05/740251276059759.html汇编指令入门
8.http://blog.csdn.net/chinabinlang/article/details/19476941
9.http://www.cnblogs.com/jack204/archive/2011/12/02/2271884.html(反汇编技巧)