调试UPX压缩的notepad程序
一. 前言
通过调试UPX压缩的notepade_upx.exe程序,最终找出原notepade.exe程序代码,从而进一步了解运行时压缩的相关概念
最后简单说明经过UPX 压缩文件如何通过调试器
二. 原notepade.exe
源程序的ep为01007390
三. notepade_pad.exe
3.1
加了壳的可执行文件,OEP为01015330。如下图也可知,ESI,EDI分别指向UPX1,UPX0。
notepade_upx.exe放入PEView中查看,UPX0没有内容。
但是UPX0节区有内存大小
继续查看UPX1,该节区的相对虚拟地址为为00011000
所占内存大小5000
从上可以看出被压缩的数据存放在了UPX1中,解压缩时,原数据将会被存放在UPX0,这也就是upx0内存没有内容,却还预留空间的原因。
3.2 UPX范围调试
循环一
循环次数ECX=36B,循环内容为“从EDX(01001000)中读取一个字节写人EDI(01001001)”
EDI寄存器所指的01001000地址即是第一个节区(UPX0)的起始地址,仅存在于内存中的节区(反正内容全部为NULL)。
循环二
根据上面分析EDI用于存放解压缩后的源代码,该第二次循环应该是最主要的循环。
此时存储窗口写满数据,也代表UPX0中写入数据
循环三
该段循环代码用于恢复源代码的CALL/MP指令(操作码:E8/E9)的destination地址。在01015436地址处设置断点运行后即可跳出循环。
循环四
如红方框所在内容,将名称字符串还原,放置UPX0中
此时栈内情况(01014000)
到循环四也就结束了解压缩,稍微往后翻,就可以看到原NOTepade.exe程序的EP–>0100739D
也可以看到与开头PUSHAD对应的POPAD
四. 快速找到OEP
4.1 POPAD
通过前面的调试,UPX压缩止后,开始结尾分别为PUSHAD,POPAD,其实只要在POPAD后面就可以找到原notepad.exe的EP。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 7ui_qi1's happy blog!
评论
ValineDisqus