浅谈脱壳中的Dump技术4
本帖最后由 whypro 于 2010-5-27 17:29 编辑第一章. Dump的原理
Knowledge is a treasure, but practice is the key to it.
知识是一宝库,而实践就是开启宝库大门的钥匙。
——Fuller
如果说要讲dump的原理,那么我们最简单的办法就是自己写一个象LordPE那样的dump程序。下面我就来详细说明一下,一个dump程序是如何工作的,如何把内存中的数据保存到文件中的。
一.分析
对于dump来说,他的英文翻译就是“转存”。也就是说把内存中或者其他的输入转存到另一个位置,当然对于我们现在说的dump就是把内存中运行的PE进程的数据,从内存中抓取出来,然后在用文件的形式保存下来。
根据上面的分析我们基本上得到了一个这样的思维。Dump程序要做的事分几个基本的步骤:
1. 在系统中找到目标进程
2. 在进程中确定进程的大小imagesize
3. 把进程中的数据保存到文件
二.实现
好了,现在我们就可以具体来实现各个部分的功能了。
1. 在系统中找到目标进程就是实现一个基本的任务管理器的把进程列出的功能。
在这个实现中我们采用了BOOL GetProcessListFunc(HWND hDlg,HWND hWindList);这个函数里面调用了几个基本的函数:CreateToolhelp32Snapshot,Process32First, Process32Next
这个列出进程的功能就轻松的实现了。(具体的请看我的代码Lenus_dump_1.cpp)
2. 在进程中确定要dump的大小是一件很有意思的事情,我打算慢慢的讲解寻找这数据的办法,这一节我们先用一个基本的方法。
我们先用一个笨一点的办法,根据PE文件格式可以知道在距离PE文件头(IMAGE_NT_SIGNATURE)0x50的位置是存放imageofsize的地方。所以在int GetSizeOfImage(HWND hDlg,HANDLE hProcess);这个函数中,我们找到了进程以后打开目标进程,然后用ReadProcessMemory来读取imageofsize就可以了。
在这里我还用BOOL CheckPEFunc(HWND hDlg,HANDLE hProcess);函数简单的检查了了两个PE文件的标志(IMAGE_DOS_SIGNATURE和IMAGE_NT_SIGNATURE)
3. 在把进程中的数据保存到硬盘的文件的步骤中,我使用了一个比较笨的办法。
首先,我们用LPCTSTR SaveAsFunc(HWND hDlg);函数把打开一个save as的通用控件,获
页:
[1]