逆向工程核心原理笔记

0x1

软件逆向分为静态分析法和动态分析法.

静态分析不执行代码文件,通过观察代码文件外部特征,和通过反汇编工具查看内部代码,分析代码结构.

动态分析执行代码文件,可以观测到代码流,内存状态。和文件,注册表,网络,等软件行为.动态分析常常使用调试器(Debugger)分析程序内部结构和动作原理.

此书作者在分析软件前执行的步骤.

1,通过静态分析手机代码相关信息,通过信息推测软件的结构和行为机制.

2.通过静态分析得到的结论,和推测,可以对随后的动态分析产生很高的参考价值.和创意.

 

0x2

初学逆向,要先找到Main函数.可以先通过OD加载后.每遇到一个call.就进去看一下.如果不是所要找的main函数.就ctrl+f9返回,继续查找下一个。

查找指定函数.如Messagebox

方法1:代码执行法。 逐条执行.适合代码被调试的代码量不大,且程序功能明确的情况。代码量大并复杂.此方法不适用。

方法2:字符串检索法.

通过OllydDbg检索字符串

方法3:API检索法. Ollydbg 搜索 - 所有模块 在实际使用过程中,有编程经验,若能事先推测出代码中使用的API,则可以使用上诉方法。

当程序被保护,压缩后.不容易检索出时,可以通过,Ollydbg - 查找名称 查找ALT+M中显示的加载Dll库 如 USER32 并检索相关函数. (此自己创建的程序,与文中不符.未完成)

 

打补丁技术,可以修复已有的程序Bug,还可以向程序中添加新功能.打补丁的对象可以是文件,内存,程序代码,数据等。

打补丁的两种办法.

1.直接修改字符串缓冲区.

2.在其他内存区域生成新字符串并传递给消息函数

 

2015年1月25日13:52:32

0x3

字节序是多字节数据在计算机内存存储或网络传输时各字节的存储顺序。

分为两大类

1.小端序(Little endian)

2.大端序 (Big endian)

数据类型为字节型,Byte 长度为1字节 保存这样的数据,小端序和大端序 顺序相同

两个字节及以上,小端和大端存储顺序不同。

 

0x4

寄存器是cpu内部用来存放数据的小型存储区域.因为集成在cpu内部.故有着比内存更快的读写速度。

EAX:(针对操作数和结果数据的)累加器

EBX: (DS段的数据指针)基址寄存器

ECX: (字符串和循环操作的)计数器

EDX: (I/0指针)数据寄存器

以上四个寄存器主要用在算术运算(ADD,SUB,XOR,OR)指令中.

ECX用来循环计数,每执行一次循环,ECX都会减1.EAX一般用在函数返回值中.所有Win32 API函数都会先把返回值保存到EAX再返回。

在Win32 API内部,会使用到ECX,EDX.调用后,值会改变.故,ECX,EDX保存有重要数据时,调用API前要先把数据备份到其他寄存器,或者栈.

 

EBP: (SS段中栈内数据指针)扩展基质指针寄存器

ESI: (字符串操作源指针)源变址寄存器

EDI:(字符串操作目标指针)目的变址寄存器

ESP: (SS段中栈指针)栈指针寄存器

 

ESI和EDI与特定指令(LODS,STOS,REP,MOVS等)一起使用,主要用于内存复制。

 

段是一种内存保护技术,把内存划分多个区段.并为区段赋予起始地址,范围,访问权限等.以保护内存。

段内存记录在SDT(Segment Descriptor Table,段描述符表)中,而段寄存器则持有这些SDT的索引(Index)

段寄存器有六 每个寄存器大小为16位,即2个字节。

CS: Code Segment , 代码段寄存器

SS: Stack Segment ,栈段寄存器

DS: Data Segment , 数据段寄存器

ES: Extra (Data) Segment, 附加(数据)段寄存器

FS: Data Segment, 数据段寄存器

GS: Data Segment, 数据段寄存器

 

