零基础学习逆向工程

静态分析技术

是在不进行计算机程序的条件下,对源代码进行分析,找出代码缺陷,一般是利用静态分析工具,将二进制的可执行文件翻译成汇编代码或C语言伪代码,通过对代码的分析来破解软件

优点

1.直接面向源码,分析多种问题

2.能够检测所有的代码级别可执行路径组合,快速,准确

3.静态分析不需要执行程序,不会被恶意代码攻击

动态调试技术

动态调试技术在软件逆向工程领域也是一个很热门的概念,他是与静态分析技术相对而言的。静态分析是不执行程序,而动态调试则是指破解者利用调试器跟踪软件的运行,寻求破解的路径

动态调试技术,一般是通过观察程序在运行过程中的状态,如寄存器内容,函数的输入输出,内存使用情况等等,分析函数功能,明确代码逻辑,挖掘可能存在的漏洞。代码流和数据流是动态调试技术通常要特别关注的两个方面

优点

1.更好的判断程序执行流程

2.可以跟踪数据流的走向,比如跟踪用户名口令,验证码等在程序执行中的流向

3.程序装载到内存,能够分析内存地址信息

程序壳

壳是指在一个程序外面包裹一段代码,保护里面的代码不被正确反编译或非法修改,在加载到内存时,一般先于程序运行,拿到控制权,然后保护并加载程序

加壳:其实是利用特殊算法,对EXE,DLL文件里的资源进行压缩,类似WINZIP的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。加壳过的程序可以直接运行,但是不能查看源代码,要经过脱壳才能查看源代码,这样可以起到保护程序的作用

分类:

压缩壳:通过压缩算法压缩软件大小

加密壳:利用各种反跟踪技术保护程序不被调试,脱壳,反编译

逆向的基本流程

1.利用studyPE等工具,初步了解程序信息

2.静态分析:使用IDA等静态分析工具收集信息,并根据这些静态信息进行google/github搜素

3.绕过保护机制:研究程序的保护方法,如代码混淆,保护壳及反调试等技术,并设法破解或绕过保护

4.定位关键代码:反汇编目标软件,快速定位到关键代码进行分析

5.动态分析:使用动态工具运行目标程序,验证自己的初期猜想,在分析的过程中理清程序功能

6.针对程序功能,写出对应脚本或者工作报告,完成逆向分析目的(破解软件,获取flag,澄清程序机制等)

编译原理

预处理阶段主要进行

1.头文件的包含:处理#include预编译指令,将被包含的文件内容插入到该预编译指令的位置。注意,该过程递归执行

2.宏的替换:将所有的#define删除,并展开所有的宏定义

3.处理所有条件编译指令,条件编译指令将决定哪些代码被编译,而哪些不被编译。可以根据表达式的值或某个特定的宏是否被定义来确定编译条件

4.删除所有注释

5.保留#pargma编译器指令,#Pargma指令的作用是设定编译器的状态或者是指示编译器完成一些特定的动作,比如可以指定编译过程的输入信息

编译

编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件

汇编

汇编器将汇编代码转变成机器可以执行的指令(机器码)

链接

目标文件需要链接一大堆文件才能得到最终的可执行文件。链接过程主要包括地址和空间分配,符号决议和重定向

gcc常用参数

参数-save-temps:可以从源代码得到可执行文件

参数--verebose:可以输出gcc详细的工作流程

汇编语言

汇编语言介绍

机器语言:计算机的硬件作为一种电路元件,它的输出和输入只能是有电或者没电,也就是所说的高电平和低电平,所以计算机传递的数据是由“0”和“1”组成的二进制数。因此,二进制的语言是计算机语言的本质。计算机发明之初,人们为了去控制计算机完成自己的任务或者项目,只能去编写“0”、“1”这样的二进制数字串去控制电脑,其实就是控制计算机硬件的高低电平或通路开路,这种语言就是机器语言。

汇编语言(assemblylanguage):一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。汇编语言和CPU架构相关,不同架构(如x86, powerpc, arm)的CPU指令并不相同。

高级语言:在编程语言经历了机器语言,汇编语言等更新之后,人们发现了限制程序推广的关键因素 --程序的可移植性。需要设计一个能够不依赖于计算机硬件,能够在不同机器上运行的程序。这样可以免去很多编程的重复过程,提高效率,同时这种语言又要接近于数学语言或人的自然语言。因此发展出高级语言,像C、java、python等都是高级语言。

汇编语言的特点:

1.目标代码简短,占用内存少,执行速度快

2.比起机器语言。更加便于记忆和书写

3.汇编语言与机器相关

寄存器

寄存器是CPU内部的高速存储单元,访问速度比内存快得多,而且价格也高得多(单位空间,寄存器的价格要比内存贵,内存要比硬盘贵)。常用的寄存器分为四类,分别是8个通用寄存器,6个段寄存器,1个标志寄存器和1个指令指针寄存器

数据寄存器

数据寄存器主要用于各种运算和数据的传送,每个数据寄存器都可以作为一个32位、16位或8位来使用。以寄存器EAX为例EAX寄存器可以存储32位的数据,EAX的低16位可以表示为AX,可以存储16位的数据。AX寄存器又可分为AH和AL两个8位的寄存器,AH对应AX寄存器的高8位,AL对应AX寄存器的低8位。

用途:

EAX:称为累加器,因为它被用来作很多算术运算

EBX:基地址寄存器,在内存寻址时存放基地址

ECX:计数器,因为它被用来保存循环的索引(就是循环次数)

