逆向工程步骤及常用工具
软件逆向步骤
1.研究保护方法,去除保护功能 2.反汇编目标软件,定位功能函数 3.分析汇编代码 4.修改汇编代码或还原高级源代码
逆向常用工具
OLLYDBG(OD)
是一个动态追踪工具,是目前最为流行的调试解密工具。同时支持插件扩展功能,是目前最强大的调试工具
Windbg
Windows平台下,强大的用户态和内核态调试工具,是微软免费调试器集合中的GUI的调试器。轻量级,但调试功能强大,另有一个用途是用来分析缓存数据
IDA Pro
交互式反汇编器专业版(Interactive Disassembler Professional)可以方便地分析软件的函数、结构体
PEID
是一款著名的查壳工具,几乎可以侦测出所有的壳,数量超过470种PE文档的加壳类型和签名
C32asm
一款反汇编程序,具有反汇编模式和十六进制编辑模式,能跟踪exe文件的端点,也可直接修改软件内部代码
常见汇编指令
汇编语言种类
关于汇编语言的种类,可以说有多少种不同内核的CPU,就有多少种汇编语言。 和C语言不同,汇编语言更多的针对特定CPU内核,因此,不同内核的CPU,必须有对应的汇编语言编译器将汇编语言别写的程序编译成对应CPU的机器语言代码,CPU才能正确识别和执行这些代码。 不同架构的CPU指令并不相同,如×86,powerpc,arm各有各的指令系统;甚至同一种架构的CPU有几套指令集。 编译器厂商最有名的两家:MASM和GNUASM。前者是微软的,只支持x86,用在DOS/Windows平台中;后者是开源产品,主要用在Linux中,基本上支持大部分的CPU架构。 不同的汇编程序有不同的汇编语言编程规定 目前支持Intel8086/8088系列微机,常用的汇编程序有ASM、MASM、TASM、OPTASM
寄存器
寄存器从理解上来说和内存类似,只不过寄存器位于CPU内部,而内存位于CPU外部 而对于一个汇编程序员来说,CPU中主要可以使用的也就是寄存器而已,汇编程序员可以使用指令来读写CPU中的寄存器,从而可以实现对于CPU的控制,当然,不同的CPU,寄存器的个数和结构都是不一样的。 8086CPU中寄存器总共为14个,且均为16位。 即AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES共14个。 而这14个寄存器按照一定方式又分为了通用寄存器,控制寄存器和段寄存器。
通用寄存器
AX(Accumulator):累加寄存器,也称之为累加器 BX(Base):基地址寄存器 CX(Count):计数器寄存器 DX(Data):数据寄存器
指针寄存器
SP(Stack Pointer):堆栈指针寄存器 BP(Base Pointer):基指针寄存器
变址寄存器
SI(Source Index):源变址寄存器 DI(Destination Index):目的变址寄存器
控制寄存器
IP(Instruction Pointer):指令指针寄存器 FLAG:标志寄存器
段寄存器
CS(Code Segment):代码段寄存器 DS(Data Segment):数据段寄存器 SS(Stack Segment):堆栈段寄存器 ES(Extra Segment):附加段寄存器
堆栈
堆栈是两种数据结构 堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top)) 对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。 堆,队列优先,先进先出(FIFO-first in first out) 栈,先进后出(FILO-First-In/Last-Out) 堆栈中的物体具有一个特性:最后一个放入堆栈中的物体总是被最先拿出来,这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一个元素。 POP操作相反,在堆栈顶部移去一个元素,并将堆栈的大小减一。
堆栈操作示例: PUSH:
POP:
指令和程序设计语言
指令:是CPU根据人的意图来执行某种操作的命令。 程序设计语言:是实现人机交换信息的基本工具,分为机器语言、汇编语言和高级语言。 机器语言:用二进制编码表示每条指令,是计算机能直接识别和执行的语言。 汇编语言:是用助记符、符号和数字等来表示指令的程序设计语言。它与机器语言指令是一一对应的。
指令表现形式
二进制:10100010 十六进制:74 0AH 助记符:ADD A,#08H
汇编指令格式
由编程语言编写的源程序是由许多语句(也可称为汇编指令)组成的。 每个语句由1-4个部分组成,其格式是: [标识符] 指令助记符 [操作数] [;注解] 其中用方括号括起来的部分,可以有也可以没有。 每个部分之间用空格(至少一个)分开,一行最多可有132个字符。 例如: RET;无操作数 COUNT : INCCX;一个操作数 MOV CX,DI ;两个操作数 ADD AX,[BP+4] ;第二个操作数为表达式
主要汇编指令
数据传送类指令
MOV / XCHG、PUSH / POP、LEA
算数运算类指令
ADD / ADC / INC、SUB / SBB / DEC / CMP / NEG、MUL / IMUL、DIV / IDIV
位操作类指令
AND / OR / XOR / NOT / TEST
控制转移类指令
JMP / Jcc / LOOP、CALL / RET、INTn
处理机控制类指令
NOP
8086指令系统概述
Intel 8086指令系统共有117条基本指令 可分为六个功能组: ①数据传送类指令 ②算术运算类指令 ③位操作类指令 ④串操作类指令 ⑤控制转移类指令 ⑥处理机控制类指令
一、数据传送类指令
数据传送是计算机中最基本、最重要的一种操作 传送指令也是最常使用的一类指令 传送指令把数据从一个位置传送到另一个位置 除标志寄存器传送指令外,均不影响标志位 重点掌握 -MOV XCHG -PUSH POP -LEA
1.传送指令MOV
把一个字节或字的操作数从源地址传送至目的地址 示例: mov al,4:al←4,字节传送 move cx,0ffh:cx←00ffh,字传送 mov si,200h:si←0200h,字传送 move byte ptr [si],0ah;byte ptr属性修饰符,说明是操作数为字节 move word ptr [si+2],0bh;word ptr 说明是字操作
2.交换指令XCHG
把两个地方的数据进行互换 寄存器与寄存器之间对换数据 寄存器与存储器之间对换数据 不能在存储器与存储器之间对换数据 示例: mov ax,1234h;ax=1234h mov bx,5678h;bx=5678h xchg ax,bx;ax=5678h,bx=1234h xchg ah,al;ax=7856h
3.进栈指令PUSH
4.出栈指令POP
二、算术运算类指令
掌握:ADD / ADC / INC、SUB / SBB / DEC / NEG / CMP 熟悉:MUL / IMUL、DIV / IDIV 理解:CBW / CWD、DAA / DAS、AAA / AAS / AAM / AAD
1.加法指令ADD
功能:ADD指令将源与目的操作数相加,结果送到目的操作数 对状态标志的影响:ADD指令按状态标志的定义相应设置状态标志 示例: mov al,0fbh;al=0fbh add al,07h;al=02h mov word ptr [200h],4652h;[200h]=4652h mov bx,1feh;bx=1feh add al,bl;al=00h add word ptr [bx+2],0f0fh;[200h]=3742h
2.带进位加法指令ADC
ADC指令将源与目的操作数相加,再加上进位CF标志,结果送到目的操作数 ADC指令按状态标志的定义相应设置状态标志 ADC指令主要和ADD配合,实现多精度加法运算 示例: mov ax,4652h;ax=4652h add ax,0f0fh;ax=3742h,CF=1 mov dx,0234h;dx=0234h adc dx,0f0fh;dx=f325h,CF=0; DX.AX =0234 4652H +F0F0 F0F0H =F325 3742H
3.增量指令INC(increment)
INC指令对操作数加1(增量) INC指令不影响进位CF标志,按定义设置其他状态标志
4.减法指令SUB
SUB指令将目的操作数减去源操作数,结果送到目的操作数 SUB指令按照定义相应设置状态标志 示例: mov al,0fbh;al=0fbh sub al,07h;al=0f4h,CF=0 mov word ptr [200h],4652h;[200h]=4652h mov bx,1feh;bx=1feh sub al,bl;al=0f6h sub word ptr [bx+2],0f0fh;[200h]=5562h,CF=1
5.带借位减法指令SBB
SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数 SBB指令按照定义相应设置状态标志 SBB指令主要与SUB配合,实现多精度减法运算 示例: mov ax,4652h;ax=4652h sub ax,0f0f0h;ax=5562h,CF=1 mov dx,0234h;dx=0234h sbb dx,0f0f0h;dx=1143h,CF=1 DX.AX =0234 4652H -F0F0 F0F0H =1143 5562H
6.减量指令DEC
DEC指令对操作数-1 DEC指令不影响进位CF标志,按定义设置其他状态标志 注: INC指令和DEC指令都是单操作数指令,主要用于对计数器和地址指针的调整
7.求补指令NEG(negative)
NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数 求补运算也可以表达成:将操作数按位取反后加1 NEG指令对标志的影响与用零作减法的SUB指令一样
8.比较指令CMP
CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志 CMP指令执行的功能与SUB指令,但结果不回送目的操作数 示例: cmp al,100;al-100 jb below;al<100,跳转到below执行 sub al,100;al≥100,al←al-100 inc ah;ah←ah+1 (判断al和100的关系后,执行below) below:……
三、位操作类指令
位操作类指令以二进制位为基本单位进行数据的操作 这是一类常用的指令,功能简单、都应该掌握 注意这些指令对标志位的影响 1、逻辑运算指令 AND OR XOR NOT TEST 与、或、异或、非、测试 2、移位指令 SHL SHR SAL SAR 逻辑左移、逻辑右移、算术左移、算术右移 3、循环移位指令 ROL ROR RCL RCR 左循环移位、右循环移位、带进位左循环移位、带进位右循环移位
1.逻辑运算指令AND
功能:对两个操作数执行逻辑与运算,结果送到目的操作数 对标志的影响:AND指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义。 注意:所有双操作数逻辑指令均设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义 示例: MOV AX,FF00H MOV BX,F0F0H AND AX,BX AX=F000H 将AX和BX中的内容对其后,只有上下都是1结果才是1
|