逆向工程核心原理

第一章 软件逆向工程

软件逆向分析的2种方法:

1.静态分析

该方法主要使用IDA PRO等工具,对软件进行静态分析,整理软件分支结构,从而判断出软件的真正意图。

该方法适合简单应用程序以及未对代码进行保护的程序,通常加壳程序需要先对其进行脱壳才可使用IDA PRO 进行分析。

2.动态分析

该方法使用Ollydbg工具进行动态调试,使用Ollydbg进行动态调试时需要对PE文件结构,TSL回调函数,软件执行流程等有一点的认知

软件逆向工程中需要的基础知识:

1.C/C++代码知识
2.十六/二进制思维
3.汇编语言基础
4.操作系统知识

第二章 使用两种方式打补丁

1.通过直接在内存中修改

在内存中修改字符创后,重新生成PE文件,该方法局限于源字符串大小。

第三章 小端标记法

大端标记法常出现在底层,unix系统和网络协议大多使用大端标记法

小段标记法在windows和linux中被使用

小端的特点是高位放在高地址,低位放在低地址

大端的特点就是存储时像字符串一样

内存中的数据大多以4K对其方式

第四章 寄存器

X86体系结构计算机通常有如下寄存器:

8个通用寄存器 : eax ebx ecx edx esi edi esp ebp
6个段寄存器: cs ds ss es fs gs
一个状态/控制寄存器: eflags
一个程序指针寄存器: eip

eax常用于结果返回,edx通常协助eax进行计算
ebx用于地址计算
ecx用于累加
esi edi 用于数据传输
esp 堆栈当前地址
ebp 堆栈参考指针
cs 代码段
ds 数据段
ss 堆栈段
es 拓展数据段
fs gs 拓展数据段(有用的数据)

程序调试常用到FS寄存器,用于计算SEH 结构化异常处理机制,TEB 线程环境块 ,PEB 进程环境块等地址,属于高级调试必备的数据。

还有CR0-CR4 折4个控制寄存器,学习到了再讨论

第五章 栈

先进先出

第七章 栈帧

EBP保存当前栈空间位置,退出函数还原,即栈帧的概念

第八章 VB程序

消息框函数 rtcMsgBox

第十章 函数调用约定

cdecl 调用方式,调用者负责处理堆栈平衡,add esp,8
stdcall 调用方式,被调用者自行处理堆栈,return 8
fastcall 调用方式,与stdcall类似,但是会用到寄存器

第十三章 PE文件结构

用010 editor观察即可,最难的是导入表和导出表这部分

导出表 由 导出表的数据目录指向,数据目录指向的导出表地址是个链表,直到00000000结束

数据内容为一个结构一,其中有OriginalFirstThunk 和 FirstThunk 2个指针,指向一个指针数字

1数组指向需要的dll函数名
2在执行的时候,会把DLL文件中函数名的覆盖地址到该指针数组,但是未执行时该数组和1数组内容相同

第二十一章 DLL注入之Windows消息钩子

HOOK消息钩子,实现DLL注入。

第二十三章 DLL注入

方法:
1.线程注入DLL
2.注册表注入DLL
3.HOOK注入DLL
4.输入法注入DLL
5.导入表注入
6.内存注入/代码注入

第二十九章 API钩取技术(HOOK)

第三十七章 X64函数调用约定

X64中统一采用fastcall方式来调用

参数1 放在rcx XMM0
参数2 放在rdx XMM1
参数3 放在r8 XMM2
参数4 放在r9 XMM3

减少 push的使用 用move 传递参数,直接使用rsp进行堆栈操作