IDA入门

IDA入门

今天准备入手IDA,学习逆向的记录笔记,因为连C++都都没学过,c语言还没学好,所以要认真打好c++基础-> 《c++ prime》

准备工作

1、绿色版释放路径不要含有中文或者路径长度不能超过72字符。(python模块自身的bug)

2、 开发了IDA的天才是Ilfak,他的个人博客有很多IDA的教程

Ilfak blog

IDA目录结构

在IDA的安装根目录下有许多文件夹,各个文件夹存储不同的内容

cfg:包含各种配置文件,基本IDA配置文件ida.cfg, GUI配置文件idagui.cfg,文本模式用户界面配置文件idatui.cfg,
idc:包含IDA内置脚本语言IDC所需要的核心文件
ids:包含一些符号文件
loaders:包含用于识别和解析PE或者ELF
plugins:附加的插件模块
procs:包含处理器模块

常用快捷键

IDA中的快捷键都是和菜单栏的各个功能选项一一对应的,基本上你只要能在菜单栏上找到某个功能,也就能看到相应的快捷键,这里记录几个常用的:

a:将数据转换为字符串 (字符串变数据d)

f5:一键反汇编(光标要在一个函数上)

esc:回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口)

shift+f12:可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置

ctrl+w:保存ida数据库

ctrl+s:选择某个数据段,直接进行跳转

ctrl+鼠标滚轮:能够调节流程视图的大小

x:对着某个函数、变量按该快捷键,可以查看它的交叉引用

g:直接跳转到某个地址

n:更改变量的名称

y:更改变量的类型

/ :在反编译后伪代码的界面中写下注释

\:在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多

;:在反汇编后的界面中写下注释

ctrl+shift+w:拍摄IDA快照

u:undefine,取消定义函数、代码、数据的定义

data segement(数据段)

.rdata is for const data. It is the read only version of the .data segment.

.idata holds the import directory (.edata for exports).

It is used by EXE’s and DLL’s to designate the imported and exported functions.

See the PE format specification (http://msdn.microsoft.com/library/windows/hardware/gg463125) for details.

Summarizing typical segment names:

1
2
3
4
5
6
7
.text: Code
.data: Initialized data
.bss: Uninitialized data
.rdata: Const/read-only (and initialized) data

.edata: Export descriptors
.idata: Import descriptors

In fact, the names of the segments are ignored by Windows.

hex-rays defination

1
2
3
4
5
6
CODE    -       Pure code
DATA - Pure data
CONST - Pure data
BSS - Uninitialized data
STACK - Uninitialized data
XTRN - Extern definitions segment

通常IDA对一个PE文件逆向出来的代码中,

存在四个最基本的段text、idata、rdata、data,

四个段为PE文件的结构中对应的段。

一、text段:

该段位程序代码段,在该段一开始就可以看到:

.text:00401000 ; Segment type: Pure code
.text:00401000 ; Segment permissions: Read/Execute

这里的段类型跟权限说明很清楚: 分别为代码段和可读可执行。需要注意的是,borland这里叫做code,而不是text

二、idata、rdata、data段

从命名上可以看出,三个段全为存放特殊数据的段,但IDA根据PE文件的格式将数据段中不同类型的数据区分开来。

VC开发工具将INC,LIB,RES放在数据段,DELPHI也类似,同时由于Delphi的窗体文件*.dfm在源代码中使用编译指令{$R *dfm}作为res资源放在数据段中,因此像delphi的反汇编工具dede就根据这些窗体资源数据,分析出相当清晰的源代码与窗体事件的对应地址,当然实现代码还是汇编代码。

1) idata段:

该段在一开始一般有类似下面的说明:

.idata:0049B000 ; Section 2. (virtual address 0009B000)
.idata:0049B000 ; Virtual size : 0001717E ( 94590.)
.idata:0049B000 ; Section size in file : 00018000 ( 98304.)
.idata:0049B000 ; Offset to raw data for section: 0009B000
.idata:0049B000 ; Flags 40000040: Data Readable
.idata:0049B000 ; Alignment : default
.idata:0049B000 ;
.idata:0049B000 ; Imports from ADVAPI32.dll
.idata:0049B000 ;
.idata:0049B000 ; ===========================================================================
.idata:0049B000
.idata:0049B000 ; Segment type: Externs
.idata:0049B000 ; _idata

