菜鸟脱壳之脱壳的基础知识:DUMP的原理

安全 数据安全
当外壳的执行完毕后,会跳到原来的程序的入口点,即Entry Point,也可以称作OEP!当一般加密强度不是很大的壳,会在壳的末尾有一个大的跨段,跳向OEP,类似一个壳与程序入口点的“分界线!当我们到达了程序的OEP,我们就需要进行DUMP程序了,那么什么时候去DUMP一个程序呢?

当外壳的执行完毕后,会跳到原来的程序的入口点,即Entry Point,也可以称作OEP!当一般加密强度不是很大的壳,会在壳的末尾有一个大的跨段,跳向OEP,类似一个壳与程序入口点的“分界线!当我们到达了程序的OEP,我们就需要进行DUMP程序了,那么什么时候去DUMP一个程序呢?这里我引用了fly的一句话!

“手动脱壳理想的最佳dump时机是指壳已经把程序代码包括资源等数据全部解密、输入表等数据还原但还未填充系统函数地址、DLL则还未重定位,此时dump出来的文件只需修正OEP、ImportTableRVA等信息即可正常运行完成脱壳。”

并不是所有的程序都要到达OEP才能进行脱壳的,只要把压缩的全部的代码数据释放到内存中,初始化一些必需的项目,我们就可以选择合适的DUMP点了!

那么何为DUMP呢?DUMP用中文翻译过来,就是转存,也就是抓取内存镜像,就是把内存指定地址的映像文件读取出来,然后用文件等形式保存下来!

我们比较常用的DUMP软件有LordPE、PETools等工具。这些工具基本都是利用Module32Next来获取将要呗Dump进程的信息,我们打开MSDN来查看下这个函数的原型:

BOOL WINAPI Module32Next(   HANDLE hSnapshot,    LPMODULEENTRY32 lpme  );

我们再来看看他的参数:

Parameters

hSnapshot

Handle to the snapshot returned from a previous call to the CreateToolhelp32Snapshot function.  //由前面的CreateToolhelp32Snapshot 函数返回的快照

lpme

Pointer to a MODULEENTRY32 structure.  //是指向MODULEENTRY32 的指针

我们再在MSDN上面看看MODULEENTRY32的结构是什么样子的:

typedef struct tagMODULEENTRY32 {

DWORD   dwSize;                            // 这个结构的大小

DWORD   th32ModuleID;

DWORD   th32ProcessID;         //  进程的标识符

DWORD   GlblcntUsage;

DWORD   ProccntUsage;

BYTE  * modBaseAddr;       // 进程的映像基址

DWORD   modBaseSize;       //   进程的影响大小

HMODULE hModule;       //   进程的句柄

char    szModule[MAX_MODULE_NAME32 + 1];

char    szExePath[MAX_PATH];  } MODULEENTRY32;

typedef MODULEENTRY32 *  PMODULEENTRY32;  typedef MODULEENTRY32 *  LPMODULEENTRY32;

LordPE就是利用这个结构中的modBaseSize和modBaseAddr 得到进程的映像大小和基址,然后调用ReadProcessMemory来读取进程内所保存的数据,LordPE不用进程的文件头,直接读取原始的文件的文件头来用,读取内存数据后,再把进程中的数据保存到硬盘文件里。

OllyDbg的一个插件OllyDump,也支持DUMP功能,使用起来也比较简单方便,但是不方便DUMP取DLL文件的镜像!

责任编辑:蓝雨泪 来源: 红黑联盟
相关推荐

2012-12-03 11:59:31

2012-12-03 13:30:19

脱壳OEP

2018-10-25 15:13:23

APP脱壳工具

2015-09-09 09:38:40

脱壳手工脱壳软件逆向

2017-05-24 22:11:46

脱壳工具PIN安全工具

2021-04-01 10:40:22

网络安全软件

2016-11-14 19:15:37

Android

2023-07-04 07:31:06

MapReduce数据处理编程模型

2011-07-14 23:34:56

SEO

2021-11-05 15:31:01

UbuntuLinux

2011-07-29 11:32:16

路由PIM

2011-05-20 13:52:31

2011-11-04 17:26:12

2013-03-27 15:56:05

Android开发Andriod绘图

2021-08-18 16:09:39

NestJS

2015-10-10 16:31:58

2009-12-11 10:38:22

策略路由原理

2011-03-18 09:26:13

Iptables规则

2011-03-18 09:26:14

iptableslimit

2009-09-18 11:29:23

.NET CLR
点赞
收藏

51CTO技术栈公众号