源码阅读SourceInsight与静态反汇编IDA Pro_怪力左手的博客-程序员秘密

技术标签: 驱动  静态反汇编  问题案例  sourceinsight  修改机械码  ida nop  

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/daoer_sofu/article/details/47381263

智能推荐

基于springboot+vue的公益慈善捐助网站(前后端分离)_猫头鹰源码(同名B站)的博客-程序员秘密

项目介绍:本系统为前后端分离,适合选题:前后端分离、公益、慈善、捐助等,系统采用springboot+vue整合开发,前端主要使用了ElementUI框架、项目后端主要使用了springboot等一系列框架,数据层采用mybatis。项目技术:后端:springboot,mybatis前端:ElementUI、js、css等开发工具:idea/vscode数据库:mysql 5.7JDK版本:jdk1.8功能概述:前台:登陆注册功能首页展示新闻,公益慈善项目以及捐助列表在

SpringMVC---- SpringMVC 简介_springmvc是什么_鑫709的博客-程序员秘密

目录1. 什么是springMVC?2. 请求流程3、开发步骤:4、SpringMVC组件:5、SpringMVC注解解析6、方法返回值7、跳转方式8、静态资源访问设置:1. 什么是springMVC?Spring Web MVC是一种基于Java的实现了MVC设计模式的、请求驱动类型的、轻量级Web框架,已经融合在 Spring Web Flow 中。相比于MVC,M就是模型model,主要用于数据封装和业务逻辑处理,而V是view,叫视图,主要用于数据

使用trim_galore软件遇到的问题_weixin_30594001的博客-程序员秘密

我的原始测序数据是双端测序,在用trim_galore软件去接头的这一步,使用的命令行是time nohup trim_galore R17002628-SKOV3-m6A_combined_R1.fastq.gz R17002628-SKOV3-m6A_combined_R2.fastq.gz &相当然的以为软件会默认为双端测序,结果接下来一步用tophat软件mappi...

java 给两个类的相同属性赋值_两个类属性一样的赋值_读月的博客-程序员秘密

工具类如下public class ClassReflection { /** * @param class1 用于赋值的实体类 * @param class1 需要待赋值的实体类 * 描述:反射实体类赋值 */ public static void reflectionAttr(Object class1,Object class2) throws Exception{ Class clazz1 = Class.forName

如何学习前端知识?优秀的前端开发工程师应该具备什么条件?_.谈一谈对前端开发的理解,需要具备哪些知识和技术?你擅长哪方面?_jinmu520的博客-程序员秘密

Web前端开发技术主要包括三个要素:html、css和JavaScript!如何学习前端知识?我们生活在一个充满规则的宇宙里面。社会秩序按照规则运行,计算机语言几乎全部是规则的集合。计算机前辈们定义规则,规则约束我们,我们用规则控制数据。大部分时候,对数据的合理控制,来自于你对规则的掌握。学习 html,css应该先跟着书仔细、扎实的学一遍。然后就需要做大量的练习,做各种常规的、奇怪的、大量的布局练习来捆固、理解自己的知识。而学习 JavaScript首先要知道这门语言可以做什么,不能做什么,擅长

UWB定位技术研究入门_ir-uwb信号怎么区分直射路径和反射路径_Jan___的博客-程序员秘密

一、UWB到底是什么?超宽带技术UWB(Ultra Wide Band,超宽带)是一种无线载波通信技术。即不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。UWB是利用纳秒级窄脉冲发射无线信号的技术,适用于高速、近距离的无线个人通信。按照FCC的规定,从3.1GHz到10.6GHz之间的7.5GHz的带宽频率为UWB所使用的频率范围。从频域来看,超宽带有别于传统的窄带和宽带,它的频带更宽。窄带是指相对带宽(信号带宽与中心频率之比)小于1%,相对带宽在1%到25%之间的被称

随便推点

如何用qt实现学生信息管理系统_IT_CREATE的博客-程序员秘密

源码资源:https://gitee.com/dxl96/qt_resource/blob/master/%E5%AD%A6%E7%94%9F%E4%BF%A1%E6%81%AF%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F.zipmainwindow.cpp#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <Q

股票python量化交易010-JQData财务指标_Johnny2004的博客-程序员秘密

认识财务报表财务指标数据这里说的财务指标数据是我们平时看到的股票市值,负债数据,现金数据,利润数据等一系统财务相关的值通过运算生成的一份财务指标数据,如EPS,ROE等 eps 每股收益EPS(元) 每股收益(摊薄)=净利润/期末股本;分子从单季利润表取值,分母取季度末报告期股本值。 roe 净资产收益率ROE(%) 归属于母公司股东的净利润*2/(期初归属于母公司股东的净资产+

better-scroll VS vue 纯干货_摇摇马骑骑的博客-程序员秘密

什么是 better-scrollbetter-scroll 是一个移动端滚动的解决方案,它是基于 iscroll 的重写,它和 iscroll 的主要区别在这里。better-scroll 也很强大,不仅可以做普通的滚动列表,还可以做轮播图、picker 等等。better-scroll 的滚动原理不少同学可能用过 better-scroll,我收到反馈最多的问题是

单链表的快速排序算法及其实现_philonpang的博客-程序员秘密

今天听同学面友录说道单链表是否可以用快速排序算法,想起自己面百度一面的时候面试官也面到这个问题,由于本人是个小菜鸟,所以花了一个下午的时间整理了一下。算法思想:对于一个链表,以head节点的值作为key,然后遍历之后的节点,可以得到一个小于key的链表和大于等于key的链表;由此递归可以对两个链表分别进行快速。这里用到了快速排序的思想即经过一趟排序能够将小于key的元素放在一边,将大于

matlab listbox 操作,列表框(ListBox) 常用的的操作详解 | 求索阁_weixin_39525812的博客-程序员秘密

1. 添加数据:声明控件变量的类别为Control,变量类型为CListBox,变量名为m_ListBox_Content.m_ListBox_Content.AddString(_T("123"));m_ListBox_Content.AddString(_T("汉字"));m_ListBox_Content.AddString(_T("English"));m_ListBox_Content....

Java 常识(013):Java中的super关键字_IT码客的博客-程序员秘密

文章目录1、Java 中 super 是什么2、为什么要用 super 关键字3、Java 中 super 的用法3.1、使用 super 调用父类的构造方法3.2、引用父类实例变量3.3、调用父类方法4、super 关键字与 this 关键字的区别1、Java 中 super 是什么java中的super关键字是一个引用变量,用于引用直接父类对象。每当创建子类的实例时,父类的实例被隐式创建...

推荐文章

热门文章

相关标签