第14,15章:Runtime-Packer —— UPX
对UPX压缩的Notepad.exe程序进行分析.
如图分析,第一个节区UPX0,可以看出,VirtualSize的值为10000H,而SizeOfRawData为0.
第一个节区内目前是没有任何数据的,但是虚拟地址的大小却为10000H,可以推测,它后面会放入数据---即解压后的数据.
跟踪程序执行的流程,可以发现其一直在一个大循环中.
程序首先获取到第二节区的首地址,然后逐渐将数据填入到第一节区,如果没有理解错的话,此压缩算法是:
将重复的信息的位置存储起来,并且将没有重复的单独的信息和他们放在一起,构成了密文.
解密时先将前面的一部分信息释放出来,然后循环释放即可.
继续跟踪,在执行完循环后,会循环的访问INT,并且载入函数:
有意思的是ordinal值全为1.并且GetProcAddress()也确实用的是函数名称作为参数.
执行完循环之后:
前面的pushad和这里的popad相对应:
然后就到了正常的程序中:
和正常的notepad.exe程序对比,是一样的: