浅谈UPX壳
程序员文章站
2022-04-07 09:49:39
文/图 汤力加壳软件可分为两类:一类是压缩,一类是保护。压缩的目的是减少程序体积,如ASPack、UPX、PECompact等。保护是为了防止程序被跟踪和调试,如ASProtect、幻影。壳的...
文/图 汤力
加壳软件可分为两类:一类是压缩,一类是保护。压缩的目的是减少程序体积,如ASPack、UPX、PECompact等。保护是为了防止程序被跟踪和调试,如ASProtect、幻影。壳的存在会让我们找不到程序的真实入口点,从而不能正确的分析反汇编程序,也就对程序起到了一定的保护作用。下面我们一起来认识一下一个程序有壳和没有壳的区别以及带UPX壳的一些特征,同时,我们也可以了解一下PE文件的结构。开始之前我们先准备一下工具,具体包括UPX1.24(Win32 console version)、OllyDbg、LordPE,以及自编的VC++小程序(本例中该程序叫dasmtest.exe,无dll,有一个按钮,按下后弹出一个“hello”对话框)。
这个UPX版本是一个控制台程序,也就是说我们要在DOS或者命令行下使用它。在命令行下将源程序加壳,会看到压缩率、文件格式以及加壳成功的提示,如图1所示。注意UPX命令后面的文件名要带上exe扩展名,不然会报“找不到文件”错误。
图1
对于没有加壳的源EXE文件,大小是20KB,加壳后是6.5KB。用LordPE查看两个文件的相关内容,如图2和图3所示。通过两图的比较,我们可以看到加壳后重要的变化有:程序的入口点(EntryPoint)和文件块数(NumberOfSections),当然,像文件对齐(FileAlignment)和映像大小(SizeOfImage)也会有改变。
图2 源EXE
图3 加壳后EXE
而加壳后程序入口点(EntryPoint)的改变就是这个壳困扰我们的地方。我们点LordPE的Sections按钮,查看两个文件的块信息,如图4和图5所示。可以很清楚的对比出,未加壳的源文件拥有的块名称是一个正常的PE文件所有的块名称(注意,如果发布VC++程序的时候选择的是debug版本,则会有reloc节),加壳后很明显的有UPX的痕迹。UPX将重新组织区块,并且VSize(虚拟尺寸)和Roffset(相对偏移)也显得很完整。
图4 源EXE
图5加壳后EXE
我们再来看看用OllyDbg进行调试的信息。如图6所示,源EXE程序于00401700正常的入口点(图2中能查看到的信息)开始被调试,模块在dasmtest中(标题栏显示module dasmtest)。加壳后的程序于004069B0入口(图3中能查看到的信息)开始被调试,模块依然显示在dasmtest中(标题栏显示module dasmtest),显然这不是程序的真正入口处,而是一些迷惑我们的信息,要在加壳后的文件中找到真正的入口,我们得跟踪到如图8所示的地址。在00406B08处的“JMP dasmtest.00401700”才会跳到程序的真正入口,跳进去以后,就和我们没加壳的源程序反汇编代码一样了。
图6 源EXE
图7 加壳后EXE
图8 加壳后EXE
至此,我们可以总结一下UPX壳让程序做了哪些变化:文件大小、程序的入口点、程序区块名称和程序调试信息。
其实,在OllyDbg中要找出UPX加壳文件的程序真正入口地址还是很简单的,在图7中第一句是PUSHAD,这是壳在保护现场环境,那么在OllyDbg中不需要跟踪,只需向下翻屏幕,看到“POPAD,JMP********”,就是真正的入口点了。我们可以在POPAD的下一句按下F2设置断点,让程序一开始就运行到这里,则前面的所有壳的干扰就可以被我们绕过了
加壳软件可分为两类:一类是压缩,一类是保护。压缩的目的是减少程序体积,如ASPack、UPX、PECompact等。保护是为了防止程序被跟踪和调试,如ASProtect、幻影。壳的存在会让我们找不到程序的真实入口点,从而不能正确的分析反汇编程序,也就对程序起到了一定的保护作用。下面我们一起来认识一下一个程序有壳和没有壳的区别以及带UPX壳的一些特征,同时,我们也可以了解一下PE文件的结构。开始之前我们先准备一下工具,具体包括UPX1.24(Win32 console version)、OllyDbg、LordPE,以及自编的VC++小程序(本例中该程序叫dasmtest.exe,无dll,有一个按钮,按下后弹出一个“hello”对话框)。
这个UPX版本是一个控制台程序,也就是说我们要在DOS或者命令行下使用它。在命令行下将源程序加壳,会看到压缩率、文件格式以及加壳成功的提示,如图1所示。注意UPX命令后面的文件名要带上exe扩展名,不然会报“找不到文件”错误。
图1
对于没有加壳的源EXE文件,大小是20KB,加壳后是6.5KB。用LordPE查看两个文件的相关内容,如图2和图3所示。通过两图的比较,我们可以看到加壳后重要的变化有:程序的入口点(EntryPoint)和文件块数(NumberOfSections),当然,像文件对齐(FileAlignment)和映像大小(SizeOfImage)也会有改变。
图2 源EXE
图3 加壳后EXE
而加壳后程序入口点(EntryPoint)的改变就是这个壳困扰我们的地方。我们点LordPE的Sections按钮,查看两个文件的块信息,如图4和图5所示。可以很清楚的对比出,未加壳的源文件拥有的块名称是一个正常的PE文件所有的块名称(注意,如果发布VC++程序的时候选择的是debug版本,则会有reloc节),加壳后很明显的有UPX的痕迹。UPX将重新组织区块,并且VSize(虚拟尺寸)和Roffset(相对偏移)也显得很完整。
图4 源EXE
图5加壳后EXE
我们再来看看用OllyDbg进行调试的信息。如图6所示,源EXE程序于00401700正常的入口点(图2中能查看到的信息)开始被调试,模块在dasmtest中(标题栏显示module dasmtest)。加壳后的程序于004069B0入口(图3中能查看到的信息)开始被调试,模块依然显示在dasmtest中(标题栏显示module dasmtest),显然这不是程序的真正入口处,而是一些迷惑我们的信息,要在加壳后的文件中找到真正的入口,我们得跟踪到如图8所示的地址。在00406B08处的“JMP dasmtest.00401700”才会跳到程序的真正入口,跳进去以后,就和我们没加壳的源程序反汇编代码一样了。
图6 源EXE
图7 加壳后EXE
图8 加壳后EXE
至此,我们可以总结一下UPX壳让程序做了哪些变化:文件大小、程序的入口点、程序区块名称和程序调试信息。
其实,在OllyDbg中要找出UPX加壳文件的程序真正入口地址还是很简单的,在图7中第一句是PUSHAD,这是壳在保护现场环境,那么在OllyDbg中不需要跟踪,只需向下翻屏幕,看到“POPAD,JMP********”,就是真正的入口点了。我们可以在POPAD的下一句按下F2设置断点,让程序一开始就运行到这里,则前面的所有壳的干扰就可以被我们绕过了
上一篇: webshell后门分析第二篇
下一篇: VMProtect代码还原技术