IDA学习笔记

来源:互联网 发布:不上榜的隐形富豪知乎 编辑:程序博客网 时间:2024/05/15 20:23

标题:IDA学习笔记

作者:kagula

日期:2015-06-09

环境:IDA 6.6、VS2013Update4

阅读前提: 熟悉计算机指令

介绍

   通过分析自己用VS2013写的Win DLL来学习IDA反汇编工具的使用。这里记录了我分析二进制代码过程中经常遇到的问题。

 

   首先通过参考资料[1]来熟悉下IDA的使用,建立个最基本的概念。“idb”文件是你分析样本的数据库文件,你对样本的分析信息,比如对函数变量的重命名了,代码的注释了,都会存在这个文件里。

   PE(Portable Executable)格式,是微软Win32环境可移植可执行文件(如exe、dll、vxd、sys和vdm等)的标准文件格式,这是我现在要分析的样本格式。

 

IDA的主要窗口如下

IDA view:  定位要修改的代码段在哪里。

Hex view:  用来修改我们的数据

exports window:   导出窗口

import window:   导入窗口

names window:   函数和参数的命名列表

functions window: 样本的所有函数窗口

strings window:   字符串显示窗口,会列出程序中的所有字符串

   上面几个窗口由于样本的作者会做些反分析处理, 你装载样本后, 马上去看是不准确的。

 

    分析二进制代码比想像中的复杂很多,除了二进制代码比较冗长外,样本作者还会采取各种措施阻碍你分析它的代码。

    一般样本会hide关键字符串,让你找不到。

 

    当然一旦你的IDA程序正确起来加载了样本,就没有破解不了的东西,难是难在时间成本的控制,因为你不可能花几年时间把所有的二进制代码读一遍。

如何确定反汇编的区域

    这是最难的部份,样本的作者[1]可能加壳[2]代码段里放数据,数据段里放代码让IDA无法自动线性反汇编,不能确定函数和过程边界[3]在代码段里插入特定指令让IDA无法自动线性反汇编[4]函数体(代码)分散在各个数据段里,你必须手动确定函数体[5]注册码放入多级指针中分别进行多级offset,让你无法使用IDAtrace[6]每次启动进程,根据注册码生成的内部注册码都不一样,等等。

    如果样本比较简单的话,可以通过样本访问了哪些系统API为始点进行动态分析,确定反汇编区域。

    在这个过程中你经常需要改变“内存变量的值”,“执行流程”来测试你现在所跟踪的分支是否有“价值”进一步分析其含义。

 

如何修改数据

     在Hex View窗口下,[S1]双击要修改的地方[S2]使用[F2]捷方式修改当前字节[S3]再按下[F2]快捷方式应用修改。

如何改变执行流程

[1]修改跳转指令。

[2]修改内存数据。

[3]IDA View中使用下面的命令Jump to IP,Set IP, Run to cursor。

保存修改

使用下面的主菜单命令,直接把修改保存到输入文件中

 [IDA  Main Menu]->[Edit]->[PatchProgram]->[Apply patches to input file...]

如何查看函数之间的关系

   IDAView下使用小键盘-”,“+”快捷方式可以在代码同关系图之间切换。

如何查看符号引用

IDA View下使用[X]快捷方式,定位引用了当前符号的代码。

FQA

Q 如何实现16进制加法运算?

A

Matlab中使用下面的命令可以实现0x50+0x150=0x1a0的计算

dec2hex(hex2dec('50')+hex2dec('150'))

 

Q  C语言函数形参表压栈顺序

A

从右向左压栈,Call指令返回后,需要根据函数的参数数量修改esp寄存器的值,

add     esp,0Ch;三个参数,每个参数四字节所以是0ch

 

Q 如何显示C伪代码

A

如果有[Main menu]->[View]->[Open SubViews]->[Pseudocode F5]菜单,说明你已经安装了Hex Rays decompiler插件,可以在查看汇编的时候,按[F5]打开伪代码子窗口。

 

Q 如何返回Function(Proc)的上级调用

A

打开“Call Stack”View。使用[Esc]返回。

 

Q  如何把变量重定义为数组

A

使用快捷键"*"。

 

Q如何对DLL文件进行动态跟踪

A

Step1: 用[F2]在IDA View中当前代码行切换断点。

Step2: 启动装载DLL的EXE文件。

Step3: 使用[Debugger]->[Attach toprocess]把当前二进制代码attach到正在运行的进程中去。

Step4: 现在应该进入断点。[F7]Stepinto。[F8]Stepover。[F9]continue。

Step5:  Cursor移到内存位置后双击就可以查看到具体内存中的值,右击快捷菜单[Jumpto IP]项,可以回到你刚才指令的地方。

Step6: IDA View中有很多行代码,可以使用[;]快捷键对当前行进行注释。

Step7: 为了观察具体指令的二进制表示你还需要[IDAView]->[右击快捷菜单]->[Synchronize with]->[Hex View 1]这样Hex View会和你的IDA View中光标位置同步。

      没有第七步,你很难看懂ASM的意思。

Step8: 在IDA View中为函数改名,用[N]快捷键。

Step10: 观察内存(变量)[Tool bar]->[Open the watch list window],[Toolbar]->[Add a variable towatch]。

Step11(可选):  如果作者混淆了二进制代码,你需要IDAView在频繁使用[D]ata快捷键,[C]ode快捷键,强制IDA,解析指定数据块为数据(Data)或代码(Code)。

 

常用指令同二进制的对应关系

NOP         00 00 A0 E1

 

常用工具

WinSpy 查看进程的窗口信息

http://www.catch22.net/software/winspy-17

Resource Hacker查看EXE、DLL的资源

http://www.angusj.com/resourcehacker/

参考资料

[1] 利用IDA Pro反汇编程序

http://www.cnblogs.com/vento/archive/2013/02/09/2909579.html

[2] experiment : add struct define onIDA6.1

http://blog.csdn.net/lostspeed/article/details/9300575

[3] ASCII码与16进制的互相转换(表)

http://www.cnblogs.com/ciey/archive/2010/01/05/1639969.html

[4] 去除 dll 和 exe 文件的数字签名

http://www.cnblogs.com/szyicol/archive/2012/06/21/2558104.html

[5]在线破解工具包

http://down.52pojie.cn/Tools/

后记

    有空浏览下IDA主菜单、popup menu、IDA本身自带的帮助文档,了解有哪些基本功能可供我们调用,以及如何使用。

0 0
原创粉丝点击