菜鸟脱壳之脱壳的基础知识(二) ——DUMP的原理
2017-10-11 09:14
239 查看
菜鸟脱壳之脱壳的基础知识(二)
——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文件的镜像!
完整版文档:
http://www.2cto.com/uploadfile/2012/1202/20121202072507103.zip
——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文件的镜像!
完整版文档:
http://www.2cto.com/uploadfile/2012/1202/20121202072507103.zip
相关文章推荐
- 菜鸟脱壳之脱壳的基础知识(六)——手动查找IAT和修复Dump的程序
- 菜鸟脱壳之脱壳的基础知识(三)——寻找OEP
- 菜鸟脱壳之脱壳的基础知识(四)——利用ESP定律来寻找OEP
- 菜鸟脱壳之脱壳的基础知识(五)——利用内存断点寻找OEP
- 菜鸟脱壳之脱壳的基础知识(一)
- ROS02-基础知识-原理
- 人工神经网络基础概念、原理知识(补)
- antlr指南 第二章 编译原理基础知识
- 软考基础知识—编译原理
- 流媒体技术原理及播放方式基础知识
- C#基础知识总结(二)----菜鸟篇
- .Java程序员从笨鸟到菜鸟之(四十一)细谈struts2(五)action基础知识和数据校验
- autoMonkey框架原理与应用(一):Monkey基础知识与测试场景
- 脱壳基础知识入门
- PHP学习入门的一些基础知识(菜鸟必看)
- Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序)
- Java基础知识强化之网络编程笔记02:Socket通信原理图解
- JVM菜鸟进阶高手之路十(基础知识开场白)
- Hadoop基础知识---之YARN原理简述
- MyBatis01 MyBatis基础知识【搞清楚原理】