脱壳之DUMP数据的原理以及反Dump的方法

我们两清 提交于 2020-01-25 02:07:29

DUMP数据的原理

常见的Dump的软件有LoadPE、PETools等,这类工具在进行Dump数据的时候采用的主要的方式是利用Moudle32Next来获取将要Dump的进程的基本信息。Moudle32Next的原型如下:

BOOL Moudle32Next (HANDLE hSnapshot,LPMODULEENTRY32 lpme)
/*参数具体如下:
hSnapshot:之前调用的CreateToolhelp32Snapshot函数返回的快照
lpme  指向MODULEENTRY32结构的指针*/

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;

LoadPE和ProcDump都是先根据该结构体中的modeBaseSize和modebaseAddr这两个字段来获取对应进程的基址和大小,之后再调用ReadProcessMemory来读取进程的内存数据,ProcDump会对文件的IMAGE_DOS_SIGNATURE和IMAGE_NT_SIGNATURE进行检查,如果没有问题就基本不会继续检查,如果发现这两个字段是不完整的,就会根据上边结构体的szExePath字段对应的值打开源文件,读取源文件头来代替,相比较而言LoadPE则是直接使用源文件头。

反Dump的方法

1:修改MODULEENTRY32结构体字段
上边我们已经介绍,Dump的原理是根据MODULEENTRY32结构体的元素实现的那么我们就可以有针对性的修改相关的字段来防止数据Dump,最简单的方法就是修改MODULEENTRY32结构体的modeBaseSize字段或者modeBaseAddr字段,通过修改这两个字段之后,在进行数据Dump的时候就会因基址或者文件的大小不正确而导致Dump出来的数据出错

反反Dump的方法:对于这种方法我们可以直接到磁盘文件里边读取文件的SizeOfImage字段的值来进行修正,这样就不会得到残缺的文件,Load PE里边的correct ImageSize就可以达到这个功能
2:修改内存页的属性
PE文件在加载到内存中的时候,其所有段的属性都是可读的,也因此,在使用工具进行Dump数据的时候才可以读取数据进而将数据完整的转存,但是当我们手动将段的属性修改为不可读,那么当使用工具进行Dump的时候,就会发生某个地址不可访问的错误,也就导致数据转存失败,或者是无法获取正确的数据。

反反Dump的方法:在碰到这种情况的时候可以使用OD附加程序之后,打开内存镜像窗口,在PE头出右键设置访问权限,访问权限修改好之后就可以继续Dump

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!