IDA 操作记录

1、加载文件

windows 下,用ida加载文件后,会在该文件同目录下生成几个文件,含义如下:

.id0 : 二叉树数据库

.id1:    文件包含描述每个程序字节的标记

.nam:   包含 IDA  NAME 窗口的数据库

.til:    本地数据库有关信息

2、保存

don't pack database:   不将ida的加载文件打包

pack database(store):            将加载文件打包(在加载文件的路径下,将加载生成的文件打包成一个 .pdb(program database) 文件,下次启动,可以直接用ida加载该pdb文件)。

pack database(deflate):          将加载文件 打包(同上,但是,该方案是将加载文件打包,压缩)。

3、建议

提倡在分析完数据后,做好数据的保存,ida可能会崩溃。崩溃原因是 ida本身的bug 或者  使用的第三方插件引起的bug,

介绍

通过分析自己用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本身自带的帮助文档,了解有哪些基本功能可供我们调用,以及如何使用。

来源: https://blog.csdn.net/liuhw4598/article/details/78340180

IDA 自定义结构体

  1. Shift + F9 打开结构体
  2. insert 插入结构体
  3. D 插入结构体数据
  4. Alt + Q 将某一组数据定义为某结构体

去除行数和机器码

当我们拷贝代码是,如果左边带有行数和机器码,就麻烦了。打开 Options -> General,将 Line prefixes 去掉,Number of opcode bytes 置位 0,该字段指显示多少字节的机器码

解析方式的转换

选定地址处,按下 D 键,可以将该快内容解析成数据;按下 C 键,可以将该块内容解析成代码

按 D 键,可以将该块数据解析成单字节/双字节/四字节等,可以在 Options->Setup data types 中设置需要解析的数据类型。

如果数据是一组数组,右键,选择 Array,可以设置数组格式

 

将数据转换为浮点

Edit -> Operand type -> Number -> Floating point

交叉引用

函数的右侧,显示了调用该函数的代码位置,另外,可以在函数名上按 X 快捷键查看。如果要在代码处显示多条引用,打开 Options -> General,在 Cross-references 选项卡下的选择最大显示条数。

各种快捷键

快捷键 K

IDA 在反汇编后,浮点操作数如果时内存单元,不能辨认出其所占字节长度时,可以按 K 键来转换其解析方式

快捷键 N

可以为变量、函数等取别名

快捷键 Q

64 位汇编,按 Q 键可以转化为习惯的读法

关于习惯

分段

当分析反汇编代码时,要习惯分段来解析代码。在注释时多按一个回车,可以将代码分成一块一块的代码块:

注释

在得知一个变量是有符号还是无符号的时候,要立马加上标记,比如在名称为 Var 的变量前面加上 nVar 以示区分。在得知一个变量或函数的作用的时候立即注释上对应的名称。

