前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >源码阅读SourceInsight与静态反汇编IDA Pro

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

作者头像
sofu456
发布2019-07-09 14:01:13
2K0
发布2019-07-09 14:01:13
举报
文章被收录于专栏:sofu456sofu456

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

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

代码语言: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(反汇编技巧)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年09月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.源码阅读SI
    • 1.1调用关系图(正向和方向关系调用)
      • 1.2 快捷键
      • 2.静态反汇编IDA
        • 2.1反汇编算法
          • 2.2 常用操作与快捷方式(IDA6.5.1版本)
            • 2.3 exe文件修改
              • 1.修改原则:
              • 2.修改方法:
            • 2.4 堆栈平衡
              • 2.5 反汇编技巧
                • 2.6入口函数OEP
                  • 几种语言的入口函数特征:
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档