软件脱壳后为什么运行不了

如题所述

一、脱壳是否成功的标志
一般说来,对软件脱壳是不会改变原软件的运行机制的。它只是将加密的IAT地址还原成装载前的API函数名字串的地址,并以明码方式显示。脱壳是否成功的标志是软件运行前图标与脱壳前一致、运行时windows并未发出“……,初始化失败……”的警告,那么脱壳大体是成功的。若出现初始化失败警告,则百分之百是IID表或IAT表搞错了。

二、用OD加载时出现“异常”或直接运行时,windows弹出“发送错误报告”消息。
原因:
(1)OEP入口地址错误;
(2)在手动脱壳时“张冠李戴”,把某函数的地址写到了另一个函数的地址上去了。

三、软件一运行就退出
1.原因:
(1)如果脱壳前软件能(直接)运行,脱壳后软件一闪而过,说明软件有“文件校验”。软件脱壳前后的最大变化是文件尺寸变化,那么软件的“校验和”一定要发生变化,当它发现“校验和”变了时,知道了你对软件“动了手脚”,它就毫不犹豫地退出了。若这时你想找到“文件校验”的位置,无异于大海捞针!
(2)如果脱壳后能直接运行,但用OD加载时就退出或有无法跳过的异常,则是有“反跟踪”部件。(这和脱不脱壳没有关系)反跟踪不是本文今天讨论的内容,只是附带说一声。

2.对策:
在一个软件中去找出它的“文件检验”代码在什么地方,同样得用“思想”,和破案也差不多。别急,先看看它是什么语言编写的。若是用“VC++”或“Delphi”编写的,则脱壳后的软件对于使用者,则基本上没有秘密可言。唯一的是它们的“call”嵌套太深,要进行底层的跟踪,很容易跟丢。举个例子,说明跟踪方法。
有个商业软件,脱壳前可以运行,脱壳后就不能运行了。它是用“VC++”编写的。

3.破解思路:
用“VC++”或“Delphi”来编写软件,有它快捷方便的一面。但是,因为它不能直接对内存进行操作,所以灵活性受到很大影响。例如,它就不能对运行中的内存文件进行“校验和”检验,若非要检验,除非在VC编程中嵌入ASM代码,但这样一来,地址的起点和终点难于确定,且给调试带来麻烦。一个变通的办法是:打开同一文件的一个“副本”,检验它“副本”的“校验和”也可以达到对自身检验的目的。这样一来,软件的秘密也就暴露无遗了,用OD来查看(已经脱壳的)软件怎样打开另一个文件,那实在是“再容易”不过的事情了!

4.具体操作:
(1)用OD打开要跟踪的软件,右键打开搜索“所有模块间的调用”,在所有“CreateFile”和“ReadFile”的调用地址上设断点。

(2)运行OD,按“F9”,中断在一个CreateFile上:

CreateFile中断:(该函数的返回值是被打开文件的句柄)
……………………………………………………………………
0013E708 0013E90C |FileName = "E:\xxxx\New_xxxxxxx.exe"
0013E70C 80000000 |Access = GENERIC_READ
0013E710 00000003 |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
0013E714 00000000 |pSecurity = NULL
0013E718 00000003 |Mode = OPEN_EXISTING
0013E71C 00000080 |Attributes = NORMAL
0013E720 00000000 \hTemplateFile = NULL
……………………………………………………………………
以上是堆栈中的显示,其中,FileName = "E:\xxxx\New_xxxxxxx.exe"是将要打开的文件。若不是正在运行中的同名文件,则继续按“F9”。其余的参数是打开方式,不重要。
监视CreateFile中断的另一个收获是知道了该软件在硬盘上写入了哪些文件,比如注册表中、系统文件夹中等(我最讨厌那些在硬盘中乱写文件的软件)。更重要的是,若软件有“反跟踪”代码,那么“CreateFile”或“FindWindow”等API函数调用时,它明码显示的文件名或窗口名是某个“调试软件”,就表明它在“反跟踪”,若发现了它们,相应的“反—反跟踪”措施也应该不是太困难的事。当然,高明的作者用VC也会让你伤透脑筋。
当FileName=“正在运行的文件名时”, 再按“F9”来到ReadFile的中断上:

ReadFile中断:
…………………………………………………………
0013E708 000001C0 |hFile = 000001C0
0013E70C 0013EA10 |Buffer = 0013EA10
0013E710 00001000 |BytesToRead = 1000 (4096.)
0013E714 0013E71C |pBytesRead = 0013E71C
0013E718 00000000 \pOverlapped = NULL
0013E71C 00000000
0013E720 00001000
0013E724 004C5CD7
0013E728 0000016F ;调用次数记录
…………………………………………………………
其中,hFile = 000001C0是打开的文件句柄,Buffer = 0013EA10是保存读入数据的地址,BytesToRead = 1000 (4096.)是读入的字节数,其余的不重要。
由于一个软件,不可能只有1000h字节,一次不能读完,所以ReadFile要调用多次,调用的次数总可以在某个寄存器中或堆栈中找到,这里(0013E728 :0000016F)就是递减的调用次数。每调用一次,后面的程序就将这1000h字节累加一次,稍加跟踪就到了“校验和”代码处:

(3)文件“校验和”代码:
……………………………………
004E0164 . 8D85 E0EFFFFF lea eax,dword ptr ss:[ebp-1020] ;eax=读入字节存放地址
004E016A > 33C9 xor ecx,ecx
004E016C . 8A08 mov cl,byte

ptr ds:[eax]
004E016E . 014D EC add dword ptr ss:[ebp-14],ecx ;[ebp-14]=累加值
004E0171 . 40 inc eax
004E0172 . 4A dec edx ;1000h字节的计数
004E0173 .^ 75 F5 jnz short 004E016A
004E0175 > 4B dec ebx ;调用次数计数
004E0176 .^ 75 C6 jnz short 004E013E
004E0178 > 836D EC 7B sub dword ptr ss:[ebp-14],7B ;累加完成后的修正
004E017C . 8D85 48EDFFFF lea eax,dword ptr ss:[ebp-12B8]
004E0182 . E8 B564F2FF call 0040663C
………………………………………
累加结果存放在[ebp-14]=0013FA1C中。
不停地按“F9”,并观查(0013E728 :0000016F)中的值,当它变为1时,就单步跟踪,“比较转跳”代码就近在咫尺了。

(4)“比较转跳”代码:
………………………………………
004E0182 . E8 B564F2FF call 0040663C ;这就是前面的最后一行
004E0187 . E8 E826F2FF call 00402874 ;释放一些内存等善后(VC特有)
004E018C . 837D F4 00 cmp dword ptr ss:[ebp-C],0
004E0190 . 75 22 jnz short 004E01B4
004E0192 . 8B45 E4 mov eax,dword ptr ss:[ebp-1C] ;取0013FA14的检验值
004E0195 . 3B45 EC cmp eax,dword ptr ss:[ebp-14] ;和累加值比较
004E0198 75 13 jnz short 004E01AD ;最关键的(非0)转跳
004E019A . BB 01000000 mov ebx,1
004E019F . 8B45 FC mov eax,dword ptr ss:[ebp-4]
004E01A2 . FE80 10450100 inc byte ptr ds:[eax+14510]
004E01A8 . E9 96000000 jmp 004E0243
004E01AD > 33DB xor ebx,ebx
004E01AF . E9 8F000000 jmp 004E0243

5.修改代码:
到了现在,文件检验和转跳都清楚了,修改就变得十分简单,只需将:(用16进制编辑器)
……………………………………………………………………
004E0198 75 13 jnz short 004E01AD ;改为:90 90 nop ,nop
…………………………………………………………………………
温馨提示:内容为网友见解,仅供参考
无其他回答

