程序分析 - task7

程序流程

仅就UPX脱壳而言难度不大,可以单步解压缩或者ESP定律直接脱壳。

单步解压缩主要是模拟程序运行每步直到程序完整解压完成进入OEP执行

ESP定律是使用的栈平衡原理,当一开始的时候和结束的时候一定会还原现场保证寄存器和栈空间的平衡,来进行快速解压缩壳

这道题如果是脱壳的话还是比较容易的

image-20191105145742497

ESP定律直接找到OEP然后不适用OD的插件脱壳,换用现在比较新的Scylla这个工具,也在x64dbg上集成了,能够脱壳。

image-20191105145924012

能够看到80个导入表全部正确,如果出现不正确的就需要手动查询修复或者删除导入表项

image-20191105150103972

可以看到这里就成功导出可以运行了,由此可以推断出这是一个老版本的UPX,新版本的UPX在脱壳之后可以静态分析,但是不改有些标志位就是无法运行的,其主要原因是重定位标志,原程序没有重定位标志但是upx给他加入了重定位标志来满足自己运行解压的需要,但是我们dump还原的程序也是带有重定位标记的,这时候就会导致脱壳之后的程序可以静态分析但是没法动态运行。


接下来单步运行探究老版UPX解密过程。

解密代码的过程记录:

esi一开始指向了0x00407000,这里存放的是一堆待解压数据

将标志值之后的一些字节放入0x00401000+一部分偏移的特殊位置

会不停的从esi的一些特征偏移取到DWORD值放入ebx并且对ebx一直执行 乘2 和 乘2+CF标志 的操作,直到为0的时候取下一个标志值(算法大概就是左移和补CF标志位)

算数左移移动一些字节

================

这些操作大概是在原始文件中有些字节是DWORD或者别的长度的字节是重复的,按照UPX的算法会计算出一个特征值,然后将其值放置于特征值之后,解压的时候按照特征值作为switch条件(不是真的switch只是描述为一个选择器)来填充相应的地址的原始值

用ESP定律脱壳完之后的程序和当前正在解压的程序对比,能看出来大概就是如上述过程的解密过程,用于填充

甚至感觉UPX的算法很好,有些时候解压出来的字节和前面的一些字节能拼成一个他能利用的数据,他也会顺便拼上使用,这个利用率很高,说明压缩率也很高

循环看了几次之后就用自动条件步过在看实际运行效果了,从解压导入表到解压代码段用的算法都是和上面叙述的一样,直接解压的,并没有单独解压

================

DWORD标志值地址大概为
0x00407000
0x0040700D
0x00407019
(这个好像并不算特别重要就不单独记录了,就只是用算法来确定执行流程,算法大概就是左移和补CF标志位)

从ESP定律解压的的程序和正在解压的程序对比。

image-20191105163614162

image-20191105163627097


第一步好像解压的第一个区段,看了下好像是idata,也就是导入表信息虽然研究不是很深,但是看得出地址都是指向了

image-20191105173338200

但是有个问题,我知道像这样的8个字节

image-20191105173518674

前面四个字节是代表着导入表的位置,后面这个感觉是个偏移,但是不知道是啥偏移,可能还得去复习一下PE结构才知道了。


通过直接设置条件断点的方式在准备跳出解压循环的je处下断。

image-20191105184240314

可以看到这时候已经解压了导入表以后的所有东西了,可是之前的还没解压

image-20191105184353533


出了循环之后开始检测特殊标记位并填充

image-20191105185016435

好像是计算偏移并填充

image-20191105185447711

虽然好像还不是还原EntryPoint,但是还原了调用的函数

image-20191105185944828

image-20191105190002232

image-20191105190011772

这是一个loop循环,应该就是通过计算还原每个call和跳转的函数

image-20191105185641320


函数都还原完之后,开始还原导入表地址使用LoadlibraryAGetProcAddress

image-20191105191952924


image-20191105192133632

还原完一个dll的导入表API之后还原另一个当所有导入表的DLL和所有DLL中的API都还原完的时候,跳出循环,使用popad还原现场,并使用jmp大跳到OEP执行程序代码,程序是VB写的。


程序是VB写的,病毒程序内容只能等后天回来的时候再看了,先分析了UPX的解压流程

总结

UPX感觉是利用算法统计了字节密集度还有有些字节拼接可以直接使用的情况来极大的优化了程序的体积