源码阅读SourceInsight与静态反汇编IDA Pro

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 renferencesfunction 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

几种语言的入口函数特征:

              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(反汇编技巧)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券