net程序脱壳后无法运行
一些壳在运行时会进行一些特定的初始化操作,或依赖于某些特定的环境。如果脱壳过程中未能正确处理这些部分,可能导致程序无法正常运行。确保使用最新版本的脱壳工具,并查阅其文档以确保支持目标程序的壳类型。某些壳为了保护程序,会加入异常处理机制。如果在脱壳过程中未能正确处理这些机制,可能导致程序崩溃。...

软件脱壳后为什么运行不了
三、软件一运行就退出 1.原因:(1)如果脱壳前软件能(直接)运行,脱壳后软件一闪而过,说明软件有“文件校验”。软件脱壳前后的最大变化是文件尺寸变化,那么软件的“校验和”一定要发生变化,当它发现“校验和”变了时,知道了你对软件“动了手脚”,它就毫不犹豫地退出了。若这时你想找到“文件...

为什么我的一个程序在去壳了之后就不能运行
你用脱壳工具脱的,很容易出错,很正常建议手动脱,或者换个脱壳工具还有一点要注意,你可以确保你的这个程序是用ASPACK加的壳??有的程序是伪装成这种壳,其实是另一种壳,也会误导你,使你脱壳后的程序出错

为什么软件脱壳后打不开了
脱壳后打不开有很多种情况,比如你脱壳方法不对,脱壳后你没有修复,脱壳后运行遇到自校验。DLL文件Resharker打不开说明DLL也加了壳,位图当然看不到。当然可以让它不弹网页和弹自己定制的网页了。找到弹网页的地方NOP掉就不弹了,或者把网址改成自己的。软件基本上是用ShellExecute来弹的,下这个断点...

脱themida\/winlicense壳成功不能运行程序怎样修复
不能运行说明脱壳脚本不是万能的,网上的脱壳脚本最多也就是能修复大部分iat表,找到oep,不能运行的原因有很多种,有的是因为有代码加密,到oep这的时候,代码还是加密的,脱壳后解密不了,需要跟踪找到进行解密。还有就是部分iat修复错误,或者直接没修复,导致程序崩溃,这种情况比较多,需要找出来修复...

为什么程序加的有些壳,用正常的方法脱去后,程序不能运行了,为什么
可以行查看一下壳的版本 比如说ASPack1.0的壳用ASPack2.0的脱壳机去脱,那是一定会出错的 还有就是像铁甲之类的壳,加了之后会破坏入口点 脱壳后入口点无法恢复,程序就出错 关键还是要懂汇编,如果你能够修复入口点,那就没问题了

脱壳后的EXE文件c++语言的,为什么还是运行不了,
晕死 PEID 也只是通过特征码,很多都不准确的,你可以用OLLYDBG看他的EOP,很容易判断是不是VC的启动代码。至于脱壳后不能运行,那说明你脱壳不彻底,不完全,有很多壳不是简单的脱了就行的,有很多的修复工作要做

为什么脱壳后运行就提示非法?
首先你要知道你的目标是什么壳,用PEID查看。。然后去上网搜些脱文。。不过你OD都不会用就学脱壳了?先学破解吧。。找些没壳的程序练练手。。比如CRACKME 脱壳从压缩壳开始。。脱便所有压缩壳才去碰加密壳。。在脱壳之前要学PE结构。。如果不懂PE结构的话。。那你还是找点破文照样脱吧。脱壳不...

为什么脱完壳后,运行脱壳后的EXE提示说文件损坏
有附加数据或者是有自效验。

...覆盖]壳传奇登陆器,脱壳后还是运行不了,用PIED查壳显示已无壳原因...
ASPack 2.12 -> Alexey Solodovnikov [覆盖]那个覆盖说明有附加数据,要单独复制出来衔接到脱壳的文件末尾,就是有一堆0的后面。还有看看有没有自校验,因为脱壳前后的文件大小不一样,也会运行失败,等等吧。简单解决办法就是先把我说的这两点搞到,试试,祝你成功,luck!

相似回答