IDA PRO 静态反汇编与OllyDbg动态调试实战技巧汇总

**********************************

案例一: 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程。

首先用文本编辑器写一个C++源程序名为StackFrame.cpp ,代码如下:

#include "stdio.h"

long add(long a, long b){    long x = a, y = b;    return (x + y);}

int main(int argc, char* argv[]){    long a = 1, b = 2;

    printf("%d\n", add(a, b));

    return 0;}

使用visual C++ IDE 对该源文件执行编译,汇编,链接一系列的操作后,最终生成的二进制可执行文件(PE格式)名为StackFrame.exe

回顾上述源码,main函数调用了标准C库函数printf打印信息,我们想要知道,

visual C++ 编译器是如何实现printf库函数的,并且StackFrame.exe采用的是静态链接还是动态链接,如果是后者,那么printf又调用了哪些位于动态链接库中的windows API函数?抑或是“动静”兼用?

要解答这些疑问,首先使用IDA PRO打开StackFrame.exe ,它会自动查找程序入口点,这是由编译器自动生成的启动代码,用于初始化我们编写的main函数执行前的环境,以及执行main函数退出后的收尾工作。

一般而言,只要反汇编的对象不是经过加壳或者插入了模糊代码,IDA PRO可以轻松识别程序入口点与main函数,这里为了简化分析流程,我们直接进入main函数的反汇编代码段,如下所示:

我们通过上面一系列的IDA PRO截图可以看到,地址 0x00404063处的call指令想要调用EnterCriticalSection函数,后者的地址尝试以call的操作数0x0040A018给出,但是这个地址处的值,即EnterCriticalSection函数的最终地址,需要操作系统加载器加载StackFrame.exe文件时才能确定,因此我们对磁盘上的文件反汇编时,无法确定动态链接库中函数的地址。

下面以PEview工具查看StackFrame.exe在磁盘上的“真实”面貌(而不是由IDA PRO “模拟”的运行时地址空间面貌)

之所以要先使用PEview工具,是因为后面的动态调试中,会与此处的信息对比,来加深理解程序在磁盘上与在内存中的异同。

使用PEview工具打开StackFrame.exe ,我们的重点是定位到PE文件中的导入表,因为无论是操作系统加载器,反汇编器,还是动态调试器,都依赖该表来解析导入的动态链接库与其中的函数。

我们尝试在原始PE文件中,计算并找出call ds:EnterCriticalSection 指令对应的字节序列,其实这没有想象中困难,而且在这里提出计算方法的原因是,后面会用同样的计算手法来判断Ollydbg中追踪到的EnterCriticalSection函数的实际地址,

该地址究竟属于kernel32.dll还是ntdll.dll?(因为有时Ollydbg给出的信息并不十分准确)届时会用到下面的计算方法。

首先,回到IDA PRO,打开StackFrame.exe的程序段窗口,如下所示:

前面指出,地址 0x00404063处的call指令想要调用EnterCriticalSection函数,因此计算 404063 - 401000 = 3063 , 3063 + 400 = 3463

3463这个值就是该指令字节码在StackFrame.exe的位置,下面验证: 



接下来,使用Ollydbg打开StackFrame.exe进行动态调试,我们的目标在于定位EnterCriticalSection函数的入口处,并且单步跟进,查看其中的机器码,然后使用PEview工具,以上面的计算方法,验证Ollydbg给出的该函数所属的动态链接库文件信息是否准确,如下截图所示:

上面验证了StackFrame.exe 在运行时调用的共享库函数,与它在磁盘文件上的导入表中描述的行为一致。

最后,我们验证EnterCriticalSection这个 windows API函确实位于ntdll.dll这个动态链接库中,作为本案例的结尾。

首先,可以访问微软MSDN站点,查找关于EnterCriticalSection函数的信息:

https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms682608(v=vs.85).aspx

最后总结一下:

stack.exe使用“部分”静态链接,其中多数的代码为库代码,

这包含由“编译器库”添加的,处理程序初始化的启动代码与程序退出善后的结束代码,

以及程序中调用的库函数,如printf等函数的代码。

由于 printf 函数需要在屏幕打印信息,涉及更底层的系统I/O操作,因此它需要调用封装这些系统功能的 windows API 函数,

除了windows API 函数所在的DLL(kernel32.dll,ntdll.dll)作为动态链接库在运行时加载以外,

所有其它被调用函数的二进制目标代码都被链接器复制一份副本,然后链接到最终的可执行文件stack.exe中,

因此,stack.exe包含的库代码数量远多于程序员自行编写的代码数量。

使用静态链接的程序,很容易通过IDA PRO的全局函数调用拓扑图识别出来,如下所示:

上面只是抛砖引玉,类似的将IDA PRO,Ollydbg,PEview,甚至WinHex,PEiD等工具结合起来应用,交叉验证的例子不胜枚举,通过熟练使用这些工具,不仅能提高逆向工程的效率与准确度,更重要的是,我们对处理器指令集体系结构,操作系统内存管理,以及动态链接的机制,编译器,链接器的运行原理等等系统底层机理的认识又提升了一个档次。

最后,限于个人知识水平有限,文中若有错误以及误导之处,还请提出指正,不胜感激。

转载于:https://blog.51cto.com/shayi1983/1613615

IDA PRO 静态反汇编与OllyDbg动态调试实战技巧汇总相关推荐

  1. [系统安全] 二十三.逆向分析之OllyDbg动态调试复习及TraceMe案例分析

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  2. cglib动态代理jar包_代理模式详解:静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...

  3. OllyDbg动态调试与逆向破解TraceMe.exe

    文章目录 前言 OllyDbg 基础介绍 快捷操作 TraceMe 调试分析 破解校验 总结 前言 OllyDbg 是一个新的动态追踪工具,是将 IDA 与 SoftICE 结合起来的产物,Ring3 ...

  4. ida导入jni头文件_IDA动态调试无法导入JNI文件的解决办法

    前言:学习过程中遇到了,特此记录一下. 样本app链接在这里: https://pan.baidu.com/s/1pVLBBuBKRzDzHlBClrBA2A 提取码: 9tz8 它是 2015年阿里 ...

  5. 代理详解 静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对 ...

  6. 一些Chrome 调试小技巧汇总

    写在前面 本文包括浏览器调试,不包括web移动端调试. 本文调试均在chrome浏览器进行 alert 这个不用多说了,不言自明 console 基本输出 想必大家都在用console.log在控制台 ...

  7. linux静态反汇编工具,27款反汇编/调试器/静态和动态分析工具

    原标题:27款反汇编/调试器/静态和动态分析工具 本文从github上收集了27款实用的反汇编.调试器.静态和动态分析工具,文中的工具在<Awesome Windows Exploitation ...

  8. Android逆向之旅---Android中分析抖音和火山小视频的数据请求加密协议(IDA动态调试SO)

    一.前言 最近萌发了一个做app的念头,大致什么样的app先暂时不说,后面会详细介绍这个app的开发流程和架构,不过先要解决一些技术前提问题,技术问题就是需要分析解密当前短视频四小龙:抖音,火山,秒拍 ...

  9. ida调试linux程序,MAC使用IDA PRO远程调试LINUX程序

    1 背景 在学习Linux系统上的一些漏洞知识的时候,往往需要进行"实地测试",但是在Linux系统上进行调试并不太方便,因为LINUX自带的GDB调试工具真的不太人性化,即使有G ...

最新文章

  1. 学习网页制作中如何在正确选取和使用 CSS 单位
  2. 远程办公,你希望在家工作几天?
  3. 图像处理:图像中噪声分布和概率密度函数的关系
  4. 一个女孩写的经典程序
  5. linux命令存放 bash: xxx command not found
  6. NetAssist网络调试助手,学习网络编程第一步
  7. Flash 第二章 基本绘图工具-课堂笔记
  8. matlab2014a如何画电机效率云图,maxwell电机转矩扫描与使用MTPA策略绘制效率map图...
  9. distpicker动态赋值问题
  10. epoll中的ET和LT模式区别
  11. Python 查询全年天数
  12. android汤姆猫的实验报告,毕业设计(论文)-基于Android的会说话的汤姆猫的设计与实现.doc...
  13. 半小时读懂互联网广告新生态
  14. AVG7.5升级过期后新的许可代码
  15. Linux 磁盘划分 LVM 逻辑分区管理步骤
  16. MySql命令行窗口操作
  17. sum idx i matlab,聚类——FCM的matlab程序
  18. Ubuntu 下的nis认证
  19. VHDL硬件描述语言(一)基本概念
  20. WLAN从入门到精通(阅读总结)

热门文章

  1. 苹果手机怎么连接蓝牙耳机_「科技犬」除了苹果AirPods,真无线蓝牙耳机到底怎么选?_蓝牙耳机...
  2. 计算机组成内存外存,内存和外存
  3. 怎样清理苹果电脑磁盘空间_Mac启动磁盘已满?如何快速清理电脑磁盘
  4. 电压源电流源电路符号及2B法
  5. CSS中flex对部分IOS版本兼容性问题
  6. saber软件安装后怎么打开_Saber2016安装包和安装详细安装步骤
  7. node ref char*_「 volute 」树莓派+Node.js造一个有灵魂的语音助手
  8. ionic2开发环境 linux,安装ionic开发环境
  9. 力扣LeetCode-哈希表
  10. Linux多线程学习 - sched_yield() CPU让权