IDA Pro使用技巧

摘要:
DAPro基本介绍IDA加载程序后,立即可见的三个窗口是IDA视图、命名和消息输出。IDA图形视图将有一个执行流程。默认情况下,“是”箭头为绿色,“否”箭头为红色,蓝色表示默认情况下的下一个执行块。打开IDAPro6.5,提供三个访问IDA界面的选项,即New、Go和Previous。当IDA打开一个应用程序时,它将为其创建一个后缀为IDB的数据库。一旦IDA为可执行程序创建了数据库,它就不再需要访问可执行文件本身,除非使用IDA调试功能。[3] 在IDAView中使用以下命令:JumptoIP、SetIP和Runtocursor。

DA Pro基本简介 
IDA加载完程序后,3个立即可见的窗口分别为IDA-View,Named,和消息输出窗口(output Window)。


这里写图片描述

IDA图形视图会有执行流,Yes箭头默认为绿色,No箭头默认为红色,蓝色表示默认下一个执行块。


在寄存器窗口中显示着每个寄存器当前的值和对应在反汇编窗口中的内存地址。函数在进入时都会保存堆栈地址EBP和ESP,退出函数时恢复。


选择菜单Debugger下的Start process(也可以按F9键)来开始调试。调试会让程序在电脑中执行,所以IDA会提示注意提防恶意程序、病毒和木马。 


这里写图片描述 

打开IDA Pro 6.5,为进入IDA界面提供三种选项,分别是New(新建),Go(运行),Previous(上一个)。 


这里写图片描述 

选择File菜单下的Open,打开想要逆向的可执行文件,会显示一个Load a new file的界面。这里可以选择: 
1. 程序的类型; 
2. 处理器的类型; 
3. 加载的段地址和偏移量; 
4. 是否允许分析; 
5. 一些加载选项; 
6. 内核和处理器的一些选项; 
7. windows系统dll所在的目录。


这里写图片描述 


默认选择PE文件就可以,对于一些网络数据包或者其他格式的文件,可以使用二进制加载,自己进行解析。


工作区有多个子窗口,

  • IDA View-A是反汇编窗口,
  • HexView-A是十六进制格式显示的窗口,
  • Imports是导入表(程序中调用到的外面的函数),
  • Functions是函数表(这个程序中的函数),
  • Structures是结构,
  • Enums是枚举。

IDA view: 定位要修改的代码段在哪里。 
Hex view: 用来修改我们的数据 
exports window: 导出窗口 
import window: 导入窗口 
names window: 函数和参数的命名列表 
functions window: 样本的所有函数窗口 
strings window: 字符串显示窗口,会列出程序中的所有字符串


这里写图片描述

IDA很智能,鼠标移到某些标识符上会自动有适当的提示,双击还能自动跳到相应的位置。把一个函数逆向的方法很简单,只要按F5键就会出来逆向出的C语言程序了。

退出IDA时,会进行文件保存确认,如果需要继续进行分析,将IDA中间数据库打包,下次继续打开就可以进行分析;如果不需要继续分析,选择不要打包,不要存储数据库。


IDA打开应用程序时,会为其创建一个数据库,后缀为IDB。IDB由4个文件组成:

  • 后缀为id0的二叉树形式的数据库,
  • 后缀为id1的程序字节标识,
  • 后缀为nam的Named窗口的索引信息,
  • 后缀为til的给定数据库的本地类型定义的相关信息。 

    这里写图片描述 

一旦IDA为某个可执行程序创建数据库,它本身就不再需要访问这个可执行文件,除非使用IDA的Debug功能。


跳转指令分三类:

  • 无条件跳转: JMP;
  • 根据 CX、ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转)、JECXZ(ECX 为 0 则跳转);
  • 根据 EFLAGS 寄存器的标志位跳转, 这个太多了.

学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

— MOVSX MOVZX 
比如 
MOVSX EAX, BYTE PTR [00401000] 
或 
MOVZX EAX, BYTE PTR [00401000] 
c语言中应该如何表达啊? 
比如定义一个全局变量 
BYTE bt = 101; 
DWORD dw; 
应该如何把bt赋值到dw中. 并且功能与MOVSX/MOVZX相同? 
汇编语言与C语言的语言构件不同,并不是一定能转成完全等价的C语言的代码的。 
对于以上代码,可以这样理解: 
movsx ====> dw = (DWORD) ( (signed char) (bt) ) 
movzx ====> dw = (DWORD) ( (unsigned char) (bt) ) 
movzx是把高位全部用0填充,而movsx是把原来数的最高位扩展成超出的位。 
对于bt=101,也就是0x65,八位二进制是“01100101”,因为它的最高位是0,因此这两种情况,dw都等于0x00000065

