通达信主程序脱壳全记录(图文)
-
相关简介:通达信主程序脱壳全记录(图文) UPX加壳入口第一句是PUSHAD;出口关键字POPAD;手动脱壳时,用Olldbg载入程序,脱壳程序里面会有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。 第一步,先侦壳,侦壳工具为peid0.92,侦测结果如下:(图000) (图000) 原来是UPX 0.89.6 - 1.02 / 1.05 - 1.24 - Markus Laszlo加的壳,UPX是一种压缩壳,强度很低。 第二步,我们请出调试利器:Ollydbg1.09
-
文章来源:股海网作者:股海网发布时间:2020-01-31浏览次数:
通达信主程序脱壳全记录(图文)
UPX加壳入口第一句是PUSHAD;出口关键字POPAD;手动脱壳时,用Olldbg载入程序,脱壳程序里面会有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。
第一步,先侦壳,侦壳工具为peid0.92,侦测结果如下:(图000)
(图000)
原来是UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo加的壳,UPX是一种压缩壳,强度很低。
第二步,我们请出调试利器:Ollydbg1.09,载入程序,出现提示:
找到PUSHAD(压栈)标志点(图001)
点击右键菜单,选择“编辑注释”―――“UPX1壳入口点”(图002,003)
用F8进行单步跟踪,对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈那就是设置“断点”。见上图(图004 005 006 007)
在“00986839”处有一个往回的跳转,那么就要在其下面的“0098683B”处设置“断点”―――“运行到选定位置F4”,然后继续F8往下走;碰到往下的跳转,那么随它往下走;碰到没有实现的跳转,也不用理睬,继续F8往下走。(后面碰到类似的情况,处理方法一样。)
一直往下找,直到发现“POPAD”时,在其地址处设置“断点”―――“运行到选定位置F4”,然后继续F8往下走。(图008 009)
特别注意:在据“POPAD”的地址约10-20个地址时,要停下来,仔细观测,看有没有“CALL”语句,否则有可能跑飞掉,找不到刚才所跟踪的这些地址。最好的办法是,发现“POPAD”后,直接在该语句处设置断点,接着往下走。
在走几行,就会出现上图画面,“00622838A”55 DB55 CHAR‘U’―――这是通达信主程序代码的真正入口,
也就是我们要找的“OEP”地址。(图010,011)
点击右键调出菜单,选择“用OllyDump脱壳调试进程”。(图012)
(图013)
出现上图画面,记住“修正为:22838A”,点击“脱壳”进行存盘。(图013,014)
=========下图为重新载入已脱壳的新文件(图015)==========
用“PEID”检测,提示已无壳。(图016),但该文件还不能正常启动,因为“输入表”尚未修复。
第三步,就是修复程序的输入表。使用importREC,这是最好用的输入表修复工具。
1、运行加壳的原版TDX主程序,启动importREC程序,(图018)在“附加一个活动进程”中选择“D:\通达信分析家l论坛版本\TDX.EXE”。
(图018)
2、在“所需的IAT信息”中的“OEP”填入“0022838A”,点击“自动搜索”按钮,出现下图提示:(图019)
3、点击“获取输入表”按钮:(图020)
4、点击“修复转存文件”按钮,选择前面已完成脱壳的新文件,程序会自动生成一个新的“******_。EXE”的执行文件:(图021 022)
5、再用“PEID”检测,提示已无壳,编程软件是Microsoft Visual Basic 5.0 / 6.0。
运行程序,已经可以正常运行了,脱壳完毕。
通达信主程序脱壳全记录(图文)第二集
在上一集里,我们通过手动跟踪,一步一步的完成整个脱壳过程,目的是初步认识加壳程序的一般性规律,了解程序语言的执行过程。作为初学者,反复练习,不断增强对程序流程的直觉和理解,这样的学习过程非常重要,至少我本人就是这样对待的。
小结:
第一步,侦测程序的加壳类型;
第二步,在程序中寻找壳的起点和结束点;
第三步,继续跟踪确定程序真正的入口点;
第四步,利用操作软件的功能脱壳,抓取真正的程序源码;
第五步,启动原版程序,通过软件抓取输入表,转存到已脱壳的文件里,完成整个脱壳过程;
第六步,对新文件进行检验。OK
在以上列举的流程中,最难最麻烦的是第二步,今天又学了两个新招,与大家分享。
一、ESP定律手动脱壳
1、ESP定律的原理,网上可搜寻,不再详述。见谅。
2、脱壳过程:
---用F8进行单步跟踪,对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈那就是设置“断点”。见下图(图001)
―――用F8进行单步跟踪,在右边窗口寄存器(FUP)中的“ESP”突现“0012FFA4”时停下,在左下角“命令”栏中输入“DD 0012FFA4”回车;
―――如下图所示,鼠标点选“0012FFA4”行,打开右键如图操作,断点硬件访问--WORD,F9运行;
―――直接来到这里,已经可以看到“009869C4 -E9 C119CAFF JMP TDXW.0062838A”这句了;F8跟踪;
―――在“009869BF”处有一个往回的跳转,那么就要在其下面的“009869C1”处设置“断点”―――“运行到选定位置F4”,然后继续F8往下走;(碰到往下的跳转,那么随它往下走;碰到没有实现的跳转,也不用理睬,继续F8往下走。后面碰到类似的情况,处理方法一样。)
―――在此处可能要反复几次,最终一定要走到“009869C4”这一行;
―――跳转来到这里,就是程序真正的入口;
―――点击右键,按图示操作,最终生成一个已经脱壳的新文件。
===其后的操作,和第一集中的方法一样。
二、最快的捷径
1、用F8进行单步跟踪,对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈那就是设置“断点”。
在“00986839”处有一个往回的跳转,那么就要在其下面的“0098683B”处设置“断点”―――“运行到选定位置F4”;
2、直接按“CTRL+F”,输入“popad”查找;
3、直接来到“00833260 61 POPAD”,直接在该行设置“断点”―――“运行到选定位置F4”;
4、直接跳转到:
009869B7 8D4424 80 LEA EAX,DWORD PTR SS:[ESP-80]
009869BB 6A 00 PUSH 0
009869BD 39C4 CMP ESP,EAX
009869BF ^ 75 FA JNZ SHORT TdxW.009869BB
009869C1 83EC 80 SUB ESP,-80
009869C4 - E9 C119CAFF JMP TdxW.0062838A (程序的真正入口跳转)
通达信主程序脱壳全记录(图文)第三集三、内存镜像法
ALT+M 打开内存,找到.rsrc,“设置访问中断F2”下断,F9运行,出现如下图示
再次打开ALT+M 打开内存,找到UPX0,“设置访问中断F2”下断,F9运行,出现如下图示
F9运行;其余的操作和前面所叙一样
009869B7 8D4424 80 LEA EAX,DWORD PTR SS:[ESP-80]
009869BB 6A 00 PUSH 0
009869BD 39C4 CMP ESP,EAX
009869BF ^ 75 FA JNZ SHORT TdxW.009869BB //这有一个向上的跳转,要引起注意009869C1 83EC 80 SUB ESP,-80
009869C4 - E9 C119CAFF JMP TdxW.0062838A //程序的真正入口跳转
009869C9 0000 ADD BYTE PTR DS:[EAX],AL
009869CB 0000 ADD BYTE PTR DS:[EAX],AL
009869CD 0000 ADD BYTE PTR DS:[EAX],AL
009869CF 0000 ADD BYTE PTR DS:[EAX],AL
009869D1 0000 ADD BYTE PTR DS:[EAX],AL
同花顺主程序也是UPX加壳,操作方法完全一样(不再详叙) 图001 已接近程序的入口了
图002 已完成跳转到达程序真正的入口
图003 进行脱壳操作,存盘
图004 进行输入表修复(其中有一项“?。。。。。。。。。。。。有效:无”的无效指针提示,可忽略)
最后进行检验。OK