一. 前言

通过调试UPX压缩的notepade_upx.exe程序,最终找出原notepade.exe程序代码,从而进一步了解运行时压缩的相关概念
最后简单说明经过UPX 压缩文件如何通过调试器

二. 原notepade.exe

源程序的ep为01007390
alt text

三. notepade_pad.exe

3.1

加了壳的可执行文件,OEP为01015330。如下图也可知,ESI,EDI分别指向UPX1,UPX0。
alt text
notepade_upx.exe放入PEView中查看,UPX0没有内容。
alt text
但是UPX0节区有内存大小
alt text
继续查看UPX1,该节区的相对虚拟地址为为00011000
alt text
所占内存大小5000
alt text
从上可以看出被压缩的数据存放在了UPX1中,解压缩时,原数据将会被存放在UPX0,这也就是upx0内存没有内容,却还预留空间的原因。

3.2 UPX范围调试

循环一

循环次数ECX=36B,循环内容为“从EDX(01001000)中读取一个字节写人EDI(01001001)”
EDI寄存器所指的01001000地址即是第一个节区(UPX0)的起始地址,仅存在于内存中的节区(反正内容全部为NULL)。
alt text

循环二

根据上面分析EDI用于存放解压缩后的源代码,该第二次循环应该是最主要的循环。
alt text
alt text
此时存储窗口写满数据,也代表UPX0中写入数据
alt text

循环三

该段循环代码用于恢复源代码的CALL/MP指令(操作码:E8/E9)的destination地址。在01015436地址处设置断点运行后即可跳出循环。
alt text

循环四

如红方框所在内容,将名称字符串还原,放置UPX0中
alt text
此时栈内情况(01014000)
alt text

到循环四也就结束了解压缩,稍微往后翻,就可以看到原NOTepade.exe程序的EP–>0100739D
也可以看到与开头PUSHAD对应的POPAD
alt text

四. 快速找到OEP

4.1 POPAD

通过前面的调试,UPX压缩止后,开始结尾分别为PUSHAD,POPAD,其实只要在POPAD后面就可以找到原notepad.exe的EP。