读kissy的《也来谈谈POLYBOX的简单脱壳法》有感
读了kissy的也来谈谈POLYBOX的简单脱壳法,很有感受,觉得文章真的相当经典,对我也很有感触。这个方法的确是个很好的方法。学习了一下,自己写做个整理,也算是学习的一些总结和收获,并发表出来,供大家参考学习!
按照kissy的说法,其实这个壳算个捆绑壳,也就是说,这个壳并没有修改程序的源代码,而是捆绑起来,在运行的时候从内存中解密出来并且运行。
因此,我们可以从这点开始着手。
OD载入后,我们下断点:
BP WriteProcessMemory ,F9运行,然后观察堆栈。
0012FDE4 0040201B/CALL 到 WriteProcessMemory 来自 _Project.00402016
0012FDE8 00000040|hProcess = 00000040 (window)
0012FDEC 00400000|Address = 400000
0012FDF0 00920000|Buffer = 00920000
0012FDF4 00000400|BytesToWrite = 400 (1024.)
0012FDF8 0012FF48\pBytesWritten = 0012FF48
很明显可以发现,写入400个字节到缓存地址:00920000
然后我们在数据窗口CTRL+G 00920000看看:
哈,看到MZP标志了吧!
下面,我们就把这个区域给dump出来吧:
转存出来后保存为dunped.exe文件!
OK,正常运行!不过有overlay,这就用FFI处理吧。具体处理方法不在赘述!
学习这个方法后,不仅让我想起了上兴壳,于是,自己动手加了一个记事本程序,用来实践了一下!
跟了一下,发现,上兴壳同样是这种伪壳。
于是,同样下断点:BP WriteProcessMemory
F9运行后,观察堆栈!
第一次:
0012FE38 00405868/CALL 到 WriteProcessMemory 来自 _Notepad.00405863
0012FE3C 00000044|hProcess = 00000044 (window)
0012FE40 7FFD3008|Address = 7FFD3008
0012FE44 0012FF34|Buffer = 0012FF34
0012FE48 00000004|BytesToWrite = 4
0012FE4C 0012FF38\pBytesWritten = 0012FF38
发现只写了4个字节的数据,明显不是。接着F9
第二次:
0012FE38 00405884/CALL 到 WriteProcessMemory 来自 _Notepad.0040587F
0012FE3C 00000044|hProcess = 00000044 (window)
0012FE40 00400000|Address = 400000
0012FE44 01430000|Buffer = 01430000
0012FE48 00195000|BytesToWrite = 195000 (1658880.)
0012FE4C 0012FF38\pBytesWritten = 0012FF38
这次就是了,在数据窗口跟随01430000后同样发现MZP标志
于是,同样方法转存出来,程序正常运行。
wonderful !!
到此结束!
不过,说明一下,上兴这个壳还可以这么处理.F9运行后,用PETools完整转存出来就OK了!
最后感谢kissy发布这么精彩的文章,学习了,谢谢!希望以后多多分享,让我这种菜鸟能更好的学习! 好文章啊来学习下啊。。。。。。。。。。 嗯嗯
学习的好东西!~ 这个方法更简单一些。
问题是如何知道需要下BP WriteProcessMemory 这种断点,如何判断的?
谢谢 引用第4楼mojingtai于2008-07-23 16:41发表的:
这个方法更简单一些。
问题是如何知道需要下BP WriteProcessMemory 这种断点,如何判断的?
谢谢
这就需要你对一些常用的系统API有些了解吧,其次要了解壳的工作原理.
kissy已经说的很清楚,这个壳是先把资源写入内存,然后在内存中解密出来,然后运行,
很自然,我们就想到了写入内存的API,很容易想到,只要把写入内存的资源提取出来即为未加壳的程序
因此,很容易明白为什么下WriteProcessMemory断点,也很容易明白这样脱壳的原理了.
所以说,学习脱壳不是去死记脱壳的方法,而是要弄明白为什么要这样脱.
知其然更要知其所以然!这样你才能举一反三,才能更好的进步! 引用第5楼ximo于2008-07-23 23:12发表的:
这就需要你对一些常用的系统API有些了解吧,其次要了解壳的工作原理.
kissy已经说的很清楚,这个壳是先把资源写入内存,然后在内存中解密出来,然后运行,
很自然,我们就想到了写入内存的API,很容易想到,只要把写入内存的资源提取出来即为未加壳的程序
.......
感谢 超哥的答复,现在脱壳是一切的开始,对于我这样半路出家(没有接受过系统的计算机、编程等知识的学习)的人来说,要达到你说的哪种程度真的是比较困难。很难得得到这么详细的答复指教。非常感谢。你的博客找到后,现在基本每天都要去看看,希望向你好好学习,希望今后能经常的得到你的指点,再次感谢。 佩服!学习Ximo认真的态度和举一反三的能力。学习 -总结-领悟-进而举一反三真是一个好的学习方法的完美演绎啊,不过没有扎实的基础和深厚的内功举一反三是做不出来的,象我就是啊,看一些高深的有些地方都没看懂更别说举一反三了。 llflf带来了的大量的等等看看 了消息面草莓草莓{:1_907:} 尝到了的劳动力的劳动力的的的{:1_906:}{:1_905:}{:1_905:}{:1_903:}
页:
[1]
2