然后双击窗体Form1,在工具栏里选择“工程”,指向“部件”,选择“Microsoft Common Dialog Contrll 6.0”,在工具箱中选择它,添加到窗体上。并改其名为“Openfile”。注意:细节美观什么的,大家自己弄,我讲的一般不包含如何设置和美化界面什么的。如图:
在窗体通用部分添加:Private CRC32zhi As String'用作储存CRC32的值的Private Zhuangtai As Boolean'用作标志写入文件是否成功在窗体上添加按钮Command1,命名为“打开”,然后设计代码使通过它跟“Openfile”挂钩(别再问我Openfile是什么,也就是刚才我们使用的Common Dialog控件)Openfile的Action我们采用1模式,也就是常见的打开对话框;Openfile的Dialog Title我们命名为" 请选择需要添加CRC32自校验值的目标程序"Openfire的Filter属性我们设置为"*.exe"Openfire的其他属性默认即可为了计算并自动添加CRC32值到目标程序,并且方便大家复制移植代码,我们有必要给它写个过程,或者函数。这里注射写过程就好了,等下设计主体程序时我们也要写函数的。我是代码起始线————————————————————————————————Private Sub SetCRC32(Lujing As String)'函数化添加CRC32'核心代码On Error GoTo CRCerrorDim cCRC As New clsCRC, FileCRC$'启用类模块 cCRC.Algorithm = CRC32 '选择算法模式是CRC32 cCRC.Clear '算法初始化 FileCRC = Hex(cCRC.CalculateFile(Lujing)) '计算出目标程序的CRC32,忽略目标程序末尾8字节数值,末尾8字节是用来储存我们示范的CRC32值的 If Len(FileCRC) < 8 Then FileCRC = Left("00000000", 8 - Len(FileCRC)) & Hex(cCRC.CalculateFile(Lujing)) '如果CRC32值不足8位,那么要在前面添加零来补足位数 CRC32zhi = FileCRC 'CRC32值储存 FileNum = FreeFile '获得个文件号(通道) Open Lujing For Binary As #FileNum Seek FileNum, FileLen(Lujing) - 7 Put #FileNum, , FileCRC Close FileNum '用二进制模式打开目标程序,通过SEEK定位需要添加CRC32数值的位置,请注意:这个位置以后大家可以自己改 '通过PUT将我们计算号的CRC32写入指定位置 '通过CLOSE关闭通道 Zhuangtai = True'状态字,表示写入文件成功了 Exit SubCRCerror:MsgBox "发生意外错误,请检查目标程序是否正在运行?", , "发生意外错误,代码: " & Err.NumberEnd Sub我是代码终止线————————————————————————————————SetCRC32就是特意写的直接完成计算CRC32和写入目标程序的功能过程调用格式为:SetCRC32(目标程序路径)看,多么简单不是吗?接下去双击Command1按钮,给它设计功能代码如下:我是代码起始线————————————————————————————————Private Sub Command1_Click()'示范'选择一个待添加CRC32值的自校验程序On Error GoTo Qingjiancha'初始化CRC32值,主要是为了清空上次的状态CRC32zhi = ""'初始化写入成功与否的标志Zhuangtai = FalseDim FilenameNo1 As StringOpenfile.DialogTitle = " 请选择需要添加CRC32自校验值的目标程序"Openfile.Filter = "*.exe"Openfile.Action = 1FilenameNo1 = Openfile.FilenameIf FilenameNo1 = "" Then Exit Sub'检查是否选择了程序If FileLen(FilenameNo1) < 16 Then MsgBox "请检查目标程序是否包含足够数据", , "请检查NO1": Exit Sub'检查程序是否包含足够空间和数据,因为储存CRC32需要8个字节的空间,本身计算余量怎么说也要8个字节把?8+8=16Big.Caption = "目标程序大小为: " & FileLen(FilenameNo1) & " 字节"SetCRC32 (FilenameNo1)CRCzhi.Caption = "目标程序CRC32值: " & CRC32zhiIf Zhuangtai = True ThenZhuang.Caption = "CRC32添加状况: 添加成功,你可以启动目标程序的自校验来核实"ElseZhuang.Caption = "CRC32添加状况: 添加失败,请你检查下目标程序是否正在运行中?"End IfExit SubFilenameNo1 = ""Qingjiancha:MsgBox "发生意外错误,请检查输入等情况是否正常,目标程序是否正在运行?", , "发生意外错误,代码: " & Err.NumberFilenameNo1 = ""End Sub我是代码终止线————————————————————————————————整个程序还需要:一个名为CRCzhi的Label,一个名为Zhuang的Label 分别显示计算出来的CRC32值,和显示写入文件是否成功的信息这样子,通过编译,生成EXE文件,执行效果如图:
这样我们就完成了VB-CRC32添加校验值到目标程序的注射端。保存工程等文件。接下去,我们就来应用该VB-CRC32注射端配合主体程序来完成整个VB-CRC32自校验设计下面开始写VB-CRC32自校验主体程序打开VB6.0,新建工程按照上文一样,建立clsCRC类模块,代码一致,或者直接添加附件里的该类模块也可以。如图:
然后设计如下图的程序界面,注意需要一个名为Jieguo的Label,建立一个名为“检测“的Command1然后双击窗体,进入代码设计界面如图:
在这个主体自校验部分,大家想一下,大概需要写几个什么样的函数?方便复制和移植?我认为是两个函数,分别计算自身的CRC32值,和获取已经写入到末尾8字节的CRC32校验值。那么说干就干吧:我是代码起始线————————————————————————————————Private Function GetCRC32() As String'函数化计算本身的CRC32'核心代码Dim Lujing As String'定义本程序自己的路径变量On Error GoTo CRCerrorLujing = App.Path & "/" & App.EXEName & ".exe"'这句语句就获得了程序自己的启动路径,这个技巧VB中必须掌握,用处很多Dim cCRC As New clsCRC, FileCRC$'启用类模块 cCRC.Algorithm = CRC32 '选择算法模式是CRC32 cCRC.Clear '算法初始化 FileCRC = Hex(cCRC.CalculateFile(Lujing)) '计算出目标程序的CRC32,忽略目标程序末尾8字节数值,末尾8字节是用来储存我们示范的CRC32值的 If Len(FileCRC) < 8 Then FileCRC = Left("00000000", 8 - Len(FileCRC)) & Hex(cCRC.CalculateFile(Lujing)) '如果CRC32值不足8位,那么要在前面添加零来补足位数 GetCRC32 = FileCRC Exit FunctionCRCerror:MsgBox "发生意外错误,程序被破坏?", , "发生意外错误,代码: " & Err.NumberEnd Function我是代码终止线————————————————————————————————该GetCRC32函数直接当作字符变量来使用即可,可获取自身除末尾8位外其他所有数据的CRC32值,我再强调一遍,这里是做示范,为了方便查看和记忆,特将CRC32校验值储存到目标程序末尾8字节位置,实际应用中,大家可以自己选择一个合理的位置。我是代码起始线————————————————————————————————Private Function GetZHI() As String'函数化获得末尾标记值'这个值是我们用CRC32添加工具添加进去的'这个位置你也可以自己修改'核心代码Dim Lujing As StringDim ArrBytes() As ByteDim FilelenNO1Dim Xunhuan As Double'定义本程序自己的路径变量'On Error GoTo ZHIerrorLujing = App.Path & "/" & App.EXEName & ".exe"'这句语句就获得了程序自己的启动路径,这个技巧VB中必须掌握,用处很多tfile = FreeFile Open Lujing For Binary As #tfile '利用二进制打开自身 FilelenNO1 = LOF(tfile) ReDim ArrBytes(1 To FilelenNO1) As Byte '将目标末尾8位储存 Get tfile, , ArrBytes Close tfileFor Xunhuan = FilelenNO1 - 7 To FilelenNO1'开始获取这具体的8位GetZHI = GetZHI & Chr(ArrBytes(Xunhuan))Next XunhuanExit FunctionZHIerror:MsgBox "怀疑程序被破坏了", , "错误代码: " & Err.NumberEnd Function我是代码终止线————————————————————————————————该GetZHI函数同样可以当字符形式使用,很方便,从名字上看就知道是为了获取预先储存在本身末尾8字节的CRC32预先计算的值。干什么用?当然是跟上面的GetCRC32函数返回的字符进行比较,看结果是否跟标记的一致,一致就说明程序没有被修改,不一致就说明程序被修改了。这个两个关键函数同样可以被大家移植过去使用很高兴能给VB共享软件带来点有趣的有用的东西。接下去就是在主体中使用这两个函数我们的使用代码是:我是代码起始线————————————————————————————————'就简单的一句话就交代了 ^_^'我们已经写好了GetCRC32函数和GetZHI函数'两个函数返回值为字符串,当然,我们只是做测试,如果真的要'应用到软件中去,我推荐还是用浮点计算,制造隐藏剧情'甚至内联汇编处理,根据CRC32值来跳转,让人难以琢磨'使用时,只要使用这两个函数就OK了If GetCRC32 = GetZHI ThenMsgBox "程序未被修改过,恭喜你", , "通过"Jieguo.ForeColor = &H80000012 '更改字体颜色为黑色Jieguo.Caption = "程序未被修改"ElseMsgBox "程序被修改,请不要非法修改本程序,共享软件云云...", , "被修改"Jieguo.ForeColor = &HFF& '更改字体颜色为红色,表示警告Jieguo.Caption = "警告:程序被修改"End If我是代码终止线————————————————————————————————这个使用代码,能看懂的就自己改写,看不懂的就添加到Private Sub Form_Load()事件中去,还有Private Sub Command1_Click()事件中。好了,保存工程后,开始编译为EXE文件吧,编译好后,用我们写好的VB-CRC32添加校验值注射工具进行注射一下,这个时候如果有杀毒软件在的话,而且比较好的话,可能会弹出提示问你允不允许修改什么的,我用的微点就会提示和拦截,需要防行。然后运行吧。效果如图:
可以看到这里显示的目标程序的CRC32自校验码为:60B04682我们用UltraEdit打开注射过了的目标主体程序,在末尾看到:
可见已经添加成功了,运行主体程序:

