内存Dump原理

来源:互联网 发布:改键位软件 编辑:程序博客网 时间:2024/05/16 14:09

windows中一个可执行性程序被执行后,或者其他的数据文件,只要被影射到了某个进程的地址空间就有机会将它dump出来,这种技术到底有何用,举个例子,比如你有一个软件,并且设置了注册机制,而且用过特殊加密措施,比如用UPX,PECompact加密,但是如果在内存中将其给dump出来,所有的加密的壳都化为乌有,软件的保护也就化为乌有。

加密的文件必须解密后才能进驻内存,代码才能正常执行,所以在代码全部解密出来后,将内存中的未加密的数据弄出来,就是原始数据,经过一定的修正即可复原其原始未加密的版本。

为了能够弄出内存的数据,必须使用windows的一个API函数,ReadProcessMemory,通过此函数可以读取内存特定位置的数据,读取后就将其保存到磁盘。

读取数据时,按照内存页对其,一页一页搜索,找“MZ”和“PE”,0,0的标志,找到后可以保存到磁盘。磁盘中的可执行程序除了两个头(DOS头和NT头),后面紧跟的节表,节表记录后面数据的分布,后面的数据也就自然形成许多的节,各个节都有自己的属性,什么只读,可执行等。当然这些节影射到内存中也会赋予相应的属性,所以在一块只读的数据进行写操作,会发生无法写入的情况,(汇编语言可以尝试对.const中的值赋值,C语言可以尝试对用const定义的变量赋值),当然内存中的这些页基本都有读的操作,除非它自己修改了内存页的属性。

所以为了让自己做的共享软件不被别人很容易破解,最好的方法就是动态修改内存页的属性,但不再使用某个内存页时,可以使用 VirtualProtect,来完成。

看到ReadProcessMemory就会想到WriteProcessMemory,这个函数是众多内存注册机必备的。

这两个函数都是调试API一类的。

原创粉丝点击