一、脱壳是否成功的标志
一般说来,对软件脱壳是不会改变原软件的运行机制的。它只是将加密的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
…………………………………………………………………………
为什么软件脱壳后打不开了
脱壳后打不开有很多种情况,比如你脱壳方法不对,脱壳后你没有修复,脱壳后运行遇到自校验。
DLL文件Resharker打不开说明DLL也加了壳,位图当然看不到。
当然可以让它不弹网页和弹自己定制的网页了。
找到弹网页的地方NOP掉就不弹了,或者把网址改成自己的。
软件基本上是用ShellExecute来弹的,下这个断点找到关键的地方。
软件脱壳以后怎么去使用?是不是等于破解?
脱壳是破解的前提,不脱壳是无法破解的,脱壳以后用反汇编工具打开软件,然后哦再去破解,当然反汇编较难,不经过学习很难掌握!
脱壳后运行没有反应
很明显,程序有自校验。
程序的自校验在发现被脱壳后,直接让程序退出了。
关于自检验的处理方法,看雪论坛上有详细说明。
以下内容引自看雪论坛:(原作者:laomms)
自校检是许多软件的保护手段之一,对软件加个简单的壳再增加自校检在一定程序上可以抵挡住一大部分新手,不过,对许多人来说,这个保护已经很弱了。可是,搜索论坛,居然没有一篇系统的文章。不知道是大家太忙了还是因为要守住点秘密。其实大部分技术应该拿出来交流才好,只有交流才有进步。就象老王的EPE,netsowell一次一次的脱壳文章,才促使老王一次一次的升级,保护强度也越来越强。废话一堆,不讲了。下面讲几种常见的解决自校检方法,写的粗略,希望大家补充。
1、通用对比法。就是将已经触发自校检的程序与原来正常的程序进行关键跳转对比,这种方法比较通用,大部分的自校检可以通过此方法解决(如果软件有防多开窗口的限制,需
要先解决这个问题。)附件中的sample1.EXE是一个加了ASPACK的自校检程序,修改任何代码或大小等都会触发校检提示软件被修改。dumped.EXE是脱壳后的文件,由于触发校检运行后出现“文件被非法修改”的提示,现在我们来解决脱壳后文件的自校检问题。打开脱壳后的程序dumped.EXE,下断BP CreateFileA,F9两次后出现出错提示。CTRL+F2重新载入dumped.EXE,下断BP reateFileA,F9一次。这时另开一个OD打开原来的程序sample1.EXE,用脚本到达OEP,命令中也下断BP CreateFileA,F9一次,这时两个OD停在同一个地方,然后在两个OD中逐步单步跟踪,碰到JE、JNE、JBE...之类的关键跳转要对比一下两者的区别。
7C801A24 > 8BFF MOV EDI,EDI ; BP CreateFileA断在这里,ALT+F9返回
7C801A26 55 PUSH EBP
=================
0040111C |. 3BF4 CMP ESI,ESP ; 都停在这里,逐步F8,进行关键跳转的对比
0040111E |. E8 0D030000 CALL crcdumpe.00401430
00401123 |. 8985 E0FEFFFF MOV DWORD PTR SS:[EBP-120],EAX
00401129 |. 83BD E0FEFFFF>CMP DWORD PTR SS:[EBP-120],-1
00401130 |. 75 07 JNZ SHORT crcdumpe.00401139
逐步F8,跟到下面的代码时,发现两个跳转不一样:
0040120C /75 07 JNZ SHORT crc.00401215 ; 原版这个地方信息窗口提示:跳转没有实现
0040120E |B8 01000000 MOV EAX,1
00401213 |EB 02 JMP SHORT crc.00401217
00401215 \33C0 XOR EAX,EAX
=======================
0040120C |. /75 07 JNZ SHORT crcdumpe.00401215 ; 脱壳版这个地方信息窗口提示:跳转已经实现,NOP掉
0040120E |. |B8 01000000 MOV EAX,1
00401213 |. |EB 02 JMP SHORT crcdumpe.00401217
00401215 |> \33C0 XOR EAX,EAX
这时将脱壳版0040120C处代码NOP掉后另存为dumpedFIX.EXE。试着运行一下,如果正常完事,还不行的话继续跟踪下去。该例只改这一处。
2、跟踪退出函数。附件中sample2也是个自校检程序,修改任何一处软件会自动退出。我们试着用UltraEdit将sample2.EXE的最后一个字节改为01后另存为sample2-change.EXE,这时运行sample2-change就会自动退出,我们就是要从退出函数入手。软件退出一般都是调用ExitProcess、PostQuitMessage之类的,我们用OD载入sample2-change.EXE,从输入表中我们可以看出软件是调用ExitProcess退出的。于是在OD中下断BP ExitProcess,F9运行,断下后看堆栈信息:
0012FEB8 004015B5 /CALL 到 ExitProcess 来自 sample2-.004015AF //从这里我们可以看出ExitProcess的调用地方是在004015AF
0012FEBC 00000000 \ExitCode = 0
0012FEC0 20DFA6E6
在OD中CTRL+G,输入004015AF:
004015AF |. FF15 AC514200 CALL DWORD PTR DS:[<&KERNEL32.ExitProces>; \就在这里,向上找这个子CALL的首部
004015B5 |> 8BE5 MOV ESP,EBP
004015B7 |. 5D POP EBP
004015B8 \. C3 RETN
=======================================
004014E0 /$ 55 PUSH EBP ; 找到这里,注意信息栏的内容
004014E1 |. 8BEC MOV EBP,ESP
004014E3 |. 51 PUSH ECX
004014E4 |. 833D F8354200>CMP DWORD PTR DS:[4235F8],1
004014EB |. 75 11 JNZ SHORT sample2-.004014FE
信息栏的内容:
Local Calls from 0040146B, 0040148B, 004014A9, 004014C9
也就是说有四个地方调用ExitProcess退出,因为程序的退出按钮和关闭的叉号也是调用ExitProcess函数的,一般都会在前面几个,我们在内容上右击,“前往CALL来自0040146B”
0040146B |. E8 70000000 CALL sample2-.004014E0 ; \到这里,同样查找首部
00401470 |. 83C4 0C ADD ESP,0C
00401473 |. 5D POP EBP
00401474 \. C3 RETN
============
00401460 /$ 55 PUSH EBP ; 在这里,信息栏提示:Local Calls from 00401072, <ModuleEntryPoint>+11A
00401461 |. 8BEC MOV EBP,ESP
00401463 |. 6A 00 PUSH 0 ; /Arg3 = 00000000
00401465 |. 6A 00 PUSH 0 ; |Arg2 = 00000000
在Local Calls from 00401072上右击,前往CALL来自00401072:
00401048 |. E8 BDFFFFFF CALL sample2-.0040100A
0040104D |. 85C0 TEST EAX,EAX
0040104F |. 74 1F JE SHORT sample2-.00401070 ; 是从这里跳过去的,NOP掉
00401051 |. 8BF4 MOV ESI,ESP
00401053 |. 6A 30 PUSH 30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
00401055 |. 68 28004200 PUSH sample2-.00420028 ; |Title = "提示"
0040105A |. 68 1C004200 PUSH sample2-.0042001C ; |Text = "正常运行!"
0040105F |. 6A 00 PUSH 0 ; |hOwner = NULL
00401061 |. FF15 B4524200 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
00401067 |. 3BF4 CMP ESI,ESP
00401069 |. E8 82050000 CALL sample2-.004015F0
0040106E |. EB 07 JMP SHORT sample2-.00401077
00401070 |> 6A 00 PUSH 0
00401072 |. E8 E9030000 CALL sample2-.00401460 ; 就是这里了,最终会调用ExitProcess,向上看是从哪里跳过来
00401077 |> 33C0 XOR EAX,EAX
可以看出,00401072处的CALL最终呼叫ExitProcess退出,所以只要使0040104F处的跳转失效即可,将0040104F的跳转NOP掉后保存,测试运行正常。
三、利用第三方软件辅助查找关键的地方。很多软件利用CRC或者MD5实现磁盘文件校验或者内存映像校验等,对此类软件我们可以利用算法识别工具找到密码学算法和核心,然后层层向上,找到最初的调用地方更改其流程方向。还是附件中的sample1.EXE,脱壳的文件为dumped.EXE,我们来解决这个软件的自校检。先用PEID的插件kanal分析dumped.EXE所采的密码学算法,如图,
可以看出,软件采用了CRC算法,算法特征码出现在0040131C,就从这里入手,OD载入dumped.EXE,CTRL+G搜索0040131C:
0040131C |? 2083 B8ED898D AND BYTE PTR DS:[EBX+8D89EDB8],AL ; 找到的地方在这里,上拉找到这个CALL的首部
00401322 |? FC CLD
00401323 |? FB STI
00401324 |? FFFF ??? ; 未知命令
00401326 |. EB 0E ||JMP SHORT crcdumpe.00401336
00401328 |> 8B95 FCFBFFFF ||MOV EDX,DWORD PTR SS:[EBP-404]
0040132E |. D1EA ||SHR EDX,1
00401330 |. 8995 FCFBFFFF ||MOV DWORD PTR SS:[EBP-404],EDX
00401336 |>^ EB B5 |\JMP SHORT crcdumpe.004012ED
00401338 |> 8B85 F8FBFFFF |MOV EAX,DWORD PTR SS:[EBP-408]
0040133E |. 8B8D FCFBFFFF |MOV ECX,DWORD PTR SS:[EBP-404]
00401344 |. 898C85 00FCFF>|MOV DWORD PTR SS:[EBP+EAX*4-400],ECX
0040134B |.^ E9 6AFFFFFF \JMP crcdumpe.004012BA
============================
00401290 /> \55 PUSH EBP ; 到这里,看OD的提示栏:Jump from 00401005,从00401005跳转来的
00401291 |. 8BEC MOV EBP,ESP
00401293 |. 81EC 50040000 SUB ESP,450
00401299 |. 53 PUSH EBX
0040129A |. 56 PUSH ESI
在Jump from 00401005上右击,“前往JMP 来自00401005”
00401005 $ /E9 86020000 JMP crcdumpe.00401290 ; 到这里,看信息栏内容:Local Call from 00401201,00401201处的CALL调用这里
0040100A $ |E9 B1000000 JMP crcdumpe.004010C0
在Local Call from 00401201上右击,“前往CALL 来自00401201”
00401201 |. E8 FFFDFFFF CALL crcdumpe.00401005 ; 到这里,再向上找到这个CALL的顶部
00401206 |. 83C4 08 ADD ESP,8
==================
004010C0 /> \55 PUSH EBP ; 到这里,看任务栏信息:Jump from 0040100A
004010C1 |. 8BEC MOV EBP,ESP
004010C3 |. 81EC 64010000 SUB ESP,164
在Jump from 0040100A上右击,“前往JMP 来自0040100A”
0040100A $ /E9 B1000000 JMP crcdumpe.004010C0 ; 到这里,继续根据任务栏信息向上找:Local Call from 00401048
0040100F $ |E9 1C000000 JMP crcdumpe.00401030
在Local Call from 00401048上右击,“前往CALL 来自00401048”
00401048 |. E8 BDFFFFFF CALL crcdumpe.0040100A ; 就是这里了,计算CRC并进行对比的CALL
0040104D |. 85C0 TEST EAX,EAX
0040104F |. 74 1F JE SHORT crcdumpe.00401070 ; 这里就是关键跳转了,NOP掉
00401051 |. 8BF4 MOV ESI,ESP
00401053 |. 6A 30 PUSH 30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
00401055 |. 68 40004200 PUSH crcdumpe.00420040 ; |Title = "提示"
0040105A |. 68 34004200 PUSH crcdumpe.00420034 ; |Text = "正常运行!"
0040105F |. 6A 00 PUSH 0 ; |hOwner = NULL
00401061 |. FF15 B4524200 CALL DWORD PTR DS:[<&user32.MessageBoxA>>; \MessageBoxA
更改0040104F处的跳转后保存为dumpedFIX,运行正常。
四、对付校检自身大小的软件的一般方法。也有许多软件,利用CHECKSUM、FILELEN等在代码中对本身的大小做了标记,如果发现大小变了就自动退出。附件中的FILELEN就是这样的,FILELEN-UNPACK.EXE是脱壳后的软件,由于脱壳后软件大小发生了变化,所以FILELEN-UNPACK运行后就自动退出。对付这种校检,我们有个简单的方法,就是将脱壳后的软件中检测自身大小的部分改为脱壳后文件的大小。我们看一下FILELEN的大小为:10752字节转16进制为2A00,再看看脱壳后的文件FILELEN-UNPACK.EXE的大小30208字节,即7600,关键是如何找到对自身大小进行对比的语句,我们知道一般的形式都是CMP EAX,2A00,但是到底是哪个寄存器呢?EAX,EBX、ECX....,寄存器种类比较多,我们不可能每个去找,这时W32Dasm派上用场。用W32Dasm载入FILELEN-UNPACK,我们只要搜索00002A00即可,前面的部分不管它,找到在这里:
:00401B8F 81FE002A0000 cmp esi, 00002A00
右击-“HEX”,更改代码002A00为脱壳后的大小007600即可,再搜索,发现该例只有一个对比的地方,保存后运行正常。
对于VB检测自身大小的软件我们还可以跟踪FileLen函数,因为VB一般都用FileLen检测自身的大小,用OD载入FILELEN-UNPACK.EXE,下断BP rtcFileLen,F9后断下,ALT+F9返回:
00401B5E . 8BF0 MOV ESI,EAX ; 这里EAX的值就是FILELEN取得的自身的大小,EAX=00007600
00401B60 . 8D55 D4 LEA EDX,DWORD PTR SS:[EBP-2C]
00401B63 . 8D45 D8 LEA EAX,DWORD PTR SS:[EBP-28]
00401B66 . 52 PUSH EDX
00401B67 . 8D4D E0 LEA ECX,DWORD PTR SS:[EBP-20]
00401B6A . 50 PUSH EAX
00401B6B . 8D55 DC LEA EDX,DWORD PTR SS:[EBP-24]
00401B6E . 51 PUSH ECX
00401B6F . 8D45 E4 LEA EAX,DWORD PTR SS:[EBP-1C]
00401B72 . 52 PUSH EDX
00401B73 . 50 PUSH EAX
00401B74 . 6A 05 PUSH 5
00401B76 . FF15 70104000 CALL DWORD PTR DS:[<&msvbvm60.__vbaFreeS>; msvbvm60.__vbaFreeStrList
00401B7C . 8D4D CC LEA ECX,DWORD PTR SS:[EBP-34]
00401B7F . 8D55 D0 LEA EDX,DWORD PTR SS:[EBP-30]
00401B82 . 51 PUSH ECX
00401B83 . 52 PUSH EDX
00401B84 . 6A 02 PUSH 2
00401B86 . FF15 14104000 CALL DWORD PTR DS:[<&msvbvm60.__vbaFreeO>; msvbvm60.__vbaFreeObjList
00401B8C . 83C4 24 ADD ESP,24
00401B8F . 81FE 002A0000 CMP ESI,2A00 ; 这里就是利用FILELEN取得的大小与原来做的标记对比,可以改这里的2A00为7600或者更改下面的跳转
00401B95 . 75 6E JNZ SHORT FILELEN-.00401C05
00401B97 . B9 04000280 MOV ECX,80020004
好像常见的自校检就这些,我不知道还有没有其它的,如果有希望大家能够补充完善。
脱壳无法打开读取hintsock.dll
是软件脱壳后出现的吗?
如果是就是程序没到OEP
脱壳方法错误!
找到入口了 怎么脱壳 为什么脱好后打不开了
你这个问题真不好回答~~ 找到入口后一般有两种方法(我光知道两种),
一种就是OD的自带脱壳功能,这种脱壳好像没有修复,如果有些壳需要修复的话,这种脱壳方式就不够用了,不知道你是否用的是此种脱壳方式
另一种就是找到入口后使用两个工具 LordPE 和 ImpREC FINAL 1.7汉化版 (我只有这个版本,不知道还有更高的没有) 用前者,将需要脱壳的工具dump出来(此时od还加载着你正脱壳的程序),然后使用ImpREC FINAL 加载od调试着的程序,然后再ImpREC FINAL 界面上的oep处填写上地址,这个地址,在od脱壳的地方可以找到,填写完毕以后 点击ImpREC FINAL 上的 “自动查找IAT” 和“获取输入表”,如果能获取到输入表代表就可以了,如果没有的话,入口地址可能有错误,获取到输入表后看看ImpREC FINAL 提示的那些输入表有没有错误,如果有错误那么需要修复,往往删掉那些错误的项问题也不大,如此这般操作以后 点ImpREC FINAL 上的 “转储到文件”找到你刚才用loadpe 工具dump出来的主程序打开就行了(说是打开,其实就是将刚才的一些修复指令附加到哪个主程序上,因为软件上的按钮是 打开 所以此处说打开)。
说了太多,不期望你能看明白,其实如果看操作一次,就知道了,打这些问题都弄得我有些迷糊了,更甭说你看了~~ 将就些吧,除非你找一些脱壳视频看看~~还有本人只是菜鸟,大牛路过勿喷!
我QQ630216608 +一下
来自:求助得到的回答我是才在学脱壳破解,今天脱了一个软件的壳,是UPX,可是一打开运行就自动关机了,这个是怎么回事?
脱壳之后没有找到关机call 哈哈 继续努力,
有兴趣可以来我的网站学习
百度1进制第一个就是
易语言软件怎么脱壳能打开源码
软件就算脱壳了,也看不到源码的,要用反编译器才能得源码,不过易语言反编译器还没有人开发。网上那些易语言反编译器都是骗人的
转载请注明出处51数据库 » 软件脱壳后无法打开 软件脱壳后为什么运行不了