换一个,比如bt=247,也就是0xF7,八位二进制是“11111110”它的最高位是1。 
经过movsx变换后,dw等于0xfffffff7; 
而经过movzx变换后,dw等于0x000000f7

交叉参考 
通过交叉参考(XREF)可以知道指令代码互相调用的关系.如下: 
.text:00401165 loc_401165: ;CODE XREF:sub_401120+B|j 
这句CODE XREF:sub_401120+B|j 表示该调用地址是401120, 
“j”表示跳转(jump) 
“o”表示偏移值(offset) 
“p”表示子程序(procedure) 
双击这里或按回车键可以跳到调用该处的地方


参考重命名
找到一段代码(一般为函数入口名),右键点击选择”Rename”可以将函数名称变成易懂的名称.


标签的用法
在菜单”Jump”中选择”Mark Position” 将会打开 标记当前位置功能,输入一个名称, 在菜单”Jump/Jump to marked position” 中或按”Ctrl+M”键双击想要调转的名称,便会到达制定的代码位置.


进制的转换
选择快捷键的#可以转换进制,选择”Toggle leading zeroes”功能是用0填补数据前的空位.


cqd,为Convert Double to Quad的缩写,意为将双字数据扩展为四字。

该指令先把edx的每一位置成eax的最高位(若eax>=0x80000000, 则edx=0xFFFFFFFF;若eax<0x80000000,则edx=0x00000000) ,再把edx扩展为eax的高位。

该指令常用于扩展被除数,很久前,指令集规定除数必须是被除数的一半长,这个规定一直被沿用。使用IDIV执行除法时,如果除数是32位,这就要求被除数是64位,即EDX:EAX,所以扩展一下EAX以满足除法指令的条件并且得到正确的结果。


DIV 和IDIV 
DIV和IDIV两个都是算术除法操作指令。DIV是无符号数除法 DIV s ;完成两个无符号数相除。 
IDIV 是有符号数除法指令,完成两个有符号数相除。被除数、商、除数、余数存放位置及对s的规定与DIV指令相同。 


这里写图片描述

修改程序的指令或者数据,并进行保存 
如何修改数据

在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…]。

OD中右键-保存到文件-选择 
我的OD是这样的,只能修改一条,通过选择,保存一条重新载入再修改再保存.


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

  • 用[F2]在IDA View中当前代码行切换断点。
  • 启动装载DLL的EXE文件。
  • 使用[Debugger]->[Attach toprocess]把当前二进制代码attach到正在运行的进程中去。
  • 现在应该进入断点。[F7]Stepinto。[F8]Stepover。[F9]continue。
  • Cursor移到内存位置后双击就可以查看到具体内存中的值,右击快捷菜单[Jumpto IP]项,可以回到你刚才指令的地方。
  • IDA View中有很多行代码,可以使用[;]快捷键对当前行进行注释。
  • 为了观察具体指令的二进制表示你还需要[IDAView]->[右击快捷菜单]->[Synchronize with]->[Hex View 1]这样Hex View会和你的IDA View中光标位置同步。
  • 在IDA View中为函数改名,用[N]快捷键。
  • 观察内存(变量)[Tool bar]->[Open the watch list window],[Toolbar]->[Add a variable towatch]。
  • 如果作者混淆了二进制代码,你需要IDAView在频繁使用[D]ata快捷键,[C]ode快捷键,强制IDA,解析指定数据块为数据(Data)或代码(Code)。

这些32位寄存器有多种用途,但每一个都有“专长”,有各自的特别之处。

EAX 是”累加器”(accumulator), 它是很多加法乘法指令的缺省寄存器。 
EBX 是”基地址”(base)寄存器, 在内存寻址时存放基地址。 
ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。 
EDX 则总是被用来放整数除法产生的余数。 
ESI/EDI 分别叫做”源/目标索引寄存器”(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串. 
EBP 是”基址指针”(BASE POINTER), 它最经常被用作高级语言函数调用的”框架指针”(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码: 
 push ebp ; 保存当前ebp 
  mov ebp,esp ; EBP设为当前堆栈指针 
  sub esp, xxx ; 预留xxx字节给函数临时变量. 
  … 
   
这样一来,EBP 构成了该函数的一个框架, 在EBP上方分别是原来的EBP, 返回地址和参数. EBP下方则是临时变量. 函数返回时作 mov esp,ebp/pop ebp/ret 即可. 
ESP 专门用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。


汇编中的ASSUME 
经常用来将寄存器当作结构体指针来用 
ASSUME edx:ptr STRUCT ; 
将edx 定义为STRUCT指针变量把STRUCT结构体的起始地址给edx

lea edx, STRUCT 
这个时候可以用 [edx].调用STRUCT的字段 
ASSUME edx:nothing ; 
取消定义 这个时候edx 不是指针 
[edx].不能调用字段了

如果是8086的那么将段REG ASSUME DS:(某个数据段) 
这样程序在使用这个数据段会用DS做段 
Code段是不能指定段REG的 必须是CS:IP(EA)

快捷键 
1. 按空格键切换反汇编窗口(列表视图《=====》图形视图) 
反汇编窗口有两种显示格式:面向文本的列表视图和图形视图。不同视图在不同的场景下各有所长,按空格键可以快速切换。 
2. 翻页 esc 和 Ctrl+Enter 
当执行跳转功能后,需要返回时,只要在工具栏中点击 <- 或按Esc键,列表便会往后跳一页; 
若要往前一页,点击 -> 或按”Ctrl+Enter”键. 
3. 注释 “;”和”:” 
按;号输入的注释,所有交叉参考处都会出现, 
按:号键输入的注释只在该处出现 
4. 使用小键盘“-”,“+”查看函数之间的关系 
IDAView下使用小键盘“-”,“+”快捷方式可以在代码同关系图之间切换。 
5. 使用[X]查看符号引用 
IDA View下使用[X]快捷方式,定位引用了当前符号的代码。 
6. 快捷键F5显示C伪代码 
如果有[Main menu]->[View]->[Open SubViews]->[Pseudocode F5]菜单,说明你已经安装了Hex Rays decompiler插件,可以在查看汇编的时候,按[F5]打开伪代码子窗口。 
7. 使用快捷键”*”把变量重定义为数组。 
8. 快捷键Ctrl+S,打开搜索类型选择对话框–>双击Strings,跳到字符串段–>菜单项“Search–>Text”; 
9. 快捷键Alt+T,打开文本搜索对话框,在String文本框中输入要搜索的字符串点击OK即可;


Open Subviews

窗口名称快捷键
Names WindowShift+F4
Functions WindowShift+F3
Strings WindowShift+F12
SegmentsShift+F7
Segment registersShift+F8
SignaturesShift+F5
Type librariesShift+F11
StructuresShift+F9
EnumerationsShift+F10

Data Format Options

窗口名称快捷键备注
ASCII strings styleAlt+A 
Setup data typesAlt+D 

File Operations

窗口名称快捷键备注
Parse C header fileCtrl+F9 
Create ASM fileAlt+F10 
Save databaseCtrl+W 

Navigation

窗口名称快捷键备注
Jump to operandEnter 
Jump in new windowAlt+Enter 
Jump to previous positionEsc 
Jump to next positionCtrl+Enter 
Jump to addressG 
Jump by nameCtrl+L 
Jump to functionCtrl+P 
Jump to segmentCtrl+S 
Jump to segment registerCtrl+G 
Jump to problemCtrl+Q 
Jump to cross referenceCtrl+X 
Jump to xref to operandX 
Jump to entry pointCtrl+E 
Mark PositionAlt+M 
Jump to marked positionCtrl+M 

Debugger

窗口名称快捷键备注
Start processF9 
Terminate processCtrl+F2 
Step intoF7 
Step overF8 
Run until returnCtrl+F7 
Run to cursorF4 

Breakpoints

窗口名称快捷键备注
Breakpoint listCtrl+Alt+B 

Watches

窗口名称快捷键备注
Delete watchDel 

Tracing

窗口名称快捷键备注
Stack traceCtrl+Alt+S 

Search

窗口名称快捷键备注
Next codeAlt+C 
Next dataCtrl+D 
Next exploredCtrl+A 
Next unexploredCtrl+U 
Immediate valueAlt+I 
Next immediate valueCtrl+I 
TextAlt+T 
Next textCtrl+T 
Sequence of bytesAlt+B 
Next sequence of bytesCtrl+B 
Not functionAlt+U 
Next voidCtrl+V 
Error operandCtrl+F 

Graphing

窗口名称快捷键备注
Flow chartF12 
Function callsCtrl+F12 

Miscellaneous

窗口名称快捷键备注
Calculator? 
Cycle through open viewsCtrl+Tab 
Select tabAlt + [1…N] 
Close current viewCtrl+F4 
ExitAlt+X 
IDC CommandShift+F2 

Edit (Data Types – etc)

窗口名称快捷键备注
CopyCtrl+Ins 
Begin selectionAlt+L 
Manual instructionAlt+F2 
CodeC 
DataD 
Struct variableAlt+Q 
ASCII stringA 
ArrayNum * 
UndefineU 
RenameN 

Operand Type

窗口名称快捷键备注
Offset (data segment)O 
Offset (current segment)Ctrl+O 
Offset by (any segment)Alt+R 
Offset (user-defined)Ctrl+R 
Offset (struct)T 
Number (default)# 
HexadecimalQ 
DecimalH 
BinaryB 
CharacterR 
SegmentS 
Enum memberM 
Stack variableK 
Change signUnderscore (_) 
Bitwise negate~ 
Manual_ Alt+F1 

Comments

窗口名称快捷键备注
Enter comment: 
Enter repeatable comment; 
Enter anterior linesIns 
Enter posterior linesShift+Ins 
Insert predefined commentShift+F1 

Segments

窗口名称快捷键备注
Edit segmentAlt+S 
Change segment register valueAlt+G 

Structs

窗口名称快捷键备注
Struct varAlt+Q 
Force zero offset fieldCtrl+Z 
Select union memberAlt+Y 

Functions

窗口名称快捷键备注
Create functionP 
Edit functionAlt+P 
Set function endE 
Stack variablesCtrl+K 
Change stack pointerAlt+K 
Rename registerV 
Set function typeY 

Note: 
1. IDA不提供撤销功能,如果不小心按下某键,导致IDB数据库文件发生意外,是无法进行回退操作的。


PEID 
扫描模式编辑 
●正常扫描模式:可在PE文档的入口点扫描所有记录的签名; 
●深度扫描模式:可深入扫描所有记录的签名,这种模式要比上一种的扫描范围更广、更深入; 
●核心扫描模式:可完整地扫描整个PE文档,建议将此模式作为最后的选择。PEiD内置有差错控制的技术,所以一般能确保扫描结果的准确性。前两种扫描模式几乎在瞬间就可得到结果,最后一种有点慢,原因显而易见。

免责声明:文章转载自《IDA Pro使用技巧》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ubuntu18.04server服务器系统下为python安装虚拟显示器 (使用jupyter notebook在web端播放openai的gym下保存的运行视频——需安装ipython)Python学习————drf(三)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【转】 SpringCloudAlibaba之Sentinel流量控制 SpringCloudAlibaba微服务实战教程系列

【转】 SpringCloudAlibaba之Sentinel流量控制 SpringCloudAlibaba微服务实战教程系列 一、认识下Sentinel Sentinel使用流程:微服务会集成Sentinel客户端,从官方下载jar启动作为服务端,在有配置变更和添加的时候Sentinel会发送消息给客户端,进行变更应用。 Sentinel 分为两个部分...

消息队列之

      对于消息队列,应该都不陌生。市场上很多类型的消息队列,五花八门。选择自己适合场景的消息队列并不容易。如何选择呢?这篇文章不会很简单的对比所有的队列的优劣,会从消息队列的本身的方式与优缺点,让大家觉得需不需要使用消息队列。   消息队列的架构模式       消息代理定义:消息代理是一种架构模式,用于消息验证、变换、路由。调节应用程序的通信,...

ELK+Kafka 企业日志收集平台(一)

背景: 最近线上上了ELK,但是只用了一台Redis在中间作为消息队列,以减轻前端es集群的压力,Redis的集群解决方案暂时没有接触过,并且Redis作为消息队列并不是它的强项;所以最近将Redis换成了专业的消息信息发布订阅系统Kafka, Kafka的更多介绍大家可以看这里:传送门  ,关于ELK的知识网上有很多的哦, 此篇博客主要是总结一下目前线...

SAP系统中发送公告的几种办法

      刚刚在闪存里看到朋友在闪存里提到:如何在SAP系统发送公告的T-CODE,觉得今后可能会用到,所以顺便在网上搜索了一下相关资料。由于时间关系,太晚了,得休息了,在此我就不再一个个抠图了,直接借用一下别人的文章,将此方法记录了下来,希望今后有用得到的地方……     1、SM02创建消息,并设定有效期。当用户刷新窗口或打开窗口时会显示。这个消息对...

HOOK技术的一些简单总结

好久没写博客了, 一个月一篇还是要尽量保证,今天谈下Hook技术。 在Window平台上开发任何稍微底层一点的东西,基本上都是Hook满天飞, 普通应用程序如此,安全软件更是如此, 这里简单记录一些常用的Hook技术。 SetWindowsHookEx 基本上做Windows开发都知道这个API, 它给我们提供了一个拦截系统事件和消息的机会, 并且它可...

php的流处理

  工作中有这样一类场景,1、数据量很大,2、需要对数据进行实时的简单处理。例如:用户发布的消息会实时写入到message.txt文件中,写入的同时推送进mcq中(使用php脚本)。那么这个简单的功能就比较适合使用php的流的处理方式来实现。php://  是php中已经注册的URL风格的封装协议,用于访问各个输入/输出流(I/O streams)。 #...