程序设计中经常用到FS寄存器,它用于计算SEH(Structured Exception Handler 结构化异常处理机制),TEB(Thread Environment Block, 线程环境块),PEB(Process Environment Block,进程环境块)等地址.

 

程序状态与控制寄存器

EFLAGS: Flag Register, 标志寄存器 大小为4个字节(32位)由16位的FLAGS寄存器扩展而来。

现在需要掌握3个与程序调试相关的标志

ZF(Zero Flag,零标志) 若运算结果为0,则其值为1(True),否则其值为0(False).

OF(Overflow Flag,溢出标志) 有符号整数(Signed Integer)溢出时,OF值被置为1。此外,MSB(Most Significant Bit,最高有效位)改变时,其值也被设为1.

CF(Carry Flag,进位标志)无符号整数(Unsigned Integer)溢出时,其值也被置为1.

 

指令指针寄存器

EIP:Instruction Pointer ,指令指针寄存器 由16位的IP寄存器扩展而来。此指令不能直接修改,只能通过其他指令间接修改。这些指令包括,JMP,Jcc,CALL,RET.此外还可以通过中断或异常来修改EIP的值。

 

0x5

栈内存在进程中的作用

1.暂时保存函数内的局部变量。

2.调用函数时传递参数

3.保存函数返回后的地址

 

栈是一种数据结构,按照FILO(First In Last Out,后进先出)的原则存储数据。

 

2015年1月26日20:52:23

0x7

栈帧就是利用EBP寄存器访问栈内局部变量,参数,函数返回地址等手段.

因ESP寄存器的值经常变化.故使用EBP为基准,

具体实现如.

1.先保存EBP的值

push ebp

把esp传送给ebp

mov ebp,esp

随后,无论ESP如何变化,压栈,出栈. EBP都唔变化.故,可以安全访问函数的局部变量,参数。

 

最后以

mov esp,ebp  将函数的起始地址返回到esp中

pop ebp         函数返回前弹出保存在栈中的ebp值

retn               函数终止

收尾

 

最新编译器中都带有一个优化(Optimization)选项,使用该选项编译简单的函数将不会生成帧栈。

在栈中保存函数返回地址是系统安全隐患之一,攻击者使用缓冲区溢出技术,能够把保存在栈内存的返回地址更改为其他地址。

 

2015年1月27日21:36:10

 

0x8

vb文件使用名为msvbvm60.dll(Microsoft Visual Basic Virtual Machine 6.0)的专用vb引擎.(也称为The thunder runtime engine)

举个使用vb引擎的例子. 显示消息框时,vb代码中要调用msgbox()函数,其实vb编辑器真正调用的是msvbvm60.dll里的rtcMsgBox()函数.在该函数内部通过调用user32.dll里的MessageBoxW()函数(Win32 api )来工作.也可以在vb代码中直接调用user32.dll里的MessageBoxW()).

VB文件可以编译为本地代码(N code)与伪代码(P Code)

本地代码一般使用易于调试器解析的IA-32指令而伪代码是一种解释器(Interprete)语言.它使用由VB引擎实现虚拟机并可自解析的指令(字节码)。因此,若想准确解析VB的伪代码,就需要分析VB引擎并实现编译器。

 

VB主要用来编写CUI程序,VB程序采用Windows操作系统事件驱动方式工作.所以在main()或WinMain()中并不存在用户代码.(希望调试的代码)用户代码存在于各个事件处理程序之中。

VB中使用的各种信息.(Dialog,Control,Form,Module,Function等)以结构体形式保存在文件内部.由于微软未正式公开这种结构体信息,所以调试VB文件会难一些。

 

VB引擎主函数.(ThunRTMain()).

 

TEST:逻辑比较(Logical Compare)

与Bit-Wise Logical ‘and’一样(仅改变EFLAGS寄存器而不改变操作数的值)若两个操作数中一个为0,则AND运算结果被置为0->ZF=1;

JE:条件跳转指令(Jump if equal)

若ZF=1,则跳转。

posted @ 2015-01-24 15:08  DarkRoot  阅读(516)  评论(0编辑  收藏  举报