IDA 操作记录的更多相关文章

  1. centos 6x系统下源码安装mysql操作记录

    在运维工作中经常部署各种运维环境,涉及mysql数据库的安装也是时常需要的.mysql数据库安装可以选择yum在线安装,但是这种安装的mysql一般是系统自带的,版本方面可能跟需求不太匹配.可以通过源 ...

  2. Mysql更换MyISAM存储引擎为Innodb的操作记录

    一般情况下,mysql会默认提供多种存储引擎,可以通过下面的查看: 1)查看mysql是否安装了innodb插件.通过下面的命令结果可知,已经安装了innodb插件. mysql> show p ...

  3. nginx缓存配置的操作记录梳理

    web缓存位于内容源Web服务器和客户端之间,当用户访问一个URL时,Web缓存服务器会去后端Web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,Web缓存服务器直接输 ...

  4. Linux下修改系统编码的操作记录

    Linux系统安装后,发现中文显示乱码.因为系统编码为en_US.UTF-8,应改为支持中文的编码(即zh_CN.UTF-8)操作记录如下:1)检查linux的系统编码检查linux的系统编码,确定系 ...

  5. Nginx中防盗链(下载防盗链和图片防盗链)操作记录

    日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...

  6. nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录

    geo指令使用ngx_http_geo_module模块提供的.默认情况下,nginx有加载这个模块,除非人为的 --without-http_geo_module.ngx_http_geo_modu ...

  7. Mysql备份系列(4)--lvm-snapshot备份mysql数据(全量+增量)操作记录

    Mysql最常用的三种备份工具分别是mysqldump.Xtrabackup(innobackupex工具).lvm-snapshot快照.前面分别介绍了:Mysql备份系列(1)--备份方案总结性梳 ...

  8. jenkins中通过git发版操作记录

    之前说到的jenkins自动化构建发版是通过svn方式,今天这里介绍下通过git方式发本的操作记录. 一.不管是通过svn发版还是git发版,都要首先下载svn或git插件.登陆jenkins,依次点 ...

  9. gitlab配置邮件通知功能操作记录

    之前已经介绍了gitlab的部署http://www.cnblogs.com/kevingrace/p/5651402.html但是没有配置邮箱通知功能,今天这里介绍下gitlab安装后的邮箱配置操作 ...

随机推荐

  1. ABAP Development Tools的语法高亮实现原理

    ABAP Development Tools的前端是Java,根本识别不了ABAP.那么在ADT里的ABAP语法高亮是如何实现的? 第一次打开一个report时,显示在ADT里的代码是没有任何语法高亮 ...

  2. SAP Cloud for Customer客户主数据的地图集成

    点击这个按钮可以通过地图的方式查看C4C客户在地图上的地理位置: 只需要在这个客户的地址栏里维护上天府软件园的经度和维度: 就能够在C4C的客户列表页面里显示该客户在地图上的位置: 要获取更多Jerr ...

  3. CCCC 以及 hihocoder offer收割赛11 ~~~

    CCCC  真的很蒙  ,没有队服,没有狗牌,服务器崩溃到14:10  才开始比赛...(黑人问号 开始前,发现旁边是西交老大吴航,mad~各种紧张.看着大佬疯狂的敲宏定义就很怕啊.100多行,一行头 ...

  4. 用requests爬取图片

    # coding=utf-8 from bs4 import BeautifulSoup import requests import urllib x = 1 def crawl(url): res ...

  5. Windows平台下MySQL常用操作与命令

    Windows平台下MySQL常用操作与命令 Windows平台下MySQL常用操作与命令,学习mysql的朋友可以参考下. 1.导出整个数据库 mysqldump -u 用户名 -p --defau ...

  6. Linux安装项目管理工具禅道出现的一些问题

    我这边是直接使用的lamp一键安装的环境 lamp地址如下:https://lnmp.org/ 然后直接下载禅道源码解压后放入/home/wwwroot/default此目录下 然后访问禅道源码里面的 ...

  7. 网络流(一)——Edmonds Karp算法

    首先是一些关于网络流的术语: 源点:即图的起点. 汇点:即图的终点. 容量:有向边(u,v)允许通过的最大流量. 增广路:一条合法的从源点流向汇点的路径. 网络流问题是在图上进行解决的,我们通常可以将 ...

  8. PHPStorm+XDebug进行调试图文教程

    这篇文章主要为大家详细介绍了PHPStorm+XDebug进行调试图文教程,内容很丰富,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 另外如果你们加载不出图片,另外的地址:转载地址https:// ...

  9. 关于上传文件 非ajax提交 得到后台数据问题

    <form name="configForm" id="configForm" method="post" action=" ...

  10. javascript实现原生ajax的几种方法介绍

    自从javascript有了各种框架之后,比如jquery,使用ajax已经变的相当简单了.但有时候为了追求简洁,可能项目中不需要加载jquery这种庞大的js插件.但又要使用到ajax这种功能该如何 ...