用PEiD查壳
![292581-20160531200811758-2130788145.png](https://i-blog.csdnimg.cn/blog_migrate/931a2aed249dd074d902b0774014d26a.png)
UPX v0.89.6 - v1.02 / v1.05 - v1.22 这个是入门的壳,只是一个简单的压缩壳
用Stud_PE查看PE文件头信息
![292581-20160531200812367-1951626471.png](https://i-blog.csdnimg.cn/blog_migrate/60e2bc25ee137fc8d32f0d35c185228b.png)
主要是看一下ImageBase的值 00400000,这是一个16进制数。在后面OD载入后,可以用这个值在内存映像中查看PE文件加载到内存后的情况。
还有EntryPoint的值: 0000E8C0 程序入口
OD载入看内存映像
![292581-20160531200812789-1382379265.png](https://i-blog.csdnimg.cn/blog_migrate/db79a78c06bf31649cedf6347698a349.png)
用OD载入,ALT+M打开这个窗口,就可以看到upx.exe程序加载到内存后的映像,主要有四块,但重要的是
区段UPX0和
区段UPX1。因为
区段UPX0就是原程序压缩后的代码存放区,而
区段UPX1就是UPX壳的执行代码。
OD中单步跟踪,找OEP
F8键单步跟踪法,学习了前辈
总结
的两点:
①程序都向下执行的,所以遇到向上的jump,鼠标配合F4键,跳过向上的jump;
![292581-20160531200813336-992042367.png](https://i-blog.csdnimg.cn/blog_migrate/4b8a12404f5bfe9751c72f5cc14b1e15.png)
遇到向下的jmp直接F8继续执行。
![292581-20160531200813758-1339655472.png](https://i-blog.csdnimg.cn/blog_migrate/a6b841001268f1f20deb8b1496660b47.png)
运行到0040E8E9可以看到这是一个向上跳转,而且通过下边的提示窗口得知这个跳转是已实现的。这时,就需要用鼠标点一下0040E8EB这一行, 也就是跳转的下一行。
![292581-20160531200814102-920311398.png](https://i-blog.csdnimg.cn/blog_migrate/9d6c5ccad0b896dccf09956dd6df0b10.png)
再按一下F4键,就可以通过上面向上跳的jump了
![292581-20160531200814430-299226042.png](https://i-blog.csdnimg.cn/blog_migrate/45f0f3950ff2e7d4b2d2b61528c34ef2.png)
※注意:
![292581-20160531200814774-1785716294.png](https://i-blog.csdnimg.cn/blog_migrate/0c571833c5f8b859ffcece7c811b9a4e.png)
运行到这里,会遇到一个特殊情况,就是向上jump后面还是一个向上jump,我们可以用鼠标选中0040E974行的jump,再按F4,运行到0040E974行
![292581-20160531200815196-815080804.png](https://i-blog.csdnimg.cn/blog_migrate/f7b08c9af9f90a72d6920f53117470b3.png)
oh,no~~ 还是向上跳的, 那就老方法,鼠标选中下一行,再按F4?
不行,
0040E974行的下一行, 是一个nop指令,而OD是不能在nop上下断点的, 所以要注意。
因此我们可以顺势再向下一行,鼠标选中0040E97C行, 再按F4通过:
![292581-20160531200815539-2000656633.png](https://i-blog.csdnimg.cn/blog_migrate/e8905926d9b47cd794940c61f285f369.png)
②当发生区段间的跳转, 证明程序即将运行到OEP。
![292581-20160531200815977-222546986.png](https://i-blog.csdnimg.cn/blog_migrate/b9f6e878bf26a2aa9cf6aefbf2c0bba9.png)
运行到上图的位置时, 因为已经到了壳代码区的最尾部了,因为从这个位置到区段的结尾,内存都是00,为空。
在0040EA06行上, 也是一个向上跳转, 但这些还用老方法的时候,就会发现,程序根本就不会暂停在0040EA08行,而是程序直接就运行了。这是因为这个jump向上执行的过程,执行了一个直接跳转到0040EA0E行的指令, 这个可以跟踪一下。所以这里可以鼠标直接选中0040EA0E行,再F4。
![292581-20160531200816289-1252646003.png](https://i-blog.csdnimg.cn/blog_migrate/685c02a47a77b36d6d26aaaefbd52dbf.png)
执行到这里, 后面是没代码, 而且这个jump很奇怪,没有红线标明会跳转到哪里了?
那是因为这是个长跳,就是长距离的跳转。就很可能是区段间的跳转哦!我可是有证据的:
先把内存映像拿下来:
![292581-20160531200816680-1726693064.png](https://i-blog.csdnimg.cn/blog_migrate/872db4983c73a21c04c681151d096b33.png)
这行指令是在 0040EA0F行上, 很明显是属于UPX1区段的。
但指令: jmp UPX.004010CC, 明显是属于UPX0区段的哦,是不是从UPX1区段跳转到UPX0区段了!
前辈总结过,区段间跳转,很可能就是进入到OEP的时候,所以我们再F8跟踪下去:
![292581-20160531200817133-1740286602.png](https://i-blog.csdnimg.cn/blog_migrate/1d2d2fe69c268647c27d22c89fdfbb6c.png)
到这里, 就是脱壳后的OEP了。至于我为什么会知道呢?前辈的经验!
找到OEP后,OllyDump把脱壳后程序保存
程序暂停在004010CC行,就可以鼠标在汇编窗右键:
![292581-20160531200817852-316219932.png](https://i-blog.csdnimg.cn/blog_migrate/0024df5b51a5e1973b76977ddd2cf8b5.png)
这是一个OllyDump插件,怎么加插件可以百度一下~~~~
![292581-20160531200818586-531966939.png](https://i-blog.csdnimg.cn/blog_migrate/fb999a0586b2056163960ebb7aeba172.png)
在dump的时候,要注意一下入口点地址,一般OD跟踪的都是可以通过EIP作为OEP。
另外就是下边的重建输入表, 对于UPX加壳的, 可以直接使用这里面的, 如果不使用会怎么样,等一下再说。
基本上没什么问题了, 就点击一下【脱壳】按钮进行保存,再运行一下保存后的可以执行文件,测试一下!没问题就OK了。
最后是再用PEiD查一下脱壳后的文件是否脱干净了:
![292581-20160531200819055-296303270.png](https://i-blog.csdnimg.cn/blog_migrate/658d13a612f5945f3af7412ab5037327.png)
用工具重建输入表
在这里,就不使用OllyDump里的重建输入表功能,一样在不选中重建输入表的情况下脱壳:
![292581-20160531200819696-1886263570.png](https://i-blog.csdnimg.cn/blog_migrate/898a20174a596e2c7a2b68a2142970c9.png)
这样脱壳出来的文件是不可执行的:
![292581-20160531200820196-1015961205.jpg](https://i-blog.csdnimg.cn/blog_migrate/0882ad7f005554058df06ba2eee8c7e8.jpeg)
因为在加壳后,程序的输入表都被破坏的,所以很多时候脱壳后都需要修复一下程序的输入表,这里用到的工具叫: Import REC
Import REC的使用
①
跟踪到OEP的OD,千万不要关
②
运行Import REC,在【选取一个活动进程】下面选取正在脱壳的程序进程, 然后还需要在右边【需要的IAT信息】中,在【OEP】项输入OD跟踪到的OEP, 再点击【自动查找IAT】, 最后点一下【获取输入表】。
![292581-20160531200820805-46734499.png](https://i-blog.csdnimg.cn/blog_migrate/beb4fccd2410c71a0e9617c54bbed2fa.png)
因为UPX壳并没有对API进行钩取,所以不用多做其他操作。但在其他一些壳中,壳会对API进行钩取,这时就需要点一下【无效函数】按钮,显示出一些无效函数的列表, 再进行清除就好!
③
在完成上面的步骤后, 就可以点击【转储到文件】按钮,会弹出一个选择文件的窗口,这时我们需要选中在OD用OllyDump脱壳出来的文件就行了,再点打开。
![292581-20160531200821477-511675863.png](https://i-blog.csdnimg.cn/blog_migrate/00b4b154bda4f141ab21f9a5ffef6740.png)
④去查看一下, 会多了一个文件,要
做测试
运行一下并再查一下壳
![292581-20160531200821930-399427057.png](https://i-blog.csdnimg.cn/blog_migrate/3d417cd8a4b72181773ec8e87e631153.png)
![292581-20160531200822430-1131450663.png](https://i-blog.csdnimg.cn/blog_migrate/1a229905b5fe33770a30a69fd464ad5c.png)
重建PE文件
![292581-20160531200822992-1191670672.png](https://i-blog.csdnimg.cn/blog_migrate/b57038c84a0e8e319d692a64c1416f46.png)
到了上面的步骤,其实脱壳的工作都基本上算完成了,但回想一下,加壳后的程序,是有两个比较重要的区段UPX0、UPX1,其实UPX1是存放壳代码的,但脱壳后,壳代码就没用了,那干嘛还留着呢?
在重建PE文件时, 需要用到工具LordPE,先运行LordPE:
![292581-20160531200823774-839167424.png](https://i-blog.csdnimg.cn/blog_migrate/642bcd69be9855568a15adbe82d430b0.png)
运行后,不要把文件拖进来,而是点【PE编辑器】按钮:
![292581-20160531200824336-2025961063.jpg](https://i-blog.csdnimg.cn/blog_migrate/a95c5ba25fba31c2db2379cfe1940d84.jpeg)
![292581-20160531200824946-1780551356.png](https://i-blog.csdnimg.cn/blog_migrate/21f95c0d2044a72218246a610efa3a46.png)
打开了需要重建的文件后, 会显示上面的窗口, 这里点右边的区段,再如下操作:
![292581-20160531200825914-1245467369.jpg](https://i-blog.csdnimg.cn/blog_migrate/a5230344e7bbb433780043ba0746f4cd.jpeg)
选中需要删除的区段,鼠标右键,在右键菜单中点击【清除区段】,再关闭【区段表】窗口,回到【PE编辑器】窗口, 先点一下【保存】,再点【确认】哦!
此时窗口自动关闭,回到LoadPE, 这里需要点击右侧的【重建PE】按钮:
![292581-20160531200826774-1576228999.png](https://i-blog.csdnimg.cn/blog_migrate/cf017cd6cdc4849614ddcfceb2b96eb8.png)
选中刚刚操作的文件:
![292581-20160531200827539-1876316066.jpg](https://i-blog.csdnimg.cn/blog_migrate/75bc26fcabb5f8e76e9dadd23499aa05.jpeg)
就自动重建完成的:
![292581-20160531200828149-1436651971.jpg](https://i-blog.csdnimg.cn/blog_migrate/407b25eac0fefde7d513b4be926a3ffc.jpeg)
最后, 一定要运行一下做测试! OK~~~~
附件列表