EDX:用来放整数除法产生的余数

说明:以上为每个数据寄存器的默认作用,但编写代码时并不是必须按上述用途使用

指针变址寄存器

指针变址寄存器可以按照32位或16位进行使用,但是无法分割为8为来使用

用途:

EBP:堆栈基址指针寄存器,可以用来访问堆栈中的数据

ESP:专门用作堆栈指针,被形象的称为栈顶指针,配合EBP来访问栈顶数据

ESI:源指针寄存器,用于内存数据的传送,DS:ESI指向源串

EDI:目的指针寄存器,用于内存数据的传送,DS:EDI指向目的串

段寄存器

段寄存器被用于存放段的基地址,段是一块预分配的内存区域。有些段存放有程序的指令,有些则存放有程序的变量,另外还有其他的段,如堆栈段存放着函数变量和函数参数等。在16位CPU中,段寄存器只有4个,分别是CS(代码段)、DS(数据段)、SS(堆栈段)和ES(附加段)。在32位CPU中,段寄存器从4个扩展为6个,分别是CS、DS、SS、ES、FS和GS。FS和GS段寄存器也属于附加的段寄存器。

指令指针寄存器EIP

EIP寄存器 (16位CPU中称为IP),保存着下一条要执行的指令的地址(CS:EIP)。顺序执行汇编代码时,下一条指令的地址为当前指令的地址加当前指令的长度,即EIP=EIP+Length;遇到JMP、JE、LOOP等跳转指令,会指定EIP的值为跳转目的地,导致CPU执行指令产生跳跃性执行,从而构成分支与循环的程序结构。

标志寄存器

在16位CPU中,标志寄存器称为FLAGS。在32位CPU中,标志寄存器也随之扩展为32位,被称为EFLAGS

常用指令

section含义
.text代码段,用于存放可执行程序,也就是对应架构下程序的指令序列

.data

数据段,用于存放编译时就能确定的全局数据
.rodata只读数据段,存放的是只读数据,比如说字符串常量,全局const变量
.bss用于存放编译阶段无法确定的全局数据,包括未初始化的全局变量和静态变量。特点是可读写的,在程序执行之前BSS段会自动清零
.comment存放的是编译器版本等信息
.eh_frame

调试信息段

数据移动指令 

mov eax,ebx,将ebx的值赋给eax,即eax=ebx

push eax,将eax中的数据送入栈

pop ebx,将栈顶的元素移除,并放入ebx中

lea eax,[ebx+4],取地址运算,将[ebx+4]的地址(偏移地址)赋值给eax

逻辑运算指令

add eax,ecx,将两个参数值相加,并赋值给第一个参数,即eax=eax+ecx

sub eax,ecx,减法运算,即eac=eax-ecx

inc eax,自增运算,即eax=eax+1

dex eax,自减运算,即eax=eax-1

annd,or,xor,按位逻辑与,或,异或运算

shl,shr,按位左移或者右移,移动过后的空位拿0补上

流程控制指令

EIP寄存器存放着下一条要执行的指令的地址,但是我们不能直接操作EIP的值,只能通过下面的流程控制指令来隐式地给EIP赋值

jmp<label,将程序跳转到参数指定的内存地址

je,jne,jz,jg,jl等属于条件跳转地址,满足相应条件才会跳转到参数指定的内存地址

call func,调用函数命令,跳转到被调用函数的入口

ret子函数返回命令,返回到上层函数

常用逆向工具

二进制文件工具

常用的二进制文件查看,比较和修改工具有winhex,ultraedit,010 editor

查看可执行文件属性

studyPE是一款PE文件的分析集成工具,常用于查看PE文件是否加壳

在linux中,可用readelf命令查看elf文件的属性

静态分析工具

IDA Pro

使用ida打开程序,ida会对打开的文件进行初始的自动分析,尝试识别程序中的所有函数以及可能用到的库函数和数据结构,自动分析结束后,ida才会显示主窗口

动态分析工具

动态测试则是在可执行程序的运行过程中,来查找和修正程序中的语法错误和逻辑错误。Ollydbg,简称OD,是Windows平台Ring3级的程序调试利器,主要用于动态调试。选择一个 可执行程序文件打开后,可以看到OD加载可执行程序时的界面状态。OD的默认主界面是CPU窗口。CPU窗口由5个子窗口(面板)组成,分别是反汇编窗口,信息窗口,寄存器窗口,数据窗口 ,堆栈窗口

1.反汇编窗口:用于显示被调试程序的代码。它有四个栏

地址栏[Adddress]:显示距双击地址处的相对地址。再次双击基地址,则恢复为标准地址显示模式

十六进制数据栏[Hex dump]:十六进制代码

反汇编栏[DDisassembly]:调用汇编器,修改命令

注释栏[Comment]:增加或修改与命令相关的注释

2.信息窗口:用于解码反汇编窗口中选用的第一个命令的参数,信息窗口也会显示隐含的参数

3.数据窗口:用于显示内存或文件的内容

4.寄存器窗口:用于显示和解释当前所选线程的CPU寄存器中的内容。该窗口同样允许修改寄存器,并可以跟进地址到其它CPU窗口

5.堆栈窗口:用于显示当前线程的堆栈。当被调试程序暂停运行时,堆栈窗口一般会自动滚动将当前ESP指向的地址放在窗口的第一条。并且这个地址被高亮显示。在某些情况下禁止滚动会更方便一些,可以通过在堆栈窗口右键单击[锁定堆栈]来禁止堆栈自动滚动

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值