看来校验通过了,那么我们下面来模拟下破解者修改程序的情况:在VBExplorer中,我们找到检测按钮事件起始地址:405F90代开OD来装载目标主体程序,CTRL+G 直接到 405F9000405F90 > /55 PUSH EBP00405F91 . 8BEC MOV EBP,ESP00405F93 . 83EC 0C SUB ESP,0C00405F96 . 68 76124000 PUSH <JMP.&MSVBVM60.__vbaExceptHandler> ; SE 处理程序安装00405F9B . 64:A1 0000000>MOV EAX,DWord PTR FS:[0]00405FA1 . 50 PUSH EAX00405FA2 . 64:8925 00000>MOV DWORD PTR FS:[0],ESP00405FA9 . 81EC 9C000000 SUB ESP,9C00405FAF . 53 PUSH EBX00405FB0 . 56 PUSH ESI0040604D . /0F84 D1000000 JE VB防破解.00406124‘我们把这句改为必跳实验下,看看CRC32校验的威力0040604D /E9 D2000000 JMP VB防破解.0040612400406052 |90 NOP然后保存程序,运行修改后的程序如图:
到此我们完成了VB-CRC32自校验程序的设计全部过程,有些问题必须讲以下:也许会有人问:“小爱老师,听说CRC32很厉害,防修改。但是我用了你的代码之后,刚发表的共享软件就被人修改了,怎么回事?”问到点子上了,确实CRC查错能力很强,但是它本身也有脆弱性,本身防修改,但是事实恰恰相反,你可以问下身边的解密高手,当他们遇到CRC32自校验的时候怎么办?一般都是爆破,还有些是替换,替换的话还要重新计算新的CRC32值,比较罗嗦,所以大家都喜欢爆掉CRC32的关键比较点来突破CRC32,而且以此为荣。如果你设计VB-CRC32自校验,怎样处理这种情况?首先你要隐蔽你的比较方式,采用浮点计算,套用异常,故意设置隐藏剧情来保护CRC-32的校验,这是个好办法。也有高手说要加壳带CRC32校验。前辈们给的办法是把校验值进行变换,分段,分开,分时,不定时,在各种场合和代码角落进行验证,尽量不给检测到非法修改的提示,而是检测到非法修改也不告诉破解者,悄悄变换程序流程,让他迷路去吧甚至是报复破解者,这个我是不推荐的,但是我可以给个快速关机的过程,直接调用可以在几秒内关闭对方计算机,让对方来不及保存破解笔记和资料,注:往往破解者用影子系统或者虚拟机我是代码起始线————————————————————————————————‘在通用部分加入如下声明:Private Declare Function RtlAdjustPrivilege& Lib "ntdll" (ByVal Privilege&, ByVal NewValue&, ByVal NewThread&, OldValue&)Private Declare Function NtShutdownSystem& Lib "ntdll" (ByVal ShutdownAction&)Private Const SE_SHUTDOWN_PRIVILEGE& = 19Private Const ShutDown& = 0Private Const RESTART& = 1Private Const POWEROFF& = 2‘在窗体代码部分增加:Sub TurboShutdown(Index As Integer) RtlAdjustPrivilege SE_SHUTDOWN_PRIVILEGE, 1, 0, 0 Select Case Index Case 1 '关机 NtShutdownSystem ShutDown Case 2 '重启动 NtShutdownSystem RESTART Case 3 '关机 NtShutdownSystem POWEROFF End SelectEnd Sub我是代码终止线————————————————————————————————调用该快速关机指令为:Call TurboShutdown(1)希望对你有用,但是不要拿来欺负正常使用你软件的顾客哦,不然把顾客都吓跑了注意:以上VB-CRC32全部设计代码和工程文件及程序都发布在附件了,请自行下载第二章 第二讲VB时间自校验设计上一讲我们讲了使用VB进行CRC32自校验的设计,相信是能让部分VB软件作者受益的。下次见到你们发表VB软件的时候,我希望不是随便爆破修改就能破解的了。也许你认为VB-CRC32设计有点复杂,你问“小爱老师,有没有简单点的防爆破自校验?”当然是有的你可以先实验下,随便编译个程序,单击右键查看属性,你会发现它包含了你的最后修改时间,一般的复制,黏贴等都不会修改它的“修改时间”属性。然而,当破解者修改了你的软件就会被记录下最新的修改时间,如果破解者不注意,而你的设计又够隐蔽,倒是可以检查这个来判断破解者有没有修改过你的软件。来,跟我一起做运动……打开VB6.0 新建工程添加一个按钮,起名为“检测”编写一个检测自身修改时间并作比较的函数:我是代码起始线————————————————————————————————Private Function ShiJiancheck() As BooleanShiJiancheck = FalseDim iFile As StringDim FileTime As StringiFile = App.Path & "/" & App.EXEName & ".exe"'获取自身启动路径FileTime = Format(FileDateTime(iFile), "YYYYMMDDHHMMSS")'获得字符串形式的文件最后修改时间If FileTime = "20080808080808" Then'示范设置为2008年08月08日08时08分08秒,这里大家可以自己定,最好不要太特别ShiJiancheck = TrueElseShiJiancheck = FalseEnd IfEnd Function我是代码终止线————————————————————————————————调用该函数直接当作布尔变量用即可如下调用:我是代码起始线————————————————————————————————Private Sub Command1_Click()'注意,文件本身的修改时间应该不是我们设定的值,所以编译好EXE文件后,'用文件属性修改器来修改文件最后修改时间到指定数值,这个数值不要太特殊了'文件属性修改器已经放在同个文件夹下了,请使用If ShiJiancheck = False ThenMsgBox "文件被修改", , "警告"ElseMsgBox "文件正常", , "通过"End IfEnd Sub我是代码终止线————————————————————————————————效果如图:(正常状态)
文件被修改后:
跟CRC32比,此办法短小精悍,但是容易被识破,请隐蔽比较和检测,不要把结果显示出来,知道了吧?给破解制造一次意外事故应该不是难事吧?第二章 第三讲VB大小自校验设计“小爱老师,上面的方法都要修改什么的,太麻烦了,有没有更通用,更普遍的办法,且不用修改程序的呢?”“当然有了,那就是VB里面的检测文件大小,但是已经见得多了,已经没什么杀伤力了”Vb里常用检测文件大小的函数为FILELEN(路径)跟我一起做运动……打开VB6.0 新建工程先编写个检测自身大小的函数:我是代码起始线————————————————————————————————Private Function FileBig() As Long'如果文件巨大,那么改LONG为DOUBLEDim FileLujin As Stringfilelujing = App.Path & "/" & App.EXEName & ".exe"FileBig = FileLen(filelujing)End Function我是代码终止线————————————————————————————————具体使用看下面代码:我司代码起始线————————————————————————————————Private Sub Form_Load()If FileBig > 27300 Then'第一次这个数字随便设置,先编译好'用压缩壳将它压缩,查看压缩后文件大小'回到这里,修改数值比压缩后的大小大那儿一些就够了'如果被脱壳了,程序体积就会膨胀'从而被我们检测出来'当然要注意了,如果是保护壳的话'加壳后反而更大,这个时候,我们的判断'语句就要反过来了MsgBox "程序被脱壳了", , "警告"ElseMsgBox "程序正常", , "通过"End IfEnd Sub我是代码终止线————————————————————————————————编译,加壳(aspACK)程序从45056字节压缩为 27136 字节,27300略大于27136,脱壳后应该比45056可能还要大,这样就能实现检测大小来发现脱壳,也就发现修改了。如图:
脱壳后:大小71168字节,为什么这么大呢?呵呵,可能是垃圾代码和垃圾段还没清理吧,可以用LORDPE重建,应该会小一点。重建PE后,程序大小46261字节运行看看:如图
实验成功,但是我还是要提醒一下,这种方法隐蔽点,不要提示的话,也许还能存活,对于VB程序,一旦发现自校验,初学者或者有点基础的人都会想到去断点FILELEN函数,直接捕获你的对比关键点。所以自校验的设计最关键在于隐蔽和起到误导作用为好,不知不觉中就到了羊肠小道,永远没有回头路……另外要介绍的是同样是检测文件大小以确定是否被脱壳,有些软件作者把数值通过计算好,通过注射方法,写入到主体程序的文件头,这种方法可以比较准确的限定文件大小,而且不容易被发现哦,比方说“超级硬盘搜索正式版”,它就是这么检测的。有点作者把VB程序的数据全部加在一起,比较最后的和,这也是种办法,所以大家要学会思考和创新,没有什么是做不到的。第二章 第四讲VB防LOADER设计金蝉脱壳《加密解密技术内幕》一书里提到过两种方法防LOADER其指的是防SMARTCHECK,WKTVB DEBUGGER等这些技术已经为人所熟知,起不到多么好的作用,我们就了解一下吧,为我们的“金蝉脱壳”做铺垫。 1. 查找特定的窗口标题 就像第一讲里提到的:我是引用起始线————————————————————————————————二、反SMARTCHECK加载,SMARTCHECK是调试VB的利器,有必要对其进行防范。小楼前辈在软件加密技术内幕中提到两种检测方法:利用VB的AppActivate函数激活SMARTCHECK窗口,然后发送ALT+F4进行关闭该窗口和利用FindWindow发现SMARTCHECK窗口直接将其关闭,其代码基本上是这样:winHwnd = FindWindow(vbNullString, "Numega SmartCheck")If winHwnd <> 0 ThenAppActivate "Numega SmartCheck"sendkey "%{f4}", Truesendkey "%y", True 其实,我觉得直接检测进程SMARTCHK.EXE是否存在也可以,方法跟上面类似,你还可以检测其它比如W32DASM等进程,附件中的Anti-Load就是实例,发现SMARTCHK调用,自动退出:…..If InStr(LCase(Process.szExeFile), "smartchk.exe") > 0 Then smart = Process.th32ProcessID TerminateProcess hprocess, 0 Unload Me Exit Do End If…….我是引用终止线————————————————————————————————2. 设置步长和时值计算法其原理是软件正常执行的某一块过程是很快的,基本没多少延时;而通过调试器加载,其加载时间往往要多出十几倍。这种方法其实应该是反调试反跟踪里用到的,这里就只提下原理,讲到反调试的时候,我再把我知道的写出来。目前还有异常SHE处理,使得调试器无碍继续加载。还有其他的办法,但是我涉及较浅,以后有机会都放到反调试一块讲。讲完常见的VB反LOADER,你是不是觉得不够好使?如查标题,我改标题你不久查不到了吗? 如步长记时,现在的电脑配置参差不齐,这步长时值该怎么时值好呢?左思右想,终于被我想到了个办法——金蝉脱壳所谓金蝉脱壳指的是核心的东西在你眼皮底下溜走了,抓不到。留下的是一层幻灭的轮回。VB金蝉脱壳反LOADER技术基于程序迭代SHELL,第一次运行不会真的开始,而是为了调用本身进行第二次运行,就此结束掉第一次运行,以此类推,知道几百几千次,需要的时间大概在半秒到左右。形象点讲就像小孩子走路,故意跌倒,然后爬起来,又故意跌倒,让你永远把握不到他,知道他再起来的时候,你早就离开那里了。比如A实例,运行后,重新调用A,然后本次A实例自动结束,第二次A实例启动,再次调用A实例,然后又关闭自己。这样调试器第一跟踪,如果不爆破的话,势必无法继续跟了,到后来,调试器里显示的是父本程序已经结束了,但实际中,经过几百到几千次迭代SHELL后,程序已经打开。就像人生一样,调试器跟踪的只是你的上一世,甚至是几百几千世以前的你,而现在的你还好好得活着。这个时候,如果不爆破的话,调试器大概还可以用附加来强行钻入程序空间。这样的思路是可行的,但是你有没有想到过如何判断本次运行已经达到要求,可以正常开始?还是继续轮回?要求程序依靠自己的标记,而不依靠外界的标记,不然容易被人发现且从外界修改是非常容易攻破的。因为程序是同一个程序,凭什么上一辈子要立刻轮回,而这辈子就可以正常存活呢?判断的标准在哪里?同样的程序,同样的标准,为什么会产生不同的轮回结果?答案呼之欲出了,对了,就是随机数。通过概率,每次轮回的概率是一样的,是同样的标准,但是概率本身又可以导致不同的方向和结果。于是我想到设置一个循环取随机数的结构,循环7次,每次产生一个随机数,要么是1,要么是零,然后把这七个数相加来判断是否等于零,如果等于零就不必继续轮回了,如果不等于零,那么SHELL自己,然后马上死掉。因为每次随机数取0活着取1的概率是一样的,都是0.5,所以,7次随机数取值全部为零的概率是0.5^7=0.0078125,倒数为128,即大概需要轮回128次才可以正常运行程序,否则都是SHELL自己,然后父本死掉。单单靠解释可能还是有朋友看不明白,没关系,我们先写程序先,慢慢测试调试,你就发现其巧妙的地方了。首先写一个7次循环取0或取1的结构,然后把7次结果相加,与0作比较,将轮回金蝉脱克功能嵌入进去。以后程序在运行开头,只要调用一次我的这个SUB过程即可实现防LOADER,等会我们还要测试下效果呢。我是代码起始线————————————————————————————————Private Sub JinChan()On Error GoTo ANTI'只有在被调试的时候才有可能出错,恰好被我们捕获,呵呵Dim Lujing As String'储存程序自身路径Dim Suiji(7) As Byte'7个元素数组,用于储存每次随机数Dim n As Long'循环计数器Dim Panduan As Double'累加器Lujing = App.Path & "/" & App.EXEName & ".exe"'获得程序自身路径For n = 1 To 7Randomize'每次都初始化随机数生成器Suiji(n) = Int(Rnd * 2)‘取随机数0或者1Panduan = Panduan + Suiji(n)'累加Next nIf Panduan > 0 Then'如果累加总结果不为零,那就SHELL自己一次,然后通过END结束自己Shell Lujing, 1'进入下一个轮回哦End'结束这一世End If'如果上面的累加器等于零,则说明达到了0.5^7的概率了,其倒数为128,即我们已经轮'回128是世了。'调试器跟踪的只是我们的第一世。'到这里来的话也就是不执行SHELL内容,也不执行END,直接到这里来了'正常运行Exit subANTI:MsgBox "发现调试器,请关闭调试器", , "警告"EndEnd Sub我是代码终止线————————————————————————————————以后只要把JinChan写入到主窗体LOAD事件中,就实现了金蝉脱壳效果。大家跟我来做运动:打开VB6.0 新建工程在窗体代码里,拷贝上面的代码进去然后在Private Sub Form_Load()里输入JinChan,编译生成EXE即:Private Sub Form_Load()JinChanEnd Sub先运行一下EXE,看看速度如何,然后再用OD或者SMARTCHECK等测试下,看看是不是无法跟踪到轮回后的这一世,前提是不能爆破。效果还是很好的,OD如果开着HIDEOD插件的话,那么在执行SHELL的时候,会自动捕获错误以发现调试器,然后程序自动结束,也相当于起到了防LOADER作用。如果OD关闭HIDEOD插件,那么就可以直接体现出“金蝉脱壳”的效果了。如图:通过捕获异常发现调试器
如图,如果没有异常,那么金蝉脱克将发挥作用,轮回百世。调试器里已经结束,但是程序其实轮回转世了。
好了,没想到随便写写可以写这么多,看的我头晕了。希望你也别头晕,我们来总结下,《VB 共享软件防破解涉及技术初探(二)》都讲了那些内容:1、 设计思想:水桶原理2、 完整性校验,包括VB-CRC32注射器和主体的编写;文件修改时间自校验;文件大小自校验等3、 防LOADER设计,包括查找标题,经典时值,还有重点的“金蝉脱壳”反LOADER这一期就到这里了,熬夜写教程很累,呵呵还是老规矩,如果有时间,有精力,有空,有能力,我将接着写《VB 共享软件防破解设计技术初探(三)》,感谢大家的支持。
来源:http://bbs.pediy.com/thread-72204.htm
新闻热点
疑难解答