明显是一个Imports函数的代码段,这里集中所有外部函数地址,代码中会先跳到该地址后再执行,PE文件加载器在开始会获取真实的函数地址来修补idata段中的函数地址

与之对应的exports是edata,

表面上看PE文件对该段的定位是特殊数据段。

2)rdata段

名字上看就是资源数据段,程序用到什么资源数据都在这里,资源包括你自己封包的,也包括开发工具自动封包的。

3)data段

这个段存放程序的全局数据、全局常量等。

指令集

当我们打开之后,IDA会提供3种不同的打开方式;New(新建),Go(运行),Previous(上一个)。当我们初次打开的时候选择GO就可以了。进入之后,选择左上角的file中的open打开文件。以凯撒密码为例,打开文件以后。主界面工作区显示

IDA View-A是反汇编窗口,

HexView-A是十六进制格式显示的窗口,

Imports是导入表(程序中调用到的外面的函数),

Functions是函数表(这个程序中的函数),

Structures是结构,

Enums是枚举。

我们此时可以F5查看伪代码。

IDA图形视图会有执行流,Yes箭头默认为绿色,No箭头默认为红色,蓝色表示默认下一个执行块。我们可以在左侧查看代码的运行过程,按下空格键也可以直观地看到程序的图形视图。

在反汇编窗口中大多是eax, ebx, ecx, edx, esi, edi, ebp, esp等。这些都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器。这些寄存器相当于C语言中的变量。

EAX 是”累加器”(accumulator), 它是很多加法乘法指令的缺省寄存器。

EBX 是”基地址”(base)寄存器, 在内存寻址时存放基地址。

ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。

EDX 则总是被用来放整数除法产生的余数。

ESI/EDI 分别叫做”源/目标索引寄存器”(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串。

EBP 是”基址指针”(BASE POINTER), 它最经常被用作高级语言函数调用的”框架指针”(frame pointer)。

ESP 专门用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。

还有一些指令,如:mov,jmp等。

资料转移指令

MOV 移动

MOVC 程式记忆体移动

MOVX 外部RAM和扩展I/O口与累加器A的数据传送指令

PUSH 放入堆叠

POP 由堆叠取回

XCH 8位元交换

XCHD 低4位元交换

SWAP 高低4位元交换

算术指令

ADD 两数相加

ADDC 两数相加再加C

SUBB 两数相减再减C

INC 加一指令

DEC 减一指令

MUL (MUL AB乘法指令仅此一条)相乘指令,所得的16位二进制数低8位存累加器A高8位存B

DIV (DIV AB 除法指令仅此一条)相除指令,所得商存A,余数存B

DA (DA A 只此一条指令)调整为十进数

逻辑指令

ANL做AND(逻辑与)运算

ORL做OR(逻辑或)运算

XRL 做(逻辑异或)运算

CLR 清除为0

CPL 取反指令

RL 不带进位左环移

RLC 带进位左环移

RR 不带进位右环移

RRC 带进位右环移

控制转移类指令

JC C=1时跳

JNC C=0时跳

JB 位元=1时跳

JNB 位元=0时跳

JBC 位元=1时跳且清除此位元

LCALL 长调用子程序

ACALL 绝对调用子程序

RET 由副程式返回

RETI 由中断副程式返回

AJMP 绝对转移

SJMP 相对转移

JMP @A+DPTR 散转,相对DPTR的间接转移

JZ A=0时跳

JNZA 0时跳

CJNE 二数比较,不相等时跳

DJNZ 减一,不等於0时跳

NOP 空操作

位变量指令

SETB 设定为1

ORG 程序开始,规定程序的起始地址

END 程序结束

EQU 等值指令(先赋值后使用)例:SUM EQU 30H

DB 定义字节指令

DW 定义字内容

DS 定义保留一定的存贮单元数目

BIT 位地址符号指令 例:SAM BIT P1.0

RET 子程序返回指令

RETI 中断子程序返回指令

$ 本条指令地址

ida文件

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

  • 后缀为id0的二叉树形式的数据库,

  • 后缀为id1的程序字节标识,

  • 后缀为nam的Named窗口的索引信息,

  • 后缀为til的给定数据库的本地类型定义的相关信息。

    image-20200514165659874

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