口袋社区-Poke The BBS's Archiver

最美我中文 发表于 2009-12-5 11:44

VB 共享软件防破解设计技术初探[图都没有,见附件](一)(二)(三)

[align=center][align=center][b][size=14.0pt]VB [/size][/b][b][font=宋体][size=14.0pt]共享软件防破解设计技术初探(一)[/size][/font][/b][b][size=14.0pt][/size][/b][/align][/align][align=center][align=center][b][size=14.0pt] [/size][/b][/align][/align][align=center][align=center][font=宋体][size=10.5pt]作者:爱琴海[/size][/font][size=10.5pt][SCG] 2008/09/04[/size][font=宋体][size=10.5pt](转载请保留该信息)[/size][/font][size=10.5pt][/size][/align][/align][size=10.5pt] [/size]
[size=10.5pt]
[/size][font=宋体][size=10.5pt]一转眼又过去了一年,回头一看,今年我没发表过任何破解类文章,没有任何有价值的文章,名下的精华只是徒有其表的[/size][/font][size=10.5pt]7[/size][font=宋体][size=10.5pt]个,也许太忙,也许读大学读得后悔,也许堕落了。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]
[/size][font=宋体][size=10.5pt]在看雪注册的帐号一晃就是两个春夏秋冬了,大三要忙自己的学业了,估计以后也不会再有时间和精力破解软件,学习加密思想了。两年的时间发生了太多的事情,来不及回忆,来不及思考,我们班班长不久前溺水去逝了,估摸着也到头七了[/size][/font][size=10.5pt]……[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这世事总无偿,让人来不及追忆,来不及哀悼。今天实习的时候,好好的,竟然被车床飞出来的铁屑烫伤[/size][/font][size=10.5pt]……[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]趁现在还在坛子里活动,趁现在脑子还没生锈,我琢磨着把自己两年来积累的部分经验和思想写下来,留下点什么有用的东西。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]学习[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]编程也就一年,只是入门而已,谈不上什么高手。本系列是作者本人尝试过和破解过的一些技术经验之谈,如果有问题或者有纰漏和错误,敬请高位高手点明和说明;也不知道该系列能写多少,能写多久;若是有时间,有精力,有能力,我会继续写下去,谢谢大家的观看。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]加密解密一直是相辅相成的技术,没有矛何必有盾?有盾怎能没矛?[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在不断的尝试和实践中,才能积累起丰富的加密解密经验,为自己写的共享软件设计出一套完善的加密系统,或者攻克一个高度加密的共享软件,两者都是件令人欢心令人耗尽精力。终记起这样的一段诗句:“衣带渐宽终不悔,为伊消得人憔悴”。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]本系列第一篇,粗略的讲解我认识到的[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]防破解技术,后续篇将实战演练教学[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我个人认识的[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]防破解包括如下几下方面:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=&quot][size=10.5pt]1、
[/size][/font][font=宋体][size=10.5pt]文件完整性,防止被非法修改[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]2、
[/size][/font][font=宋体][size=10.5pt]运行时的校验,防止被[/size][/font][size=10.5pt]LOADER[/size]
[font=&quot][size=10.5pt]3、
[/size][/font][font=宋体][size=10.5pt]反调试,防止动态跟踪和挂接[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]4、
[/size][/font][font=宋体][size=10.5pt]防静态反汇编分析[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]5、
[/size][/font][font=宋体][size=10.5pt]注册码系统(算法部分,核心内容)[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]6、
[/size][/font][font=宋体][size=10.5pt]加壳防脱壳[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]7、
[/size][/font][font=宋体][size=10.5pt]隐蔽性设计[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]8、
[/size][/font][font=宋体][size=10.5pt]另辟蹊径[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]由于[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]天生的原因,有些功能实现起来非常麻烦,比方说算法部分,如果采用大数运算的话,缺少大数运行库。所以,有时也可以采用第三方[/size][/font][size=10.5pt]DLL[/size][font=宋体][size=10.5pt]来补充大数的不足。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我先粗略的讲下以上[/size][/font][size=10.5pt]8[/size][font=宋体][size=10.5pt]大点的大概分类:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[b][font=&quot][size=12.0pt]1、
[/size][/font][/b][font=宋体][size=10.5pt]文件完整性,可采用[/size][/font][size=10.5pt]CRC32[/size][font=宋体][size=10.5pt]或者[/size][/font][size=10.5pt]MD5[/size][font=宋体][size=10.5pt]或者哈希算法等,计算出文件的加密值,在适当的时候进行对比,判断文件被修改与否。当然那也可以加猛壳来防止文件非法修改。还有简单点的检查文件最后修改时间,看看是否是你自己设置好的时间,如果不是,则很有可能被修改过;也可以检测文件大小,往往压缩壳被脱掉后,文件的大小会增加;保护壳被脱掉后,文件大小会变小,我们可以根据这个设置好临界值来检测有没有被脱壳。常用的还有故意设计好关于算法方面的陷阱,如果是破解者会主动掉进你的陷阱,而事实上,这个跳转除非爆破,不然在算法上是永远也无法到达的,这样就检出破解者在修改程序流程。你可以无声无息的程序死掉,不要直接退出,不然会被追踪到退出函数。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[b][font=&quot][size=12.0pt]2、
[/size][/font][/b][font=宋体][size=10.5pt]防止[/size][/font][size=10.5pt]LOADER[/size][font=宋体][size=10.5pt],这个实现起来不容易,但是可以巧妙的应用[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]里的[/size][/font][size=10.5pt]SHELL[/size][font=宋体][size=10.5pt]函数,进行“金蝉脱壳”。常用的保护壳里有些也能防止[/size][/font][size=10.5pt]LOADER[/size][font=宋体][size=10.5pt]。[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]在下次系列里将讲解“金蝉脱壳”技术[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[b][font=&quot][size=12.0pt]3、
[/size][/font][/b][font=宋体][size=10.5pt]反调试,如同《使用[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]进行反跟踪的技术点滴》一文讲解,基本差不多了。常见的有:检测父进程;遍历所有进程检查程序标题栏,看看是否有敏感字符;[/size][/font][font=宋体][size=10.5pt]反[/size][/font][font=&quot][size=10.5pt]SMARTCHECK[/size][/font][font=宋体][size=10.5pt]加载;经典时值步长比较;异常处理技术(这个要当作重点)一些猛壳本身也有反调试功能。[/size][/font][size=10.5pt][/size]
[b][font=&quot][size=12.0pt]4、
[/size][/font][/b][size=10.5pt] [/size]
[font=宋体][size=10.5pt]还可以检测程序启动时间,一般调试器加载都是比正常启动程序要慢[/size][/font][size=10.5pt]10[/size][font=宋体][size=10.5pt]倍左右[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]还可以检测内存分配,如果[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]调试器启用了[/size][/font][size=10.5pt]HIDEOD[/size][font=宋体][size=10.5pt]插件的话,那么程序获得的[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]内存分配上限和下限都是不一样的[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]还可以检测所有标题,枚举进程等[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]一般要加几个[/size][/font][size=10.5pt]TIMER[/size][font=宋体][size=10.5pt]控件来时时反调试,这样可以在[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]挂接到程序的时候检测出来[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]可参考实例:[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=宋体][size=9.0pt][url=http://bbs.pediy.com/showthread.php?t=67232]http://bbs.pediy.com/showthread.php?t=67232[/url][/size][/font]
[font=宋体][size=9.0pt][url=http://bbs.pediy.com/showthread.php?t=57181]http://bbs.pediy.com/showthread.php?t=57181[/url][/size][/font]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]以前看雪论坛里有篇文章,[/size][/font][size=10.5pt]laomms[/size][font=宋体][size=10.5pt]大侠写的《使用[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]进行反跟踪的技术点滴》一文,对我们学习[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]的防破解设计是很有帮助的,为了大家观看方便,我将它引录到下文中:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=9.0pt][b]原文地址:[url=http://bbs.pediy.com/showthread.php?t=26213]http://bbs.pediy.com/showthread.php?t=26213[/url][/b][/size][/font][font=宋体][size=9.0pt][/size][/font]
[font=宋体][size=10.5pt]———————————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt]
[i]
[/i][/size][i][font=宋体][size=9.0pt]跟其它[/size][/font][/i][url=http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fcomplete%3D1%26hl%3Dzh-CN%26newwindow%3D1%26q%3D%25E8%25B7%259F%25E5%2585%25B6%25E5%25AE%2583%25E8%25AF%25AD%25E8%25A8%2580%25E7%259B%25B8%25E6%25AF%2594%25EF%25BC%258CVB%25E6%2580%25BB%25E6%2598%25AF%25E8%25A2%25AB%25E4%25BA%25BA%25E2%2580%259C%25E9%2584%2599%25E8%25A7%2586%25E2%2580%259D%26btnG%3DGoogle+%25E6%2590%259C%25E7%25B4%25A2%26meta%3D%26aq%3Df%26oq%3D&aid=10342&sid=6235007045049473&click=1&url=http%3A//www.myspain.cn/home.htm&v=0&k=%u8BED%u8A00&s=http%3A//news.csdn.net/n/20070420/103174.html&rn=49199][i][font=宋体][size=9.0pt]语言[/size][/font][/i]
[/url]
[i][font=宋体][size=9.0pt]相比,[/size][/font][/i][i][font=&quot][size=9.0pt]VB[/size][/font][/i][i][font=宋体][size=9.0pt]总是被人[/size][/font][/i][i][font=&quot][size=9.0pt]“[/size][/font][/i][i][font=宋体][size=9.0pt]鄙视[/size][/font][/i][i][font=&quot][size=9.0pt]”[/size][/font][/i][i][font=宋体][size=9.0pt],其实没有好与不好的语言,正如某程序员说的:没有最好的语言,只有最好的程序员。[/size][/font][/i][i][font=&quot][size=9.0pt]VB[/size][/font][/i][i][font=宋体][size=9.0pt]也有它自己的特点,简单、方便、可视化强、利于快速开发,[/size][/font][/i][i][font=&quot][size=9.0pt]6M[/size][/font][/i][i][font=宋体][size=9.0pt]的迷你版更是让人在不释手。而且容易入门,也是通往其它语言最好的一个奠基。可惜关于[/size][/font][/i][i][font=&quot][size=9.0pt]VB[/size][/font][/i][i][font=宋体][size=9.0pt]方面的保护[/size][/font][/i][url=http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fcomplete%3D1%26hl%3Dzh-CN%26newwindow%3D1%26q%3D%25E8%25B7%259F%25E5%2585%25B6%25E5%25AE%2583%25E8%25AF%25AD%25E8%25A8%2580%25E7%259B%25B8%25E6%25AF%2594%25EF%25BC%258CVB%25E6%2580%25BB%25E6%2598%25AF%25E8%25A2%25AB%25E4%25BA%25BA%25E2%2580%259C%25E9%2584%2599%25E8%25A7%2586%25E2%2580%259D%26btnG%3DGoogle+%25E6%2590%259C%25E7%25B4%25A2%26meta%3D%26aq%3Df%26oq%3D&aid=6433&sid=6235007045049473&click=1&url=http%3A//www.918520.com&v=0&k=%u6280%u672F&s=http%3A//news.csdn.net/n/20070420/103174.html&rn=444320][i][font=宋体][size=9.0pt]技术[/size][/font][/i]
[/url]
[i][font=宋体][size=9.0pt]的文章很少,[/size][/font][/i][url=http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fcomplete%3D1%26hl%3Dzh-CN%26newwindow%3D1%26q%3D%25E8%25B7%259F%25E5%2585%25B6%25E5%25AE%2583%25E8%25AF%25AD%25E8%25A8%2580%25E7%259B%25B8%25E6%25AF%2594%25EF%25BC%258CVB%25E6%2580%25BB%25E6%2598%25AF%25E8%25A2%25AB%25E4%25BA%25BA%25E2%2580%259C%25E9%2584%2599%25E8%25A7%2586%25E2%2580%259D%26btnG%3DGoogle+%25E6%2590%259C%25E7%25B4%25A2%26meta%3D%26aq%3Df%26oq%3D&aid=6429&sid=6235007045049473&click=1&url=http%3A//www.wang-cai.com&v=0&k=%u8F6F%u4EF6&s=http%3A//news.csdn.net/n/20070420/103174.html&rn=832853][i][font=宋体][size=9.0pt]软件[/size][/font][/i]
[/url]
[i][font=宋体][size=9.0pt]加密技术里面有涉及[/size][/font][/i][i][font=&quot][size=9.0pt]VB[/size][/font][/i][i][font=宋体][size=9.0pt]的保护内容,但是源码太少了,大部分是[/size][/font][/i][i][font=&quot][size=9.0pt]C[/size][/font][/i][i][font=宋体][size=9.0pt]和[/size][/font][/i][i][font=&quot][size=9.0pt]MASM[/size][/font][/i][i][font=宋体][size=9.0pt]源码,这里我们也粗略的讲讲[/size][/font][/i][i][font=&quot][size=9.0pt]VB[/size][/font][/i][i][font=宋体][size=9.0pt]的一些保护技术,如果你还有更好的方法希望在下面补充。[/size][/font][/i][i]
[/i][i][font=宋体][size=9.0pt]一、检测父进程反[/size][/font][/i][i][font=&quot][size=9.0pt]RING3[/size][/font][/i][i][font=宋体][size=9.0pt]调试器,我们知道[/size][/font][/i][i][font=&quot][size=9.0pt]WIN32[/size][/font][/i][i][font=宋体][size=9.0pt]系统一般软件的父进程都是[/size][/font][/i][i][font=&quot][size=9.0pt]EXPLORE[/size][/font][/i][i][font=宋体][size=9.0pt],而[/size][/font][/i][i][font=&quot][size=9.0pt]OD[/size][/font][/i][i][font=宋体][size=9.0pt]等[/size][/font][/i][i][font=&quot][size=9.0pt]RING3[/size][/font][/i][i][font=宋体][size=9.0pt]调试器对软件进行调试时都是将它们的线程设为它的子线程,我们只要让程序检查父进程是否为[/size][/font][/i][i][font=&quot][size=9.0pt]EXPLORE[/size][/font][/i][i][font=宋体][size=9.0pt]就行,看附件里的[/size][/font][/i][i][font=&quot][size=9.0pt]Anti-Debug,[/size][/font][/i][i][font=宋体][size=9.0pt]如果发现父进程不是[/size][/font][/i][i][font=&quot][size=9.0pt]EXPLORE.EXE[/size][/font][/i][i][font=宋体][size=9.0pt]就自动退出,源码如下:[/size][/font][/i][i][font=&quot][size=9.0pt]
'[/size][/font][/i][i][font=宋体][size=9.0pt]相关的[/size][/font][/i][i][font=&quot][size=9.0pt]API[/size][/font][/i][i][font=宋体][size=9.0pt]自己查查[/size][/font][/i][i][font=&quot][size=9.0pt]
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&) '[/size][/font][/i][i][font=宋体][size=9.0pt]建立进程快照[/size][/font][/i][i][font=&quot][size=9.0pt]
      If hSnapShot Then
    Process.dwSize = 1060
    If (Process32First(hSnapShot, Process)) Then '[/size][/font][/i][i][font=宋体][size=9.0pt]遍历第一个进程[/size][/font][/i][i][font=&quot][size=9.0pt],[/size][/font][/i][i][font=宋体][size=9.0pt]获得[/size][/font][/i][i][font=&quot][size=9.0pt]PROCESSENTRY32[/size][/font][/i][i][font=宋体][size=9.0pt]结构[/size][/font][/i][i][font=&quot][size=9.0pt]
       Do
        i = InStr(1, Process.szExeFile, Chr(0))       '[/size][/font][/i][i][font=宋体][size=9.0pt]获得映像名称[/size][/font][/i][i][font=&quot][size=9.0pt]
        mName = LCase(Left(Process.szExeFile, i - 1)) '[/size][/font][/i][i][font=宋体][size=9.0pt]并转换成小写[/size][/font][/i][i][font=&quot][size=9.0pt]
              If mName = "explorer.exe" Then      '[/size][/font][/i][i][font=宋体][size=9.0pt]是不是[/size][/font][/i][i][font=&quot][size=9.0pt]explorer.exe
             explorer = Process.th32ProcessID    '[/size][/font][/i][i][font=宋体][size=9.0pt]获得进程[/size][/font][/i][i][font=&quot][size=9.0pt]ID
        ElseIf Process.th32ProcessID = GetCurrentProcessId() Then '[/size][/font][/i][i][font=宋体][size=9.0pt]是不是自己[/size][/font][/i][i][font=&quot][size=9.0pt]
             pid = Process.th32ParentProcessID   '[/size][/font][/i][i][font=宋体][size=9.0pt]获得自己父进程[/size][/font][/i][i][font=&quot][size=9.0pt]ID
        Else
             flag = False
        End If
      Loop Until (Process32Next(hSnapShot, Process) < 1) '[/size][/font][/i][i][font=宋体][size=9.0pt]遍历所有进程直到[/size][/font][/i][url=http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fcomplete%3D1%26hl%3Dzh-CN%26newwindow%3D1%26q%3D%25E8%25B7%259F%25E5%2585%25B6%25E5%25AE%2583%25E8%25AF%25AD%25E8%25A8%2580%25E7%259B%25B8%25E6%25AF%2594%25EF%25BC%258CVB%25E6%2580%25BB%25E6%2598%25AF%25E8%25A2%25AB%25E4%25BA%25BA%25E2%2580%259C%25E9%2584%2599%25E8%25A7%2586%25E2%2580%259D%26btnG%3DGoogle+%25E6%2590%259C%25E7%25B4%25A2%26meta%3D%26aq%3Df%26oq%3D&aid=10189&sid=6235007045049473&click=1&url=http%3A//unionafa.allyes.com/main/adfclick%3Fdb%3Dunionafa%26bid%3D493%2C141%2C23%26cid%3D6601%2C309%2C1%26sid%3D362%26show%3Dignore%26url%3Dhttp%3A//buycar.chezhu.com.cn/promotion_0318.php%3Fcid%3D15&v=0&k=%u8FD4%u56DE&s=http%3A//news.csdn.net/n/20070420/103174.html&rn=826560][i][font=宋体][size=9.0pt]返回[/size][/font][/i]
[/url]
[i][font=宋体][size=9.0pt]值为[/size][/font][/i][i][font=&quot][size=9.0pt]False
    End If
    l1 = CloseHandle(hSnapShot)
    End If
    If pid <> explorer Then
     TerminateProcess hprocess, 0
     Else
     MsgBox "ok"
     On Error Resume Next
    End If
End Sub
[/size][/font][/i][i][font=宋体][size=9.0pt]当然这个方法也不是万能的,在[/size][/font][/i][i][font=&quot][size=9.0pt]Process32First[/size][/font][/i][i][font=宋体][size=9.0pt]下断,更改跳转轻易躲过。[/size][/font][/i][i]
[/i][i][font=宋体][size=9.0pt]二、反[/size][/font][/i][i][font=&quot][size=9.0pt]SMARTCHECK[/size][/font][/i][i][font=宋体][size=9.0pt]加载,[/size][/font][/i][i][font=&quot][size=9.0pt]SMARTCHECK[/size][/font][/i][i][font=宋体][size=9.0pt]是调试[/size][/font][/i][i][font=&quot][size=9.0pt]VB[/size][/font][/i][i][font=宋体][size=9.0pt]的利器,有必要对其进行防范。小楼前辈在软件加密技术内幕中提到两种检测方法:[/size][/font][/i][i]
[/i][i][font=宋体][size=9.0pt]利用[/size][/font][/i][i][font=&quot][size=9.0pt]VB[/size][/font][/i][i][font=宋体][size=9.0pt]的[/size][/font][/i][i][font=&quot][size=9.0pt]AppActivate[/size][/font][/i][i][font=宋体][size=9.0pt]函数激活[/size][/font][/i][i][font=&quot][size=9.0pt]SMARTCHECK[/size][/font][/i][i][font=宋体][size=9.0pt]窗口,然后发送[/size][/font][/i][i][font=&quot][size=9.0pt]ALT+F4[/size][/font][/i][i][font=宋体][size=9.0pt]进行关闭该窗口和利用[/size][/font][/i][i][font=&quot][size=9.0pt]FindWindow[/size][/font][/i][i][font=宋体][size=9.0pt]发现[/size][/font][/i][i][font=&quot][size=9.0pt]SMARTCHECK[/size][/font][/i][i][font=宋体][size=9.0pt]窗口直接将其关闭,其代码基本上是这样:[/size][/font][/i][i][font=&quot][size=9.0pt]
winHwnd = FindWindow(vbNullString, "Numega SmartCheck")
If winHwnd <> 0 Then
AppActivate "Numega SmartCheck"
sendkey "%{f4}", True
sendkey "%y", True
   [/size][/font][/i][i][font=宋体][size=9.0pt]其实,我觉得直接检测进程[/size][/font][/i][i][font=&quot][size=9.0pt]SMARTCHK.EXE[/size][/font][/i][i][font=宋体][size=9.0pt]是否存在也可以,方法跟上面类似,你还可以检测其它比如[/size][/font][/i][i][font=&quot][size=9.0pt]W32DASM[/size][/font][/i][i][font=宋体][size=9.0pt]等进程,附件中的[/size][/font][/i][i][font=&quot][size=9.0pt]Anti-Load[/size][/font][/i][i][font=宋体][size=9.0pt]就是实例,发现[/size][/font][/i][i][font=&quot][size=9.0pt]SMARTCHK[/size][/font][/i][i][font=宋体][size=9.0pt]调用,自动退出:[/size][/font][/i][i][font=&quot][size=9.0pt]
…..
If InStr(LCase(Process.szExeFile), "smartchk.exe") > 0 Then
           smart = Process.th32ProcessID
          TerminateProcess hprocess, 0
          Unload Me
        Exit Do
        End If
…….

    [/size][/font][/i][i][font=宋体][size=9.0pt]三、检测[/size][/font][/i][i][font=&quot][size=9.0pt]SOFTICE[/size][/font][/i][i][font=宋体][size=9.0pt],附件里的[/size][/font][/i][i][font=&quot][size=9.0pt]Anti-ice[/size][/font][/i][i][font=宋体][size=9.0pt]就是[/size][/font][/i][i][font=&quot][size=9.0pt]Aming[/size][/font][/i][i][font=宋体][size=9.0pt]前辈的代码,在内存中直接检测[/size][/font][/i][i][font=&quot][size=9.0pt]SOFTICE[/size][/font][/i][i][font=宋体][size=9.0pt]。[/size][/font][/i][i]
[/i][i][font=宋体][size=9.0pt]四、利用[/size][/font][/i][i][font=&quot][size=9.0pt]IsDebuggerPresent[/size][/font][/i][i][font=宋体][size=9.0pt]检测调试器,这个对于[/size][/font][/i][i][font=&quot][size=9.0pt]OD[/size][/font][/i][i][font=宋体][size=9.0pt]来说已经一点用都没有了。具体看附件中的[/size][/font][/i][i][font=&quot][size=9.0pt]IsDebuggerPresent[/size][/font][/i][i][font=宋体][size=9.0pt]。[/size][/font][/i][i][font=&quot][size=9.0pt]
Private Declare Function IsDebuggerPresent Lib "kernel32" () As Long
Private Sub Command1_Click()
If IsDebuggerPresent Then
End
Else
MsgBox "[/size][/font][/i][i][font=宋体][size=9.0pt]没有被调试[/size][/font][/i][i][font=&quot][size=9.0pt]"
End If
End Sub

    [/size][/font][/i][i][font=宋体][size=9.0pt]五、加密字符串。[/size][/font][/i][i]
[/i][i][font=宋体][size=9.0pt]比如[/size][/font][/i][i][font=&quot][size=9.0pt]Text1.text=”[/size][/font][/i][i][font=宋体][size=9.0pt]恭喜[/size][/font][/i][i][font=&quot][size=9.0pt]”[/size][/font][/i][i][font=宋体][size=9.0pt],我们可以这样写:[/size][/font][/i][i][font=&quot][size=9.0pt]Text1.text=Chr(-18009) & Chr(-12366) & Chr(33)[/size][/font][/i][i][font=宋体][size=9.0pt],另外一种就是写算法将字符串进行加密,实例[/size][/font][/i][i][font=&quot][size=9.0pt]Encodestring[/size][/font][/i][i][font=宋体][size=9.0pt]里你将找不到字符串信息,找到的是乱码。[/size][/font][/i][i]
[/i][i][font=宋体][size=9.0pt]六、实现软件代码校检防止被修改,比如用[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]或者[/size][/font][/i][i][font=&quot][size=9.0pt]MD5[/size][/font][/i][i][font=宋体][size=9.0pt]进行自身代码完整性检测,实现方法:[/size][/font][/i][i]
[/i][i][font=宋体][size=9.0pt]先写一个用于增加[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]特征码的软件[/size][/font][/i][i][font=&quot][size=9.0pt],[/size][/font][/i][i][font=宋体][size=9.0pt]假设定义为结尾部分[/size][/font][/i][i][font=&quot][size=9.0pt]:
Const CRC_HEAD = &H761226   '[/size][/font][/i][i][font=宋体][size=9.0pt]用于判断是否添加了[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]校验[/size][/font][/i][i][font=&quot][size=9.0pt]
Private Type stCRC
    lHead As Long   '[/size][/font][/i][i][font=宋体][size=9.0pt]验证是否进行[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]校验的标识[/size][/font][/i][i][font=&quot][size=9.0pt]
    lCRC As Long    'CRC[/size][/font][/i][i][font=宋体][size=9.0pt]校验值[/size][/font][/i][i][font=&quot][size=9.0pt]
End Type
Private Sub Command1_Click()
    CRC_Exe App.Path & "\[/size][/font][/i][i][font=宋体][size=9.0pt]工程[/size][/font][/i][i][font=&quot][size=9.0pt]1.Exe"
End Sub
Private Function CRC_Exe(ByVal strExe As String) As Boolean
    Dim hFile As Long
    Dim lFileLen As Long
    Dim sCRC As stCRC
    Dim btExe() As Byte
    On Error GoTo Err_CRC_Exe
    lFileLen = FileLen(strExe)
    hFile = FreeFile
    Open strExe For Binary As #hFile        '[/size][/font][/i][i][font=宋体][size=9.0pt]打开加密文件[/size][/font][/i][i][font=&quot][size=9.0pt]
    Seek hFile, lFileLen - LenB(sCRC) + 1   '[/size][/font][/i][i][font=宋体][size=9.0pt]定位[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]标识域[/size][/font][/i][i][font=&quot][size=9.0pt],[/size][/font][/i][i][font=宋体][size=9.0pt]位于[/size][/font][/i][i][font=&quot][size=9.0pt]Exe[/size][/font][/i][i][font=宋体][size=9.0pt]文件尾部文件[/size][/font][/i][i][font=&quot][size=9.0pt]
    Get hFile, , sCRC   
       If sCRC.lHead = CRC_HEAD Then     '[/size][/font][/i][i][font=宋体][size=9.0pt]如果已经添加了[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]校验则退出[/size][/font][/i][i][font=&quot][size=9.0pt],[/size][/font][/i][i][font=宋体][size=9.0pt]反之添加[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]校验[/size][/font][/i][i][font=&quot][size=9.0pt]
        MsgBox "[/size][/font][/i][i][font=宋体][size=9.0pt]已[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]验证[/size][/font][/i][i][font=&quot][size=9.0pt]!"
        Close #hFile
        Exit Function
    Else
        Seek hFile, 1               '[/size][/font][/i][i][font=宋体][size=9.0pt]定位到文件首部[/size][/font][/i][i][font=&quot][size=9.0pt]
        ReDim btExe(lFileLen - 1)
        Get hFile, , btExe          '[/size][/font][/i][i][font=宋体][size=9.0pt]按字节方式将[/size][/font][/i][i][font=&quot][size=9.0pt]Exe[/size][/font][/i][i][font=宋体][size=9.0pt]数据读入数组[/size][/font][/i][i][font=&quot][size=9.0pt]
        sCRC.lHead = CRC_HEAD       '[/size][/font][/i][i][font=宋体][size=9.0pt]添加[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]验证标识[/size][/font][/i][i][font=&quot][size=9.0pt]
        sCRC.lCRC = Get_CRC(VarPtr(btExe(0)), lFileLen) '[/size][/font][/i][i][font=宋体][size=9.0pt]获取[/size][/font][/i][i][font=&quot][size=9.0pt]Exe[/size][/font][/i][i][font=宋体][size=9.0pt]内容[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]值[/size][/font][/i][i][font=&quot][size=9.0pt]
        Put hFile, , sCRC           '[/size][/font][/i][i][font=宋体][size=9.0pt]将[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]校验写入[/size][/font][/i][i][font=&quot][size=9.0pt]Exe[/size][/font][/i][i][font=宋体][size=9.0pt]文件尾部[/size][/font][/i][i][font=&quot][size=9.0pt]
    End If
    Close #hFile
    MsgBox "CRC[/size][/font][/i][i][font=宋体][size=9.0pt]校验完成[/size][/font][/i][i][font=&quot][size=9.0pt]!"
    CRC_Exe = True
    Exit Function
   
Err_CRC_Exe:
    If hFile <> 0 Then Close #hFile
    CRC_Exe = False
    MsgBox Err.Description
End Function

[/size][/font][/i][i][font=宋体][size=9.0pt]为程序本身增加[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]校检代码:[/size][/font][/i][i][font=&quot][size=9.0pt]
Const CRC_HEAD = &H761226   '[/size][/font][/i][i][font=宋体][size=9.0pt]用于判断是否添加了[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]校验[/size][/font][/i][i][font=&quot][size=9.0pt]
Private Type stCRC
    lHead As Long           '[/size][/font][/i][i][font=宋体][size=9.0pt]验证是否进行[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]校验的标识[/size][/font][/i][i][font=&quot][size=9.0pt]
    lCRC As Long            'CRC[/size][/font][/i][i][font=宋体][size=9.0pt]校验值[/size][/font][/i][i][font=&quot][size=9.0pt]
End Type
Private Sub Form_Load()
    Dim hFile As Long
    Dim sCRC As stCRC
    Dim strExe As String
    Dim lFileLen As Long
    Dim btExe() As Byte
        strExe = App.Path & "\" & App.EXEName & ".exe"
    lFileLen = FileLen(strExe)   
     ReDim btExe(lFileLen - LenB(sCRC) - 1) As Byte   '[/size][/font][/i][i][font=宋体][size=9.0pt]定义[/size][/font][/i][i][font=&quot][size=9.0pt]Exe[/size][/font][/i][i][font=宋体][size=9.0pt]字节缓存数组[/size][/font][/i][i][font=&quot][size=9.0pt]
     hFile = FreeFile
    Open strExe For Binary As #hFile       '[/size][/font][/i][i][font=宋体][size=9.0pt]读取[/size][/font][/i][i][font=&quot][size=9.0pt]Exe[/size][/font][/i][i][font=宋体][size=9.0pt]数据到数组[/size][/font][/i][i][font=&quot][size=9.0pt]
    Get #hFile, , btExe
    Get #hFile, , sCRC
    Close #hFile   
        If sCRC.lHead = CRC_HEAD Then  '[/size][/font][/i][i][font=宋体][size=9.0pt]如果程序添加了[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]验证则验证[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]值[/size][/font][/i][i][font=&quot][size=9.0pt]
        If Get_CRC(VarPtr(btExe(0)), UBound(btExe) + 1) = lCRC Then   '[/size][/font][/i][i][font=宋体][size=9.0pt]验证[/size][/font][/i][i][font=&quot][size=9.0pt]Exe[/size][/font][/i][i][font=宋体][size=9.0pt]数据[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]和保存的[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]值是否相同[/size][/font][/i][i][font=&quot][size=9.0pt]
            MsgBox "[/size][/font][/i][i][font=宋体][size=9.0pt]文件未修改[/size][/font][/i][i][font=&quot][size=9.0pt]!".
        Else
            MsgBox "[/size][/font][/i][i][font=宋体][size=9.0pt]文件被非法修改[/size][/font][/i][i][font=&quot][size=9.0pt]!"
        End If
    Else
        MsgBox "[/size][/font][/i][i][font=宋体][size=9.0pt]文件尚未进行[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]验证[/size][/font][/i][i][font=&quot][size=9.0pt]!"      '[/size][/font][/i][i][font=宋体][size=9.0pt]检查尾部是否已已经增加[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]校检[/size][/font][/i][i][font=&quot][size=9.0pt]
    End If   
End Sub

   [/size][/font][/i][i][font=宋体][size=9.0pt]其中的[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]模块网上很多。附件中的[/size][/font][/i][i][font=&quot][size=9.0pt]CRC32[/size][/font][/i][i][font=宋体][size=9.0pt]就是实例,修改任何一处软件都提示被修改。增加自校检后建议再随便加个壳,否则用[/size][/font][/i][i][font=&quot][size=9.0pt]UltraEdit[/size][/font][/i][i][font=宋体][size=9.0pt]直接就可以对比原文件查出[/size][/font][/i][i][font=&quot][size=9.0pt]CRC[/size][/font][/i][i][font=宋体][size=9.0pt]校验值位置。[/size][/font][/i][i]
[/i][i][font=宋体][size=9.0pt]七、利用[/size][/font][/i][i][font=&quot][size=9.0pt]SEH[/size][/font][/i][i][font=宋体][size=9.0pt]进行反跟踪,附件里的[/size][/font][/i][i][font=&quot][size=9.0pt]SHE[/size][/font][/i][i][font=宋体][size=9.0pt]如果用[/size][/font][/i][i][font=&quot][size=9.0pt]SMARTCHECK[/size][/font][/i][i][font=宋体][size=9.0pt]调试的话就合自动退出,附上小楼的源码:[/size][/font][/i][i][font=&quot][size=9.0pt]
Option Explicit
Private Declare Sub DebugBreak Lib "kernel32" ()
Private Sub Command1_Click()
On Error GoTo ERR_RaiseException
DebugBreak
DebugBreak
Exit Sub

ERR_RaiseException:
   MsgBox "[/size][/font][/i][i][font=宋体][size=9.0pt]没有发现调试器[/size][/font][/i][i][font=&quot][size=9.0pt]!"
End Sub

Sub SetHandler()
SetUnhandledExceptionFilter AddressOf NewExceptionHandler
End Sub

Sub RestoreHandler()
SetUnhandledExceptionFilter 0
End Sub

Private Sub Form_Load()
SetHandler
End Sub

Private Sub Form_Unload(Cancel As Integer)
RestoreHandler
End Sub
'SHE[/size][/font][/i][i][font=宋体][size=9.0pt]模块略过。[/size][/font][/i][i][font=&quot][size=9.0pt][/size][/font][/i]
[i][font=宋体][size=9.0pt]除了上面的一些方法外,你还可以用一些密码学知识增加难度,如果技术够强,还可以借用内嵌汇编弄一些花指令和反调试[/size][/font][/i][i][font=&quot][size=9.0pt]SEH[/size][/font][/i][i][font=宋体][size=9.0pt]机制。[/size][/font][/i][i][font=&quot][size=9.0pt][/size][/font][/i]
[size=9.0pt] [/size]

[size=10.5pt] [/size]
[font=宋体][size=10.5pt]感谢[/size][/font][size=10.5pt]laomms[/size][font=宋体][size=10.5pt]大侠给我们上了关于[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]反调试的生动一课[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[b][font=&quot][size=12.0pt]5、
[/size][/font][/b][font=宋体][size=10.5pt]代码混淆?加花,[/size][/font][size=10.5pt]VM[/size][font=宋体][size=10.5pt],选择[/size][/font][size=10.5pt]P-CODE[/size][font=宋体][size=10.5pt]方式等,都可以起到不错的作用。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]有些干脆搬出假目标(什么“注册正确”之类的提示,其实这个地方根本没有正确的算法)甚至,你可以直接修改[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]的开始语句:(主要是防[/size][/font][size=10.5pt]VBExplorer[/size][font=宋体][size=10.5pt]静态分析)[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]正常其实语句:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]004018CC >/$
68 7C1D4000
PUSH 1112.00401D7C[/size]
[size=10.5pt]004018D1
|.
E8 F0FFFFFF
CALL <JMP.&MSVBVM60.#100> [/size]
[font=宋体][size=10.5pt]这个明显透露了[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]程序,我们要做的是搬走这个位置[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]换句话说是把这个[/size][/font][size=10.5pt]CALL[/size][font=宋体][size=10.5pt]移走,移到天南海角去[/size][/font][size=10.5pt]……[/size]
[size=10.5pt]004018D6
|.
0000
ADD BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018D8
|.
0000
ADD BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018DA
|.
0000
ADD BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018DC
|.
3000
XOR BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018DE
|.
0000
ADD BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018E0
|.
3800
CMP BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018E2
|.
0000
ADD BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018E4
|.
0000
ADD BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018E6
|.
0000
ADD BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018E8
|.
3A28
CMP CH,BYTE PTR DS:[EAX][/size]
[size=10.5pt]004018EA
|.
8A00
MOV AL,BYTE PTR DS:[EAX][/size]
[size=10.5pt]004018EC
\.
CF
IRETD[/size]
[font=宋体][size=10.5pt]修改后:―――――――――――――――――――――――》》》[/size][/font][size=10.5pt][/size]
[size=10.5pt]
004018CC > $ /E9 7FA50100
JMP [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].0041BE50[/size]
[size=10.5pt]004018D1
|90
NOP[/size]
[size=10.5pt]004018D2
|90
NOP[/size]
[size=10.5pt]004018D3
|90
NOP[/size]
[size=10.5pt]004018D4
|90
NOP[/size]
[size=10.5pt]004018D5
|90
NOP[/size]
[size=10.5pt]0041BE50
60
PUSHAD[/size]
[size=10.5pt]0041BE51
0F31
RDTSC[/size]
[font=宋体][size=10.5pt]经典时值,单步跟,不小心的话就会进入到错误地址[/size][/font][size=10.5pt][/size]
[size=10.5pt]0041BE53
8BC8
MOV ECX,EAX[/size]
[size=10.5pt]0041BE55
0F31
RDTSC[/size]
[size=10.5pt]0041BE57
2BC1
SUB EAX,ECX[/size]
[size=10.5pt]0041BE59
3D 00050000
CMP EAX,500[/size]
[size=10.5pt]0041BE5E
^ 0F8F BAF9FFFF
JG[/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].0041B81E[/size]
[size=10.5pt]0041BE64
83F8 00
CMP EAX,0[/size]
[size=10.5pt]0041BE67
^ 0F8C C7F9FFFF
JL [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].0041B834[/size]
[size=10.5pt]0041BE6D
61
POPAD[/size]
[size=10.5pt]0041BE6E
68 68504000
PUSH [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].00405068[/size]
[size=10.5pt]0041BE73
60
PUSHAD[/size]
[size=10.5pt]0041BE74
0F31
RDTSC[/size]
[size=10.5pt]0041BE76
8BC8
MOV ECX,EAX[/size]
[size=10.5pt]0041BE78
0F31
RDTSC[/size]
[size=10.5pt]0041BE7A
2BC1
SUB EAX,ECX[/size]
[size=10.5pt]0041BE7C
3D 00050000
CMP EAX,500[/size]
[size=10.5pt]0041BE81
^ 0F8F ADF9FFFF
JG[/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].0041B834[/size]
[size=10.5pt]0041BE87
83F8 00
CMP EAX,0[/size]
[size=10.5pt]0041BE8A
^ 0F8C 8EF9FFFF
JL [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].0041B81E[/size]
[size=10.5pt]0041BE90
61
POPAD[/size]
[size=10.5pt]0041BE91
E8 305AFEFF
CALL<JMP.&MSVBVM60.#100>[/size]
[font=宋体][size=10.5pt]搬到这里来了[/size][/font][size=10.5pt][/size]
[size=10.5pt]0041BE96
^ 0F85 3A5AFEFF
JNZ [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].004018D6[/size]
[size=10.5pt]0041BE9C
^ 0F84345AFEFF
JE [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].004018D6[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]效果:[/size][/font][size=10.5pt][/size]
[size=10.5pt][img=553,382]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image002.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image004.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]如果有时间,你可以自己设计得更恐怖点,东一句西一句,让别人无法还原[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[b][font=&quot][size=12.0pt]5、
[/size][/font][/b][font=宋体][size=10.5pt]注册算法系统[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这个是软件防破解的核心内容,推荐采用[/size][/font]
[font=宋体][size=10.5pt]陷阱+隐藏关键算法到异常里面执行+不可逆算法+公开密码体制+算法跟核心功能模块代码绑定,只有正确解密后的功能代码才能发挥因该有的功能。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]经常碰到[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]的注册算法,一般共享软件不够重视这块内容,只是进行简单的加加减减,或者[/size][/font][size=10.5pt]XOR[/size][font=宋体][size=10.5pt],或者凯撒+矩阵,结果好像跟输入的用户名完全不一样,似乎很安全,其实只要破解者跟踪到了算法,按照那样的计算的话,基本都是明码比较,非常容易破解,甚至根本不用了解你的算法是什么。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]曾经看到过有共享软件作者在网上说:“我用的机器码是随机生成,保存在注册表里的,但是就算这样,别人用了什么内存注册机就把我的注册码算出来了,这到底怎么回事?太受打击了[/size][/font][size=10.5pt]…[/size][font=宋体][size=10.5pt]”[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]市面上出现明码比较的多是些新手写的软件,而且大部分是[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]程序,为什么?因为[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]本身的算法支持不是很好,大都是跟用户名的[/size][/font][size=10.5pt]ASCII[/size][font=宋体][size=10.5pt]码绑定。这些都是弱点,容易被发现和跟踪,别人只要用函数断点断[/size][/font][size=10.5pt]MID[/size][font=宋体][size=10.5pt],[/size][/font][size=10.5pt]LEFT,RIGHT[/size][font=宋体][size=10.5pt]字符函数,那么关于[/size][/font][size=10.5pt]ASCII[/size][font=宋体][size=10.5pt]取用的基本都会被发现。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在这里,我推荐采用浮点计算,除了算法本身不可逆,强度够大,经得起穷举外,还要小心谨慎的隐藏掉比较代码,因为大都初学破解[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]程序的菜鸟都喜欢断[/size][/font][size=9.0pt]StrComp[/size][font=宋体][size=10.5pt]函数,大都可以直接断到关键比较位置,如果你的良好的密码系统即将为你带来第一桶金,但是不幸你发现菜鸟断个比较函数,然后爆破了,呵呵,你的心情怎样?更不要说是明码比较的了。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]浮点计算,你要把字符串转为[/size][/font][size=10.5pt]DOUBLE[/size][font=宋体][size=10.5pt]类型,指数运算和求余运算是比较好的算法,但是[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]本身又不支持大数运算,单纯的指数运算和求余很可能会发生溢出错误。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]高次指数运算和求余可采用[/size][/font][i][font=宋体]中国[/font][/i][font=宋体]剩余定理来计算,也可以看看我写的代码,也许你会有启发:[/font][font=&quot][/font]
[font=&quot] [/font]
[font=宋体]首先是[/font][font=&quot]MOD[/font][font=宋体]函数必须自己写一个,[/font][font=&quot]VB[/font][font=宋体]自带的[/font][font=&quot]MOD[/font][font=宋体]范围太小[/font][font=&quot][/font]
[font=&quot] [/font]
[size=10.5pt]Private Function Modx(x As Double, y AsDouble) As Double[/size]
[size=10.5pt]Dim w As Double[/size]
[size=10.5pt]w = Fix(x / y) * y[/size]
[size=10.5pt]Modx = x - w[/size]
[size=10.5pt]End Function[/size]
[font=宋体][size=10.5pt]这样就实现了稍大数在[/size][/font][size=10.5pt]Vb[/size][font=宋体][size=10.5pt]里的求余动作[/size][/font][size=10.5pt][/size]
[size=10.5pt]Private Function Rsa(p As Double) As Double[/size]
[size=10.5pt]Dim b As Double[/size]
[size=10.5pt]Dim rsan As Double[/size]
[size=10.5pt]rsan = 99221[/size]
[size=10.5pt]Rsa = 1[/size]
[size=10.5pt]For b = 1 To 15935[/size]
[size=10.5pt]Rsa = Rsa * p[/size]
[size=10.5pt]Rsa = Modx(Rsa, rsan)[/size]
[size=10.5pt]Next b[/size]
[size=10.5pt]End Function[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]通过每次都求余,剩下的继续执行指数运算,下次再求余,就避免的误差和溢出[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]我们看下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]3^6 mod 25 = 729 mod 25 =4[/size]
[font=宋体][size=10.5pt]等同于:[/size][/font][size=10.5pt][/size]
[size=10.5pt]3^6 mod 25 =(((((((((3 mod 25) * 3) mod 25) *3) mod 25) * 3) mod 25)* 3) mod 25)* 3 mod 25 = 4[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]可发现计算结果一致,当然这个规律是可以证明的,通过这样的计算法则,我们可以大量减少运算强度。你不想实验下吗?[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]上面给的程序其实就是[/size][/font][size=10.5pt]RSA[/size][font=宋体][size=10.5pt]算法的应用,但是只能当作理论来用,实际上[/size][/font][size=10.5pt]N[/size][font=宋体][size=10.5pt]太小了,非常容易被分解,呵呵,我们以此来学习[/size][/font][size=10.5pt]RSA[/size][font=宋体][size=10.5pt]算法倒是没问题,以后用[/size][/font][size=10.5pt]RSA[/size][font=宋体][size=10.5pt]的时候,只要用第三方[/size][/font][size=10.5pt]DLL[/size][font=宋体][size=10.5pt]即可,比方说《共享软件加密算法库》即有相关应用。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这里的[/size][/font][size=10.5pt]E[/size][font=宋体][size=10.5pt]为[/size][/font][size=10.5pt] 15935[/size]
[font=宋体][size=10.5pt]这里的[/size][/font][size=10.5pt]N[/size][font=宋体][size=10.5pt]为[/size][/font][size=10.5pt] 99221[/size]
[font=宋体][size=10.5pt]这里的加密法则为[/size][/font][size=10.5pt] C = P^E mod N[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]如果[/size][/font][size=10.5pt]N[/size][font=宋体][size=10.5pt]足够大,一般要求[/size][/font][size=10.5pt]512[/size][font=宋体][size=10.5pt]位以上(二进制)才能有些安全度,要破解[/size][/font][size=10.5pt]RSA[/size][font=宋体][size=10.5pt]算法,只要分解[/size][/font][size=10.5pt]N[/size][font=宋体][size=10.5pt]为两个大质数的乘积即可[/size][/font][size=10.5pt]……[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]可以用[/size][/font][size=10.5pt]RSAtool[/size][font=宋体][size=10.5pt]来分解,速度很快[/size][/font][size=10.5pt]……[/size]
[font=宋体][size=10.5pt]分解后计算出[/size][/font][size=10.5pt]D [/size][font=宋体][size=10.5pt](解密密钥)[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]则解密算法为[/size][/font][size=10.5pt] P = C^D mod N[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这里计算出[/size][/font][size=10.5pt]D[/size][font=宋体][size=10.5pt]为[/size][/font][size=10.5pt]48767[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]也就是说逆运算为:[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]解密过程[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]Private Function Jiemi(c As Double) As Double[/size]
[size=10.5pt]Dim b As Double[/size]
[size=10.5pt]Dim rsan As Double[/size]
[size=10.5pt]rsan = 99221[/size]
[size=10.5pt]Jiemi = 1[/size]
[size=10.5pt]For b = 1 To 48767[/size]
[size=10.5pt]Jiemi = Jiemi * c[/size]
[size=10.5pt]Jiemi = Modx(Jiemi, rsan)[/size]
[size=10.5pt]Next b[/size]
[size=10.5pt]End Function[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]当然,还有其他算法也很不错,到时有空再后续系列里详细演示[/size][/font][size=10.5pt]……[/size]
[size=10.5pt] [/size]
[size=10.5pt]
[/size][font=宋体][size=10.5pt]关于如何隐藏关键算法到异常处理中去?[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]
[/size][font=宋体][size=10.5pt]这个一直是[/size][/font][size=10.5pt]Vb[/size][font=宋体][size=10.5pt]里很酷的技术,今天我把自己琢磨出的东西简单说一下,到下期系列的时候再具体演示[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]
VB[/size][font=宋体][size=10.5pt]里的异常处理机制是[/size][/font]
[font=宋体][size=10.5pt]通过[/size][/font][size=10.5pt] On error goto [/size][font=宋体][size=10.5pt]这个语句进行的,这个功能可大了,配合[/size][/font][size=10.5pt]Resume Next[/size][font=宋体][size=10.5pt]、[/size][/font][size=10.5pt]Resume [/size][font=宋体][size=10.5pt]等语句,基本可以实现[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]里的高级隐藏技术[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]
[/size][font=宋体][size=10.5pt]大致是先在算法里嵌入迷惑性质的算法,通过一个可行的数值来产生一个指定的,不常见的错误,比方说可以除零,通过[/size][/font][size=10.5pt] On error goto [/size][font=宋体][size=10.5pt]进行异常捕获,判断[/size][/font][size=10.5pt]Err.Number [/size][font=宋体][size=10.5pt]是否等于某个数值(不同数值对应不同错误类型)或者故意制造出一个溢出来捕获,捕获后可以解密一两句算法,然后通过[/size][/font][size=10.5pt]Resume Next[/size][font=宋体][size=10.5pt]回到原程序,继续解密,又产生其他的错误,然后继续解密真正的算法[/size][/font][size=10.5pt]……[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]大家可以看看具体应用的例子[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=9.0pt][url=http://bbs.pediy.com/showthread.php?t=71741]http://bbs.pediy.com/showthread.php?t=71741[/url][/size][/font]
[font=宋体][size=9.0pt][url=http://bbs.pediy.com/showthread.php?t=72017]http://bbs.pediy.com/showthread.php?t=72017[/url][/size][/font]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这些技术在[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]共享软件里出现过,但是不常见,甚至可以说是稀少了;其作用真的很不错,因为破解者在不知道你具体用意的前提下,一步步分析下来,分析的是正常路径,绝对不会产生我们指定的错误,到最后发现总是无法解密算法,他才意识到似乎掉到一个非同寻常的陷阱里了,然后他回回头往上看,不停的分析,哪里才是正确的[/size][/font][size=10.5pt]JNZ[/size][font=宋体][size=10.5pt]或者[/size][/font][size=10.5pt]JE[/size][font=宋体][size=10.5pt]等跳转指令,殊不知若这样分析,他永远也分析不到我们指定的正确算法[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]说得形象点吧,就像打[/size][/font][size=10.5pt]RPG[/size][font=宋体][size=10.5pt]类单机游戏一样,破解者一步步玩下来,没出现任何差池,最后通关到了打[/size][/font][size=10.5pt]BOSS[/size][font=宋体][size=10.5pt]的时候,发现不管怎么打就是要死,打得都没信心了,为什么如此?因为我们这个游戏要求在玩第一关或者前面几关的时候要触发某些隐藏剧情,或者隐藏剧情的任务奖励,奖励的东西是什么绝世神兵,可以秒杀[/size][/font][size=10.5pt]BOSS[/size][font=宋体][size=10.5pt],或者要触发多个不同的隐藏剧情,获得一组或者好几组密钥等,参与最后的[/size][/font][size=10.5pt]BOSS[/size][font=宋体][size=10.5pt]大决战,少了这些参数,就算游戏顺利玩下来了,最后也是徒劳的[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]而这个隐藏的剧情不是发现了就可以进入隐藏剧情的,我们要求多少经验值,或者多少攻击力,或者以前做过些什么,比方说是帮老奶奶过马路,捡到一分钱交给警察叔叔等,而这些事情是普通玩家和破解者所不会做,或者做不到的[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]比方说我要实现一个异常除零错误,来捕获流程进行注射关键代码(正常情况下是不会发生错误,也就得不到注射了,所以总是要感冒,总是要生病,总是要死的,最后他甚至认为你的程序写的有问题,算法无解等,其实是没有做隐藏任务)[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]如:[/size][/font][size=10.5pt][/size]
[size=10.5pt]On ErrorGoTo chuling[/size]
[size=10.5pt]Dim a AsDouble[/size]
[size=10.5pt]Dim b AsDouble[/size]
[size=10.5pt]a = 110[/size]
[size=10.5pt]b ="&H" & Left(MD5(Right(Text2.Text, 16)), 5[/size]
[size=10.5pt]a = 110 /b Xor 123456789[/size]
[size=10.5pt]If a =123 Then[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]注册码错误[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]提示[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]If a = 0Then MsgBox "[/size][font=宋体][size=10.5pt]注册码正确[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]提示[/size][/font][size=10.5pt]"[/size]
[font=宋体][size=10.5pt]提示[/size][/font]
[font=宋体][size=10.5pt]:想想,正常过来的画,[/size][/font][size=10.5pt]a[/size][font=宋体][size=10.5pt]怎么可能等于[/size][/font][size=10.5pt]0 [/size]
[size=10.5pt]End If[/size]
[size=10.5pt]Exit Sub[/size]
[size=10.5pt]chuling:[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]关键核心算法[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]噢,原来是发生了一次异常,在流程里注射了[/size][/font]
[font=宋体][size=10.5pt]“[/size][/font][size=10.5pt]a= 0[/size][font=宋体][size=10.5pt]”这条指令[/size][/font][size=10.5pt][/size]
[size=10.5pt]a = 0[/size]
[size=10.5pt]ResumeNext[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这只是个简单的实例,[/size][/font][size=10.5pt]MD5[/size][font=宋体][size=10.5pt]是[/size][/font][size=10.5pt]MD5[/size][font=宋体][size=10.5pt]算法,因其逆算要穷举所以作为隐藏剧情的加密是可以的,你事先先计算好某个数字串的[/size][/font][size=10.5pt]MD5[/size][font=宋体][size=10.5pt],转十进制后,算出其有效片段,将该有效片段作为[/size][/font][size=10.5pt]XOR[/size][font=宋体][size=10.5pt]常量,即可。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]不知道要发生异常的人,只会直接看下来,到时总也无法注册成功,就算他知道要做隐藏任务,要使得[/size][/font][size=10.5pt]XOR[/size][font=宋体][size=10.5pt]后为零,使得除数为零出错,他也无法根据已知[/size][/font][size=10.5pt]XOR[/size][font=宋体][size=10.5pt]常数去反推原始数字串,除非爆破,否则难以为继。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]算法还有很多,比方说离散数学原理等都可以用上去[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]如果算法还可以跟具体程序功能代码解密挂钩,那么效果不是一般的好[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]现在是总的概要来说的,总结下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]VB [/size][font=宋体][size=10.5pt]加密算法要求[/size][/font][size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt]1[/size][font=宋体][size=10.5pt]、不可逆及在不知道密钥的情况下,只能加密,不能解密[/size][/font][size=10.5pt] [/size]
[size=10.5pt]2[/size][font=宋体][size=10.5pt]、算法隐藏很隐蔽的陷阱和隐藏剧情,及各类触发条件,最好是一般人都接触不到的触发条件[/size][/font][size=10.5pt] [/size]
[size=10.5pt]3[/size][font=宋体][size=10.5pt]、尽量用公开算法[/size][/font][size=10.5pt] [/size]
[size=10.5pt]4[/size][font=宋体][size=10.5pt]、关键比较必须隐蔽[/size][/font][size=10.5pt] [/size]
[size=10.5pt]5[/size][font=宋体][size=10.5pt]、算法采用注射式,不同的注册码输入验证会激活不同的注射代码[/size][/font][size=10.5pt] [/size]
[size=10.5pt]6[/size][font=宋体][size=10.5pt]、最重要的一点是:算法跟程序很紧密,甚至是程序的大段功能代码都必须用注册码来解密后才能执行正确的功能,否则解密出来的代码执行会出错,这样是为了防止爆破[/size][/font][size=10.5pt] [/size]
[size=10.5pt]7[/size][font=宋体][size=10.5pt]、最后是非明码,用浮点计算[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[b][font=&quot][size=12.0pt]6、
[/size][/font][/b][font=宋体][size=10.5pt]加壳防脱壳[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]单单靠自己一个人的力量很多时候完成一套完整的安全的[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]防破解体系是很困难的,我们要学会“站在巨人的肩膀上”,利用已有工具和加密思想,结合自己的创新,使得程序更加坚固。大部分保护壳都有反调试,防修改,时间限制等功能,好好利用可以增加你的软件的强度。[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]程序一般加壳有三类:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第一,
[/size][/font][font=宋体][size=10.5pt]压缩壳,然后在程序代码里加入检测文件大小等校验手法,主要目的是方修改和方便网络传输,减少体积[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]第二,
[/size][/font][font=宋体][size=10.5pt]保护壳,常见的有[/size][/font][size=10.5pt]ASProctect[/size][font=宋体][size=10.5pt]、[/size][/font][size=10.5pt]Armadillo[/size][font=宋体][size=10.5pt]、[/size][/font][size=10.5pt]EXECryptor[/size][font=宋体][size=10.5pt]、[/size][/font][size=10.5pt]Themida[/size][font=宋体][size=10.5pt]等,有些兼容性不好,有些已经别解密者摸透,不推荐用[/size][/font][size=10.5pt] ASProctect [/size][font=宋体][size=10.5pt],研究的人太多了。[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]第三,
[/size][/font][font=宋体][size=10.5pt]虚拟机保护,常见的有[/size][/font][size=10.5pt]VMProtect[/size][font=宋体][size=10.5pt],将关键代码和算法过程及隐藏任务代码虚拟执行,代码急剧扩张,让人跟得头痛。[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]本身的[/size][/font][size=10.5pt]P-CODE[/size][font=宋体][size=10.5pt]方式也是类似于虚拟机了,但是被人研究的多了,破解只是时间和精力上的问题。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[b][size=12.0pt]7[/size][/b][font=宋体][size=10.5pt]、隐蔽性设计[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]结合异常机制和,反调试机制,界面上进行迷惑等手段,假算法,假注册成功提示,通过给类手段,将真正的算法和功能模块隐藏,执行的时候是正确的流程,但是一旦有调试器存在就会朝着令一个方向,甚至是很多方向发展,无穷无尽的轮回[/size][/font][size=10.5pt]……[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]比方说我画出两个一模一样的注册按钮,当发现调试和异常问题后,就启动令一个模样一样的按钮,原先的按钮就此屏蔽,那么不管破解者如何努力,他们跟踪的算法和事件永远是替换后的按钮对应的算法和事件,而其是根本无法注册成功的[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]参考实例:[/size][/font][size=10.5pt][/size]
[font=宋体][size=9.0pt][url=http://bbs.pediy.com/showthread.php?t=52623]http://bbs.pediy.com/showthread.php?t=52623[/url][/size][/font]
[font=宋体][size=9.0pt][url=http://bbs.pediy.com/showthread.php?t=52189]http://bbs.pediy.com/showthread.php?t=52189[/url][/size][/font]
[font=宋体][size=9.0pt] [/size][/font]
[b][font=宋体][size=12.0pt]8[/size][/font][/b][font=宋体][size=10.5pt]、另辟蹊径[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]常规的注册方式是用户名对应注册码,或者机器码对应注册码,或者机器码+用户名+注册码,或者是单独的注册码;有的是KEYFILE方式,有的是网路验证(目前网络验证结合本地验证已经越来越流行,越来越难搞了)[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]他们有一个共同点,那都是要输入字符,或者是处理字符串,这样一来,都有可能被快速找到断点字符串处理的函数进行破解[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我想能不能用新的注册方式呢?还真的有,但是是概念性的,实用价值还不够大[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我想到的另辟蹊径是利用语音麦克风,让用户读出一段语音,由电脑自动判断是否是对应的“咒语”,这样就避免了字符处理,而且大家对声音的处理都不清楚,也就不好跟踪了,软件作者发售软件到时候,可以根据对方的机器码来计算出相应的读音,进行录音,然后传给消费者,或者刻录到光盘里邮寄给消费者,消费者在每次使用软件的时候,都要跟着录音念一遍咒语,即可被自动识别。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]根据这个原理,我曾经完成了一个CM,下载地址如下:[/size][/font]
[font=宋体][size=10.5pt][url=http://bbs.pediy.com/showthread.php?t=61417]http://bbs.pediy.com/showthread.php?t=61417[/url][/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]朗读咒语的时候,请按住键盘的“Scroll Lock”键,朗读完咒语后松开此键。系统助手(一个老头)会自动通过语音告诉你结果如何。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]现在公布相关代码:(其实核心就是微软的语音识别技术)[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]MyAgent.Characters.Load "Merlin", DATAPATH &"Merlin.acs"[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]获取与CharacterID相对应的IAgentCtlCharacter变量[/size][/font]
[font=宋体][size=10.5pt]Set Merlin = MyAgent.Characters("Merlin")[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]显示/隐藏动画人物[/size][/font]
[font=宋体][size=10.5pt]Merlin.LanguageID = &H409[/size][/font]
[font=宋体][size=10.5pt]Merlin.Show[/size][/font]
[font=宋体][size=10.5pt]Set GenieRequest1 = Merlin.MoveTo(880, 580) '450,300[/size][/font]
[font=宋体][size=10.5pt]Merlin.Speak Chr(87) & Chr(101) & Chr(108) &Chr(99) & Chr(111) & Chr(109) & Chr(101) & Chr(46)[/size][/font]
[font=宋体][size=10.5pt]Merlin.Speak Chr(80) & Chr(108) & Chr(101) &Chr(97) & Chr(115) & Chr(101) & Chr(32) & Chr(114) &Chr(101) & Chr(97) & Chr(100) & Chr(32) & Chr(121) &Chr(111) & Chr(117) & Chr(114) & Chr(32) & Chr(112) &Chr(97) & Chr(115) & Chr(115) & Chr(119) & Chr(111) &Chr(114) & Chr(100)[/size][/font]
[font=宋体][size=10.5pt]Static initialized As Boolean[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]添加自定义命令[/size][/font]
[font=宋体][size=10.5pt]If Not initialized Then[/size][/font]
[font=宋体][size=10.5pt]Merlin.Commands.Add " ", " ", Chr(104)& Chr(101) & Chr(108) & Chr(108) & Chr(111), True, False[/size][/font]
[font=宋体][size=10.5pt]Merlin.Commands.Add "
", " ", Chr(99) & Chr(108) & Chr(111) &Chr(115) & Chr(101), True, False[/size][/font]
[font=宋体][size=10.5pt]Merlin.Commands.Add "
", "", Chr(83) & Chr(67) & Chr(71) &Right(zhucema, 6), True, False[/size][/font]
[font=宋体][size=10.5pt]initialized = True[/size][/font]
[font=宋体][size=10.5pt]End If[/size][/font]
[font=宋体][size=10.5pt]Merlin.Show[/size][/font]
[font=宋体][size=10.5pt]以上是加载语音空间,和电脑动画助手的代码[/size][/font]
[font=宋体][size=10.5pt]Private Sub MyAgent_Command(ByVal UserInput As Object)[/size][/font]
[font=宋体][size=10.5pt]Dim apack As Byte[/size][/font]
[font=宋体][size=10.5pt]Merlin.Play "read"[/size][/font]
[font=宋体][size=10.5pt]Select Case UserInput.Voice[/size][/font]
[font=宋体][size=10.5pt]这句是捕获麦克风语音的代码[/size][/font]
[font=宋体][size=10.5pt]Case Chr(104) & Chr(101) & Chr(108) & Chr(108)& Chr(111)[/size][/font]
[font=宋体][size=10.5pt]Merlin.Speak Chr(104) & Chr(101) & Chr(108) &Chr(108) & Chr(111) & Chr(44) & Chr(115) & Chr(105) &Chr(114) & Chr(46)[/size][/font]
[font=宋体][size=10.5pt]Merlin.Speak Chr(80) & Chr(108) & Chr(101) &Chr(97) & Chr(115) & Chr(101) & Chr(32) & Chr(114) &Chr(101) & Chr(97) & Chr(100) & Chr(32) & Chr(121) &Chr(111) & Chr(117) & Chr(114) & Chr(32) & Chr(112) &Chr(97) & Chr(115) & Chr(115) & Chr(119) & Chr(111) &Chr(114) & Chr(100)[/size][/font]
[font=宋体][size=10.5pt]Case Chr(99) & Chr(108) & Chr(111) & Chr(115) &Chr(101)[/size][/font]
[font=宋体][size=10.5pt]Merlin.Speak Chr(65) & Chr(114) & Chr(101) &Chr(32) & Chr(121) & Chr(111) & Chr(117) & Chr(32) &Chr(115) & Chr(117) & Chr(114) & Chr(101) & Chr(32) &Chr(116) & Chr(111) & Chr(32) & Chr(99) & Chr(108) &Chr(111) & Chr(115) & Chr(101) & Chr(63)[/size][/font]
[font=宋体][size=10.5pt]apack = MsgBox("[/size][/font][font=宋体][size=10.5pt]你确定要退出本程序?", 4 + 32 + 0, "退出请示...")[/size][/font]
[font=宋体][size=10.5pt]If apack = 6 Then End[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]以上是相关处理了,具体代码不便公开了[/size][/font]
[font=宋体][size=10.5pt]局限:没有麦克风和声卡的电脑就不要完成注册了[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]所谓另辟蹊径指的就是使用别人都没有用过的技术,我记得以前有个软件作者(同时也是加密解密高手)将注册信息隐藏到了JPG或者BMP图片里,注册的时候只要把相应的图片选中即可(当然,其本质可能是得到里面的数据,进行处理后还原附加在里面的信息来完成注册,一般人就算能逆出算法,那要怎样修改图片才能使之即可以打开,又可以附带信息呢?)[/size][/font]
[font=宋体][size=10.5pt]这个就是一个另辟蹊径,想他人没有想到的,做他人没有思路做的东西[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]其本质还是要使用强壮的算法了,要不然也容易被逆[/size][/font]
[font=宋体][size=10.5pt]好了,第一讲就到这里吧,第一讲是系统的粗略的讲解下VB防破解设计的思路和相关技术信息。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]如果有空,有时间,有精力,有能力,我将发布第二篇,也就是《[/size][/font][font=宋体][size=10.5pt]共享软件防破解设计技术初探(二)》[/size][/font]
[font=宋体][size=10.5pt]所涉及的应该都是以上讲的,我会的一些具体程序设计过程和完整的代码和成品,手把手教你写出自己满意的,连自己在不源代码的情况下也不能破解的软件。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[align=center][align=center][font=宋体][size=10.5pt]作者:爱琴海[/size][/font][size=10.5pt][SCG] 2008/09/04[/size][font=宋体][size=10.5pt](转载请保留该信息)[/size][/font][font=宋体][size=10.5pt][/size][/font][/align][/align]

最美我中文 发表于 2009-12-5 11:47

[align=center][align=center][b][size=14.0pt]VB [/size][/b][b][font=宋体][size=14.0pt]共享软件防破解设计技术初探(二)[/size][/font][/b][b][size=14.0pt][/size][/b][/align][/align][b][size=14.0pt] [/size][/b]
[align=center][align=center][font=宋体][size=10.5pt]作者:爱琴海[/size][/font][size=10.5pt][SCG] 2008/09/06[/size][font=宋体][size=10.5pt](转载请保留该信息)[/size][/font][size=10.5pt][/size][/align][/align]

[font=宋体]上个篇我粗略的讲了以下几个内容:[/font]

[font=&quot][size=10.5pt]1、
[/size][/font][font=宋体][size=10.5pt]文件完整性,防止被非法修改[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]2、
[/size][/font][font=宋体][size=10.5pt]运行时的校验,防止被[/size][/font][size=10.5pt]LOADER[/size]
[font=&quot][size=10.5pt]3、
[/size][/font][font=宋体][size=10.5pt]反调试,防止动态跟踪和挂接[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]4、
[/size][/font][font=宋体][size=10.5pt]防静态反汇编分析[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]5、
[/size][/font][font=宋体][size=10.5pt]注册码系统(算法部分,核心内容)[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]6、
[/size][/font][font=宋体][size=10.5pt]加壳防脱壳[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]7、
[/size][/font][font=宋体][size=10.5pt]隐蔽性设计[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]8、
[/size][/font][font=宋体][size=10.5pt]另辟蹊径[/size][/font][size=10.5pt][/size]

[font=宋体]列表在这里是为了提醒初学[/font]VB[font=宋体]发布共享软件的朋友,在设计[/font]VB[font=宋体]防破解的时候,不要出现“水桶效应”,也就是说,设计如水桶,任何一个角落缺失都将导致无法全部盛满水。[/font]


[font=宋体]而这个水桶的捆圈恐怕就是保护文件完整性,防止修改了。[/font]

[font=宋体]周末了,今天有点时间。赶快写好,等下吃晚饭,练练琴,然后陪陪女朋友。[/font]


[font=宋体]接下去,我们将开始具体至微的讲解第[/font]1[font=宋体]、[/font]2[font=宋体]两个内容,剩下的老规矩:日后有空,有时间,有精力,有能力的话接着写。[/font]

[b][font=&quot][size=12.0pt]1、
[/size][/font][/b]
[font=宋体][size=10.5pt]文件完整性,可采用[/size][/font][size=10.5pt]CRC32[/size][font=宋体][size=10.5pt]或者[/size][/font][size=10.5pt]MD5[/size][font=宋体][size=10.5pt]或者哈希算法等,计算出文件的加密值,在适当的时候进行对比,判断文件被修改与否。当然那也可以加猛壳来防止文件非法修改。还有简单点的检查文件最后修改时间,看看是否是你自己设置好的时间,如果不是,则很有可能被修改过;也可以检测文件大小,往往压缩壳被脱掉后,文件的大小会增加;保护壳被脱掉后,文件大小会变小,我们可以根据这个设置好临界值来检测有没有被脱壳。常用的还有故意设计好关于算法方面的陷阱,如果是破解者会主动掉进你的陷阱,而事实上,这个跳转除非爆破,不然在算法上是永远也无法到达的,这样就检出破解者在修改程序流程。你可以无声无息的程序死掉,不要直接退出,不然会被追踪到退出函数。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]还有内存镜像校验,是为了防止普通的修改内存和普通断点问题。[/size][/font][size=10.5pt][/size]

[font=宋体]我们就具体演示[/font]3[font=宋体]种[/font]VB[font=宋体]程序的完整性校验设计。[/font]

[font=宋体]第一种是[/font]VB[font=宋体]的[/font]CRC32[font=宋体]自校验设计,包含过程,代码和所有工程文件及演示;[/font]
[font=宋体]第二种是[/font]VB[font=宋体]程序的时间检测法则,包括过程,代码和所有工程文件及演示;[/font]
[font=宋体]第三种是[/font]VB[font=宋体]程序的文件大小检测法则,包括过程,代码和所有工程文件及演示。[/font]

[font=宋体]其实还有些检测的办法,但是原理跟我们即将大曝光的三种办法差不多,都是衍生的吧。[/font]

[font=宋体]第二章
[/font][font=宋体]第一讲[/font]

[size=15.0pt]VB[/size][font=宋体][size=15.0pt]的[/size][/font][size=15.0pt]CRC32[/size][font=宋体][size=15.0pt]自校验设计[/size][/font][size=15.0pt][/size]
[size=15.0pt] [/size]
[font=宋体][size=10.5pt]来来来[/size][/font][size=10.5pt]…[/size][font=宋体][size=10.5pt]大家跟我一起做运动,抖抖手啊,抖抖脚啊,做做深呼吸,本讲将会有点长,力求做到简单明了,容易明白,学完马上上手,学会应用的要求,我会具体点讲,不会像某些高人敝帚自珍,当然如果有错误的地方还请大家多多帮忙纠正,谢谢[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]首先来简单复习下何谓[/size][/font][size=10.5pt]CRC32[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]CRC[/size][/font][font=宋体][size=10.5pt]校验实用程序库在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验,其特点是:检错能力极强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]有查表和计算法,我们可以在程序中自动生成码表来查表计算,方便和快速[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]为了快速带过原理笔墨,节省点时间吃饭,我把网路上的一篇介绍《[/size][/font][font=宋体][size=10.5pt][b]探究CRC32算法实现原理》引述过来,原文地址:[/b][/size][/font]
[font=宋体][size=10.5pt][b] [/b][/size][/font]
[font=宋体][size=9.0pt][url=http://www.diybl.com/course/6_system/linux/Linuxjs/200881/134331.html]http://www.diybl.com/course/6_system/linux/Linuxjs/200881/134331.html#[/url][/size][/font]
[font=宋体][size=9.0pt] [/size][/font]
[font=宋体][size=10.5pt]以下是引用部分——————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[align=left][align=left][font=宋体][size=9.0pt]基于不重造轮子的原则,本文尽量不涉及网络上遍地都是的资料。[/size][/font][/align][/align][align=left][align=left][b][font=宋体][size=9.0pt]What's CRC ?[/size][/font][/b][font=宋体][size=9.0pt][/size][/font][/align][/align][align=left][align=left][font=宋体][size=9.0pt]简而言之,CRC是一个数值。该数值被用于校验数据的正确性。CRC数值简单地说就是通过让你需要做
处理的数据除以一个常数而得到的余数。当你得到这个数值后你可以将这个数值附加到你的数据后,
当数据被传送到其他地方后,取出原始数据(可能在传送过程中被破坏)与附加的CRC数值,然后将这里
的原始数据除以之前那个常数(约定好的)然后得到新的CRC值。比较两个CRC值是否相等即可确认你的
数据是否在传送过程中出现错误。[/size][/font][/align][/align][align=left][align=left][font=宋体][size=9.0pt]那么,如何让你的数据除以一个常数?方法是对你的数据进行必要的编码处理,逐字节处理成数字。
那么这个常数是什么?你不必关注它是什么,也不需要关注它是如何获得的。当你真的要动手写一个
CRC的实现算法时,我可以告诉你,CRC的理论学家会告诉你。不同长度的常数对应着不同的CRC实现算法。
当这个常数为32位时,也就是这里所说的CRC32。[/size][/font][/align][/align][align=left][align=left][font=宋体][size=9.0pt]以上内容你不必全部理解,因为你需要查阅其他资料来获取CRC完整的理论介绍。[/size][/font][/align][/align][align=left][align=left][b][font=宋体][size=9.0pt]The mathematics behind CRC ?[/size][/font][/b][font=宋体][size=9.0pt][/size][/font][/align][/align][align=left][align=left][font=宋体][size=9.0pt]很多教科书会把CRC与多项式关联起来。这里的多项式指的是系数为0或1的式子,例如:
a0 + a1*x + a2*x^2 + ... + an*x^n。其中a0, a1, ..., an要么为0要么为1。我们并不关注x取什么值。
(如果你要关注,你可以简单地认为x为2) 这里把a0, a1, ..., an的值取出来排列起来,就可以表示比特
流。例如 1 + x + x^3所表示的比特流就为:1101。部分资料会将这个顺序颠倒,这个很正常。[/size][/font][/align][/align][align=left][align=left][b][font=宋体][size=9.0pt]什么是生成多项式?[/size][/font][/b][font=宋体][size=9.0pt][/size][/font][/align][/align][align=left][align=left][font=宋体][size=9.0pt]所谓的生成多项式,就是上面我所说的常数。注意,在这里,一个多项式就表示了一个比特流,也就是一堆
1、0,组合起来最终就是一个数值。例如CRC32算法中,这个生成多项式为:
c(x) = 1 + x + x^2 + x^4 + x^5 + x^7 + x^8 + x^10 + x^11 + x^12 + x^16 + x^22 +x^23 + x^26 + x^32。
其对应的数字就为:11101101101110001000001100100000(x^32在实际计算时隐含给出,因此这里没有包含它
的系数),也就是0xEDB88320(多项式对应的数字可能颠倒,颠倒后得到的是0x04C11DB7,其实也是正确的)。[/size][/font][/align][/align][align=left][align=left][font=宋体][size=9.0pt]由此可以看出,CRC值也可以看成我们的数据除以一个生成多项式而得到的余数。[/size][/font][/align][/align][align=left][align=left][b][font=宋体][size=9.0pt]如何做这个除法?[/size][/font][/b][font=宋体][size=9.0pt][/size][/font][/align][/align][align=left][align=left][font=宋体][size=9.0pt]套用大部分教科书给出的计算方法,因为任何数据都可以被处理成纯数字,因此,在某种程度上说,我们可以
直接开始这个除法。尽管事实上这并不是标准的除法。例如,我们的数据为1101011011(方便起见我直接给二进制
表示了,从这里也可以看出,CRC是按bit进行计算的),给定的生成多项式(对应的值)为10011。通常的教科书
会告诉我们在进行这个除法前,会把我们的数据左移几位(生成多项式位数-1位),从而可以容纳将来计算得到
的CRC值(我上面所说的将CRC值附加到原始数据后)。但是为什么要这样做?我也不知道。(不知道的东西不能含糊
而过)那么,除法就为:
            1100001010
       _______________
10011 ) 11010110110000 附加了几个零的新数据
        10011......... 这里的减法(希望你不至于忘掉小学算术)是一个异或操作
        -----.........
         10011........
         10011........
         -----........
          00001....... 逐bit计算
          00000.......
          -----.......
           00010......
           00000......
           -----......
            00101.....
            00000.....
            -----.....
            01011....
            00000....
            -----....
             10110...
             10011...
             -----...
              01010..
              00000..
              -----..
               10100.
               10011.
               -----.
                01110
                00000
                -----
                 1110 = 这个余数也就是所谓的CRC值,通常又被称为校验值。[/size][/font][/align][/align][align=left][align=left][font=宋体][size=9.0pt]希望进行到这里,你可以获取更多关于CRC的感性认识。而我们所要做的,也就是实现一个CRC的计算算法。
说白了,就是提供一个程序,给定一段数据,以及一个生成多项式(对于CRC32算法而言该值固定),然后
计算得出上面的1110余数。[/size][/font][/align][/align][align=left][align=left][b][font=宋体][size=9.0pt]The simplest algorithm.[/size][/font][/b][font=宋体][size=9.0pt][/size][/font][/align][/align][align=left][align=left][font=宋体][size=9.0pt]最简单的实现算法,是一种模拟算法。我们模拟上面的除法过程,遵从网上一份比较全面的资料,我们设定
一个变量register。我们逐bit地将我们的数据放到register中。然后判断register最高位是否为1,如果是
则与生成多项式异或操作,否则继续处理。这个过程简单地模拟了上述除法过程:[/size][/font][/align][/align][font=宋体][size=10.5pt]引用到此结束—————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]看来大家选择CRC32作为数据校验是有原因的,速度快,代价小,检错能力比较大。VB软件作者对CRC32有个认识就好了。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我们编写VB的CRC32自校验程序思路如下:[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]1、
[/size][/font][font=宋体][size=10.5pt]计算出目标文件除掉末尾8字节后的所有数据的CRC32值[/size][/font]
[font=宋体][size=10.5pt]2、
[/size][/font][font=宋体][size=10.5pt]将上面计算出来的结果储存在目标程序的末尾8个字节里[/size][/font]
[font=宋体][size=10.5pt]3、
[/size][/font][font=宋体][size=10.5pt]主体程序内置计算自身除掉末尾8字节后的所有数据的CRC32值的功能代码[/size][/font]
[font=宋体][size=10.5pt]4、
[/size][/font][font=宋体][size=10.5pt]主体程序读取末尾8字节内容与计算的CRC32值比较,不一致说明被修改[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]由1、2点我们发现,如果手动来添加CRC32值将是件麻烦的事情,所以一般我们都会写一个具备计算要求的CRC32值,及把该值添加到目标程序指定位置的程序,帮我们节省时间和体力。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]为了方便记忆和理解,在这里我将它命名为VB-CRC32 注射器,顾名思义,即将计算出来的CRC32注射到目标程序里。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]那么执行自校验的程序我称它为VB-CRC32 主体程序。大家记住了哦,下面开始先设计VB-CRC32注射程序。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]请跟我一起来:[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]打开VB6.0 新建工程[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]新建类模块,名字改为“clsCRC”,别告诉我你不会改名,当然是在“属性窗口”改的。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]将如下类模块代码复制到clsCRC类模块里去:(或者直接从我发布的附件来条用该类模块)[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]注意:类模块后缀名是CLS,请刚接触VB的同学注意,不要跟模块搞混了。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Option Explicit[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Public Enum CRCAlgorithms[/size][/font]
[font=宋体][size=10.5pt]
CRC16[/size][/font]
[font=宋体][size=10.5pt]
CRC32[/size][/font]
[font=宋体][size=10.5pt]End Enum[/size][/font]
[font=宋体][size=10.5pt]Private m_Algorithm As Boolean[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Private m_CRC16 As Long[/size][/font]
[font=宋体][size=10.5pt]Private m_CRC16Asm() As Byte[/size][/font]
[font=宋体][size=10.5pt]Private m_CRC16Init As Boolean[/size][/font]
[font=宋体][size=10.5pt]Private m_CRC16Table(0 To 255) As Long[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Private m_CRC32 As Long[/size][/font]
[font=宋体][size=10.5pt]Private m_CRC32Asm() As Byte[/size][/font]
[font=宋体][size=10.5pt]Private m_CRC32Init As Boolean[/size][/font]
[font=宋体][size=10.5pt]Private m_CRC32Table(0 To 255) As Long[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Private Declare Function CallWindowProc Lib "user32"Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd AsLong, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]此函数作用在这里是内联汇编之用[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Public FunctionAddBytes(ByteArray() As Byte) As Variant[/size][/font]
[font=宋体][size=10.5pt]
Dim ByteSize As Long[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]异常处理[/size][/font]
[font=宋体][size=10.5pt]
On Local Error GoToNoData[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]计算大小[/size][/font]
[font=宋体][size=10.5pt]
ByteSize =UBound(ByteArray) - LBound(ByteArray) + 1[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]异常处理[/size][/font]
[font=宋体][size=10.5pt]
On Local Error GoTo 0[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]内联汇编提高处理速度[/size][/font]
[font=宋体][size=10.5pt]
Select Case m_Algorithm[/size][/font]
[font=宋体][size=10.5pt]
Case CRC16[/size][/font]
[font=宋体][size=10.5pt]
CallCallWindowProc(VarPtr(m_CRC16Asm(0)), VarPtr(m_CRC16),VarPtr(ByteArray(LBound(ByteArray))), VarPtr(m_CRC16Table(0)), ByteSize)[/size][/font]
[font=宋体][size=10.5pt]
Case CRC32[/size][/font]
[font=宋体][size=10.5pt]
CallCallWindowProc(VarPtr(m_CRC32Asm(0)), VarPtr(m_CRC32),VarPtr(ByteArray(LBound(ByteArray))), VarPtr(m_CRC32Table(0)), ByteSize)[/size][/font]
[font=宋体][size=10.5pt]
End Select[/size][/font]
[font=宋体][size=10.5pt]NoData:[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]返回新值[/size][/font]
[font=宋体][size=10.5pt]
AddBytes = Value[/size][/font]
[font=宋体][size=10.5pt]End Function[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Public Function AddString(TextAs String) As Variant[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]将字符转为数组,以便套入函数计算CRC[/size][/font]
[font=宋体][size=10.5pt]
AddString =AddBytes(StrConv(Text, vbFromUnicode))[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]End Function[/size][/font]
[font=宋体][size=10.5pt]Public Property Let Algorithm(New_Value As CRCAlgorithms)[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]选择新算法[/size][/font]
[font=宋体][size=10.5pt]
m_Algorithm = New_Value[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]确定已经初始化新算法[/size][/font]
[font=宋体][size=10.5pt]
Select Case m_Algorithm[/size][/font]
[font=宋体][size=10.5pt]
Case CRC16[/size][/font]
[font=宋体][size=10.5pt]
If (Not m_CRC16Init)Then Call InitializeCRC16[/size][/font]
[font=宋体][size=10.5pt]
Case CRC32[/size][/font]
[font=宋体][size=10.5pt]
If (Not m_CRC32Init)Then Call InitializeCRC32[/size][/font]
[font=宋体][size=10.5pt]
End Select[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]标记[/size][/font]
[font=宋体][size=10.5pt]
Call Clear[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]End Property[/size][/font]
[font=宋体][size=10.5pt]Public Property Get Algorithm() As CRCAlgorithms[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
Algorithm = m_Algorithm[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]End Property[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Public FunctionCalculateBytes(ByteArray() As Byte) As Variant[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]重置CRC计算[/size][/font]
[font=宋体][size=10.5pt]

Call Clear[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]计算[/size][/font]
[font=宋体][size=10.5pt]
CalculateBytes =AddBytes(ByteArray)[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]End Function[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Public FunctionCalculateFile(Filename As String) As Variant[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
Dim Filenr As Integer[/size][/font]
[font=宋体][size=10.5pt]
Dim ByteArray() As Byte[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]检测文件是否包换数据[/size][/font]
[font=宋体][size=10.5pt]
If (FileLen(Filename) =0) Then Exit Function[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]二进制模式读取文件储存到数组里[/size][/font]
[font=宋体][size=10.5pt]
Filenr = FreeFile[/size][/font]
[font=宋体][size=10.5pt]
Open Filename ForBinary As #Filenr[/size][/font]
[font=宋体][size=10.5pt]
ReDim ByteArray(0 ToLOF(Filenr) - 9)[/size][/font]
[font=宋体][size=10.5pt]
Get #Filenr, ,ByteArray()[/size][/font]
[font=宋体][size=10.5pt]
Close #Filenr[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]将该数组交给处理函数计算出CRC[/size][/font]
[font=宋体][size=10.5pt]
CalculateFile =CalculateBytes(ByteArray)[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]End Function[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Public Property Get Value() AsVariant[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
Select Case m_Algorithm[/size][/font]
[font=宋体][size=10.5pt]
Case CRC16[/size][/font]
[font=宋体][size=10.5pt]
Value = (m_CRC16 And65535)[/size][/font]
[font=宋体][size=10.5pt]
Case CRC32[/size][/font]
[font=宋体][size=10.5pt]
Value = (Not m_CRC32)[/size][/font]
[font=宋体][size=10.5pt]
End Select[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]End Property[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Public Property LetValue(New_Value As Variant)[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
Select Case m_Algorithm[/size][/font]
[font=宋体][size=10.5pt]
Case CRC16[/size][/font]
[font=宋体][size=10.5pt]

m_CRC16 = New_Value[/size][/font]
[font=宋体][size=10.5pt]
Case CRC32[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32 = New_Value[/size][/font]
[font=宋体][size=10.5pt]
End Select[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]End Property[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Private Sub InitializeCRC16()[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
Dim i As Long[/size][/font]
[font=宋体][size=10.5pt]
Dim j As Long[/size][/font]
[font=宋体][size=10.5pt]
Dim k As Long[/size][/font]
[font=宋体][size=10.5pt]
Dim CRC As Long[/size][/font]
[font=宋体][size=10.5pt]
Dim sASM As String[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]创建表格[/size][/font]
[font=宋体][size=10.5pt]
For i = 0 To 255[/size][/font]
[font=宋体][size=10.5pt]
k = i * 256[/size][/font]
[font=宋体][size=10.5pt]
CRC = 0[/size][/font]
[font=宋体][size=10.5pt]
For j = 0 To 7[/size][/font]
[font=宋体][size=10.5pt]
If (((CRC Xor k)And 32768) = 32768) Then[/size][/font]
[font=宋体][size=10.5pt]
CRC = (CRC * 2)Xor &H1021[/size][/font]
[font=宋体][size=10.5pt]
Else[/size][/font]
[font=宋体][size=10.5pt]
CRC = (CRC * 2)[/size][/font]
[font=宋体][size=10.5pt]
End If[/size][/font]
[font=宋体][size=10.5pt]
k = k * 2[/size][/font]
[font=宋体][size=10.5pt]
Next[/size][/font]
[font=宋体][size=10.5pt]
m_CRC16Table(i) = CRC'(CRC And 65535)[/size][/font]
[font=宋体][size=10.5pt]
Next[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]内联汇编预处理[/size][/font]
[font=宋体][size=10.5pt]
sASM ="5589E55756505351528B45088B008B750C8B7D108B4D1431DB8A1E30E3668B149F30C66689D0464975EF25FFFF00008B4D0889015A595B585E5F89EC5DC21000"[/size][/font]
[font=宋体][size=10.5pt]
ReDim m_CRC16Asm(0 ToLen(sASM) \ 2 - 1)[/size][/font]
[font=宋体][size=10.5pt]
For i = 1 To Len(sASM)Step 2[/size][/font]
[font=宋体][size=10.5pt]
m_CRC16Asm(i \ 2) =Val("&H" & Mid$(sASM, i, 2))[/size][/font]
[font=宋体][size=10.5pt]
Next[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]标记[/size][/font]
[font=宋体][size=10.5pt]
m_CRC16Init = True[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]End Sub[/size][/font]
[font=宋体][size=10.5pt]Public Sub Clear()[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
m_CRC16 = 0[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32 =&HFFFFFFFF[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]End Sub[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Private Sub InitializeCRC32()[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
Dim i As Long[/size][/font]
[font=宋体][size=10.5pt]
Dim sASM As String[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(0) = &H0[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(1) =&H77073096[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(2) =&HEE0E612C[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(3) =&H990951BA[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(4) =&H76DC419[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(5) =&H706AF48F[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(6) =&HE963A535[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(7) =&H9E6495A3[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(8) =&HEDB8832[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(9) =&H79DCB8A4[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(10) =&HE0D5E91E[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(11) =&H97D2D988[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(12) =&H9B64C2B[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(13) =&H7EB17CBD[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(14) =&HE7B82D07[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(15) =&H90BF1D91[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(16) =&H1DB71064[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(17) =&H6AB020F2[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(18) =&HF3B97148[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(19) =&H84BE41DE[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(20) =&H1ADAD47D[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(21) =&H6DDDE4EB[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(22) =&HF4D4B551[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(23) =&H83D385C7[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(24) =&H136C9856[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(25) =&H646BA8C0[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(26) =&HFD62F97A[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(27) =&H8A65C9EC[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(28) =&H14015C4F[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(29) =&H63066CD9[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(30) =&HFA0F3D63[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(31) =&H8D080DF5[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(32) =&H3B6E20C8[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(33) =&H4C69105E[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(34) =&HD56041E4[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(35) =&HA2677172[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(36) =&H3C03E4D1[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(37) =&H4B04D447[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(38) =&HD20D85FD[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(39) =&HA50AB56B[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(40) =&H35B5A8FA[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(41) =&H42B2986C[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(42) =&HDBBBC9D6[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(43) =&HACBCF940[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(44) =&H32D86CE3[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(45) =&H45DF5C75[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(46) =&HDCD60DCF[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(47) =&HABD13D59[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(48) =&H26D930AC[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(49) =&H51DE003A[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(50) =&HC8D75180[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(51) =&HBFD06116[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(52) =&H21B4F4B5[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(53) =&H56B3C423[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(54) =&HCFBA9599[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(55) =&HB8BDA50F[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(56) =&H2802B89E[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(57) =&H5F058808[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(58) =&HC60CD9B2[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(59) =&HB10BE924[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(60) =&H2F6F7C87[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(61) =&H58684C11[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(62) =&HC1611DAB[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(63) =&HB6662D3D[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(64) =&H76DC4190[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(65) =&H1DB7106[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(66) =&H98D220BC[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(67) =&HEFD5102A[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(68) =&H71B18589[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(69) =&H6B6B51F[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(70) =&H9FBFE4A5[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(71) =&HE8B8D433[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(72) =&H7807C9A2[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(73) =&HF00F934[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(74) =&H9609A88E[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(75) =&HE10E9818[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(76) =&H7F6A0DBB[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(77) =&H86D3D2D[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(78) =&H91646C97[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(79) =&HE6635C01[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(80) =&H6B6B51F4[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(81) =&H1C6C6162[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(82) =&H856530D8[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(83) =&HF262004E[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(84) =&H6C0695ED[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(85) =&H1B01A57B[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(86) =&H8208F4C1[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(87) =&HF50FC457[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(88) =&H65B0D9C6[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(89) =&H12B7E950[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(90) =&H8BBEB8EA[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(91) =&HFCB9887C[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(92) =&H62DD1DDF[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(93) =&H15DA2D49[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(94) =&H8CD37CF3[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(95) =&HFBD44C65[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(96) =&H4DB26158[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(97) =&H3AB551CE[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(98) =&HA3BC0074[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(99) =&HD4BB30E2[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(100) =&H4ADFA541[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(101) =&H3DD895D7[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(102) =&HA4D1C46D[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(103) =&HD3D6F4FB[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(104) =&H4369E96A[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(105) =&H346ED9FC[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(106) =&HAD678846[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(107) =&HDA60B8D0[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(108) =&H44042D73[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(109) =&H33031DE5[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(110) =&HAA0A4C5F[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(111) =&HDD0D7CC9[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(112) =&H5005713C[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(113) =&H270241AA[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(114) =&HBE0B1010[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(115) =&HC90C2086[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(116) =&H5768B525[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(117) =&H206F85B3[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(118) =&HB966D409[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(119) =&HCE61E49F[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(120) =&H5EDEF90E[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(121) =&H29D9C998[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(122) =&HB0D09822[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(123) =&HC7D7A8B4[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(124) =&H59B33D17[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(125) =&H2EB40D81[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(126) =&HB7BD5C3B[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(127) =&HC0BA6CAD[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(128) =&HEDB88320[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(129) =&H9ABFB3B6[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(130) =&H3B6E20C[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(131) =&H74B1D29A[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(132) =&HEAD54739[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(133) =&H9DD277AF[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(134) =&H4DB2615[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(135) =&H73DC1683[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(136) =&HE3630B12[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(137) =&H94643B84[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(138) =&HD6D6A3E[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(139) =&H7A6A5AA8[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(140) =&HE40ECF0B[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(141) =&H9309FF9D[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(142) =&HA00AE27[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(143) =&H7D079EB1[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(144) =&HF00F9344[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(145) =&H8708A3D2[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(146) =&H1E01F268[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(147) =&H6906C2FE[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(148) =&HF762575D[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(149) =&H806567CB[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(150) =&H196C3671[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(151) =&H6E6B06E7[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(152) =&HFED41B76[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(153) =&H89D32BE0[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(154) =&H10DA7A5A[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(155) =&H67DD4ACC[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(156) =&HF9B9DF6F[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(157) =&H8EBEEFF9[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(158) =&H17B7BE43[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(159) = &H60B08ED5[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(160) =&HD6D6A3E8[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(161) =&HA1D1937E[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(162) =&H38D8C2C4[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(163) =&H4FDFF252[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(164) =&HD1BB67F1[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(165) =&HA6BC5767[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(166) =&H3FB506DD[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(167) =&H48B2364B[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(168) =&HD80D2BDA[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(169) =&HAF0A1B4C[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(170) =&H36034AF6[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(171) =&H41047A60[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(172) =&HDF60EFC3[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(173) =&HA867DF55[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(174) =&H316E8EEF[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(175) =&H4669BE79[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(176) =&HCB61B38C[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(177) =&HBC66831A[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(178) =&H256FD2A0[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(179) =&H5268E236[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(180) =&HCC0C7795[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(181) =&HBB0B4703[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(182) =&H220216B9[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(183) =&H5505262F[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(184) =&HC5BA3BBE[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(185) =&HB2BD0B28[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(186) =&H2BB45A92[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(187) =&H5CB36A04[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(188) =&HC2D7FFA7[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(189) =&HB5D0CF31[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(190) =&H2CD99E8B[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(191) =&H5BDEAE1D[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(192) =&H9B64C2B0[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(193) =&HEC63F226[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(194) =&H756AA39C[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(195) =&H26D930A[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(196) =&H9C0906A9[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(197) =&HEB0E363F[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(198) =&H72076785[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(199) =&H5005713[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(200) =&H95BF4A82[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(201) =&HE2B87A14[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(202) =&H7BB12BAE[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(203) =&HCB61B38[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(204) =&H92D28E9B[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(205) =&HE5D5BE0D[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(206) =&H7CDCEFB7[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(207) =&HBDBDF21[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(208) =&H86D3D2D4[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(209) =&HF1D4E242[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(210) =&H68DDB3F8[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(211) =&H1FDA836E[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(212) =&H81BE16CD[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(213) =&HF6B9265B[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(214) =&H6FB077E1[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(215) =&H18B74777[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(216) =&H88085AE6[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(217) =&HFF0F6A70[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(218) =&H66063BCA[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(219) =&H11010B5C[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(220) =&H8F659EFF[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(221) =&HF862AE69[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(222) =&H616BFFD3[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(223) =&H166CCF45[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(224) =&HA00AE278[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(225) =&HD70DD2EE[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(226) =&H4E048354[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(227) =&H3903B3C2[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(228) =&HA7672661[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(229) =&HD06016F7[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(230) =&H4969474D[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(231) =&H3E6E77DB[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(232) =&HAED16A4A[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(233) =&HD9D65ADC[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(234) =&H40DF0B66[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(235) =&H37D83BF0[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(236) =&HA9BCAE53[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(237) =&HDEBB9EC5[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(238) =&H47B2CF7F[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(239) =&H30B5FFE9[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(240) =&HBDBDF21C[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(241) =&HCABAC28A[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(242) =&H53B39330[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(243) =&H24B4A3A6[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(244) =&HBAD03605[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(245) =&HCDD70693[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(246) =&H54DE5729[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(247) =&H23D967BF[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(248) =&HB3667A2E[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(249) =&HC4614AB8[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(250) =&H5D681B02[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(251) =&H2A6F2B94[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(252) =&HB40BBE37[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(253) =&HC30C8EA1[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(254) =&H5A05DF1B[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Table(255) =&H2D02EF8D[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]内联汇编预处理[/size][/font]
[font=宋体][size=10.5pt]
sASM ="5589E557565053518B45088B008B750C8B7D108B4D1431DB8A1E30C3C1E80833049F464975F28B4D088901595B585E5F89EC5DC21000"[/size][/font]
[font=宋体][size=10.5pt]
ReDim m_CRC32Asm(0 ToLen(sASM) \ 2 - 1)[/size][/font]
[font=宋体][size=10.5pt]
For i = 1 To Len(sASM)Step 2[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Asm(i \ 2) =Val("&H" & Mid$(sASM, i, 2))[/size][/font]
[font=宋体][size=10.5pt]
Next[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]标记CRC32[/size][/font]
[font=宋体][size=10.5pt]
m_CRC32Init = True[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]End Sub[/size][/font]
[font=宋体][size=10.5pt]Private Sub Class_Initialize()[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]默认为CRC32算法[/size][/font]
[font=宋体][size=10.5pt]
Algorithm = CRC32[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]End Sub[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]可以看到该类模块里应用了VB内联汇编的技巧,其核心是利用了CallWindowProcA,将定义好的代码串作为数值编入VB,然后通过CallWindowProcA来指定其为执行的代码进行执行。相关内容请到网上查找。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]该模块是我修改来急速计算文件CRC32或者CRC16的,默认情况下是计算CRC32。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]如图:[/size][/font]
[font=宋体][size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image002.jpg[/img][/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]然后双击窗体Form1,在工具栏里选择“工程”,指向“部件”,选择“Microsoft CommonDialog Contrll 6.0”,在工具箱中选择它,添加到窗体上。并改其名为“Openfile”。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]注意:细节美观什么的,大家自己弄,我讲的一般不包含如何设置和美化界面什么的。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]如图:[/size][/font]
[font=宋体][size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image004.jpg[/img][/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]在窗体通用部分添加:[/size][/font]
[font=宋体][size=10.5pt]Private CRC32zhi As String[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]用作储存CRC32的值的[/size][/font]
[font=宋体][size=10.5pt]Private Zhuangtai As Boolean[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]用作标志写入文件是否成功[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]在窗体上添加按钮Command1,命名为“打开”,然后设计代码使通过它跟“Openfile”挂钩(别再问我Openfile是什么,也就是刚才我们使用的Common Dialog控件)[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Openfile[/size][/font][font=宋体][size=10.5pt]的Action我们采用1模式,也就是常见的打开对话框;[/size][/font]
[font=宋体][size=10.5pt]Openfile[/size][/font][font=宋体][size=10.5pt]的Dialog Title我们命名为"
请选择需要添加CRC32自校验值的目标程序"[/size][/font]
[font=宋体][size=10.5pt]Openfire[/size][/font][font=宋体][size=10.5pt]的Filter属性我们设置为"*.exe"[/size][/font]
[font=宋体][size=10.5pt]Openfire[/size][/font][font=宋体][size=10.5pt]的其他属性默认即可[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]为了计算并自动添加CRC32值到目标程序,并且方便大家复制移植代码,我们有必要给它写个过程,或者函数。这里注射写过程就好了,等下设计主体程序时我们也要写函数的。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Private Sub SetCRC32(Lujing AsString)[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]函数化添加CRC32[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]核心代码[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]On Error GoTo CRCerror[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
Dim cCRC As New clsCRC, FileCRC$[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]启用类模块[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
cCRC.Algorithm =CRC32 '[/size][/font][font=宋体][size=10.5pt]选择算法模式是CRC32[/size][/font]
[font=宋体][size=10.5pt]
cCRC.Clear
'[/size][/font][font=宋体][size=10.5pt]算法初始化[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
FileCRC =Hex(cCRC.CalculateFile(Lujing))[/size][/font]
[font=宋体][size=10.5pt]

'[/size][/font][font=宋体][size=10.5pt]计算出目标程序的CRC32,忽略目标程序末尾8字节数值,末尾8字节是用来储存我们示范的CRC32值的[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]
If Len(FileCRC) <8 Then FileCRC = Left("00000000", 8 - Len(FileCRC)) &Hex(cCRC.CalculateFile(Lujing))[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]如果CRC32值不足8位,那么要在前面添加零来补足位数[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]
CRC32zhi = FileCRC[/size][/font]
[font=宋体][size=10.5pt]

'CRC32[/size][/font][font=宋体][size=10.5pt]值储存[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
FileNum = FreeFile[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]获得个文件号(通道)[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]
Open Lujing For Binary As #FileNum[/size][/font]
[font=宋体][size=10.5pt]
Seek FileNum,FileLen(Lujing) - 7[/size][/font]
[font=宋体][size=10.5pt]
Put #FileNum, ,FileCRC[/size][/font]
[font=宋体][size=10.5pt]
Close FileNum[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]用二进制模式打开目标程序,通过SEEK定位需要添加CRC32数值的位置,请注意:这个位置以后大家可以自己改[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]通过PUT将我们计算号的CRC32写入指定位置[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]通过CLOSE关闭通道[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]Zhuangtai = True[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]状态字,表示写入文件成功了[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Exit Sub[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]CRCerror:[/size][/font]
[font=宋体][size=10.5pt]MsgBox "[/size][/font][font=宋体][size=10.5pt]发生意外错误,请检查目标程序是否正在运行?",, "发生意外错误,代码: " &Err.Number[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]End Sub[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]SetCRC32[/size][/font][font=宋体][size=10.5pt]就是特意写的直接完成计算CRC32和写入目标程序的功能过程[/size][/font]
[font=宋体][size=10.5pt]调用格式为:SetCRC32(目标程序路径)[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]看,多么简单不是吗?[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]接下去双击Command1按钮,给它设计功能代码如下:[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Private Sub Command1_Click()[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]示范[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]选择一个待添加CRC32值的自校验程序[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]On Error GoTo Qingjiancha[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]初始化CRC32值,主要是为了清空上次的状态[/size][/font]
[font=宋体][size=10.5pt]CRC32zhi = ""[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]初始化写入成功与否的标志[/size][/font]
[font=宋体][size=10.5pt]Zhuangtai = False[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Dim FilenameNo1 As String[/size][/font]
[font=宋体][size=10.5pt]Openfile.DialogTitle = "
[/size][/font][font=宋体][size=10.5pt]请选择需要添加CRC32自校验值的目标程序"[/size][/font]
[font=宋体][size=10.5pt]Openfile.Filter = "*.exe"[/size][/font]
[font=宋体][size=10.5pt]Openfile.Action = 1[/size][/font]
[font=宋体][size=10.5pt]FilenameNo1 = Openfile.Filename[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]If FilenameNo1 = ""Then Exit Sub[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]检查是否选择了程序[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]If FileLen(FilenameNo1) < 16 Then MsgBox "[/size][/font][font=宋体][size=10.5pt]请检查目标程序是否包含足够数据", , "请检查NO1": Exit Sub[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]检查程序是否包含足够空间和数据,因为储存CRC32需要8个字节的空间,本身计算余量怎么说也要8个字节把?8+8=16[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Big.Caption = "[/size][/font][font=宋体][size=10.5pt]目标程序大小为:" & FileLen(FilenameNo1) & " 字节"[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]SetCRC32 (FilenameNo1)[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]CRCzhi.Caption = "[/size][/font][font=宋体][size=10.5pt]目标程序CRC32值: " & CRC32zhi[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]If Zhuangtai = True Then[/size][/font]
[font=宋体][size=10.5pt]Zhuang.Caption = "CRC32[/size][/font][font=宋体][size=10.5pt]添加状况: 添加成功,你可以启动目标程序的自校验来核实"[/size][/font]
[font=宋体][size=10.5pt]Else[/size][/font]
[font=宋体][size=10.5pt]Zhuang.Caption = "CRC32[/size][/font][font=宋体][size=10.5pt]添加状况: 添加失败,请你检查下目标程序是否正在运行中?"[/size][/font]
[font=宋体][size=10.5pt]End If[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Exit Sub[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]FilenameNo1 = ""[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Qingjiancha:[/size][/font]
[font=宋体][size=10.5pt]MsgBox "[/size][/font][font=宋体][size=10.5pt]发生意外错误,请检查输入等情况是否正常,目标程序是否正在运行?", , "发生意外错误,代码: " & Err.Number[/size][/font]
[font=宋体][size=10.5pt]FilenameNo1 = ""[/size][/font]
[font=宋体][size=10.5pt]End Sub[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]整个程序还需要:一个名为CRCzhi的Label,一个名为Zhuang的Label[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font][font=宋体][size=10.5pt]分别显示计算出来的CRC32值,和显示写入文件是否成功的信息[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]这样子,通过编译,生成EXE文件,执行效果如图:[/size][/font]
[font=宋体][size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image006.jpg[/img][/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]这样我们就完成了VB-CRC32添加校验值到目标程序的注射端。保存工程等文件。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]接下去,我们就来应用该VB-CRC32注射端配合主体程序来完成整个VB-CRC32自校验设计[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]下面开始写VB-CRC32自校验主体程序[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]打开VB6.0,新建工程[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]按照上文一样,建立clsCRC类模块,代码一致,或者直接添加附件里的该类模块也可以。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]如图:[/size][/font]
[font=宋体][size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image008.jpg[/img][/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]然后设计如下图的程序界面,注意需要一个名为Jieguo的Label,建立一个名为“检测“的Command1[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]然后双击窗体,进入代码设计界面[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image010.jpg[/img][/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]在这个主体自校验部分,大家想一下,大概需要写几个什么样的函数?方便复制和移植?[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我认为是两个函数,分别计算自身的CRC32值,和获取已经写入到末尾8字节的CRC32校验值。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]那么说干就干吧:[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Private Function GetCRC32() AsString[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]函数化计算本身的CRC32[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]核心代码[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Dim Lujing As String[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]定义本程序自己的路径变量[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]On Error GoTo CRCerror[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Lujing = App.Path &"\" & App.EXEName & ".exe"[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]这句语句就获得了程序自己的启动路径,这个技巧VB中必须掌握,用处很多[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
Dim cCRC As New clsCRC, FileCRC$[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]启用类模块[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
cCRC.Algorithm =CRC32 '[/size][/font][font=宋体][size=10.5pt]选择算法模式是CRC32[/size][/font]
[font=宋体][size=10.5pt]
cCRC.Clear
'[/size][/font][font=宋体][size=10.5pt]算法初始化[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]
FileCRC =Hex(cCRC.CalculateFile(Lujing))[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]计算出目标程序的CRC32,忽略目标程序末尾8字节数值,末尾8字节是用来储存我们示范的CRC32值的[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]
If Len(FileCRC) <8 Then FileCRC = Left("00000000", 8 - Len(FileCRC)) &Hex(cCRC.CalculateFile(Lujing))[/size][/font]
[font=宋体][size=10.5pt]
'[/size][/font][font=宋体][size=10.5pt]如果CRC32值不足8位,那么要在前面添加零来补足位数[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]
GetCRC32 = FileCRC[/size][/font]
[font=宋体][size=10.5pt]
[/size][/font]
[font=宋体][size=10.5pt]Exit Function[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]CRCerror:[/size][/font]
[font=宋体][size=10.5pt]MsgBox "[/size][/font][font=宋体][size=10.5pt]发生意外错误,程序被破坏?", ,"发生意外错误,代码: " &Err.Number[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]End Function[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]该GetCRC32函数直接当作字符变量来使用即可,可获取自身除末尾8位外其他所有数据的CRC32值,我再强调一遍,这里是做示范,为了方便查看和记忆,特将CRC32校验值储存到目标程序末尾8字节位置,实际应用中,大家可以自己选择一个合理的位置。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Private Function GetZHI() AsString[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]函数化获得末尾标记值[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]这个值是我们用CRC32添加工具添加进去的[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]这个位置你也可以自己修改[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]核心代码[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Dim Lujing As String[/size][/font]
[font=宋体][size=10.5pt]Dim ArrBytes() As Byte[/size][/font]
[font=宋体][size=10.5pt]Dim FilelenNO1[/size][/font]
[font=宋体][size=10.5pt]Dim Xunhuan As Double[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]定义本程序自己的路径变量[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]'On Error GoTo ZHIerror[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Lujing = App.Path &"\" & App.EXEName & ".exe"[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]这句语句就获得了程序自己的启动路径,这个技巧VB中必须掌握,用处很多[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]tfile = FreeFile[/size][/font]
[font=宋体][size=10.5pt]
Open Lujing ForBinary As #tfile
'[/size][/font][font=宋体][size=10.5pt]利用二进制打开自身[/size][/font]
[font=宋体][size=10.5pt]
FilelenNO1 = LOF(tfile)[/size][/font]
[font=宋体][size=10.5pt]
ReDim ArrBytes(1 To FilelenNO1) As Byte '[/size][/font][font=宋体][size=10.5pt]将目标末尾8位储存[/size][/font]
[font=宋体][size=10.5pt]
Get tfile, , ArrBytes[/size][/font]
[font=宋体][size=10.5pt]
Close tfile[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]For Xunhuan = FilelenNO1 - 7To FilelenNO1[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]开始获取这具体的8位[/size][/font]
[font=宋体][size=10.5pt]GetZHI = GetZHI & Chr(ArrBytes(Xunhuan))[/size][/font]
[font=宋体][size=10.5pt]Next Xunhuan[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Exit Function[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]ZHIerror:[/size][/font]
[font=宋体][size=10.5pt]MsgBox "[/size][/font][font=宋体][size=10.5pt]怀疑程序被破坏了", , "错误代码: " & Err.Number[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]End Function[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]该GetZHI函数同样可以当字符形式使用,很方便,从名字上看就知道是为了获取预先储存在本身末尾8字节的CRC32预先计算的值。干什么用?当然是跟上面的GetCRC32函数返回的字符进行比较,看结果是否跟标记的一致,一致就说明程序没有被修改,不一致就说明程序被修改了。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]这个两个关键函数同样可以被大家移植过去使用[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]很高兴能给VB共享软件带来点有趣的有用的东西。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]接下去就是在主体中使用这两个函数[/size][/font]
[font=宋体][size=10.5pt]我们的使用代码是:[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]就简单的一句话就交代了 ^_^[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]我们已经写好了GetCRC32函数和GetZHI函数[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]两个函数返回值为字符串,当然,我们只是做测试,如果真的要[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]应用到软件中去,我推荐还是用浮点计算,制造隐藏剧情[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]甚至内联汇编处理,根据CRC32值来跳转,让人难以琢磨[/size][/font]
[font=宋体][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]使用时,只要使用这两个函数就OK了[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]If GetCRC32 = GetZHI Then[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]MsgBox "[/size][/font][font=宋体][size=10.5pt]程序未被修改过,恭喜你", ,"通过"[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Jieguo.ForeColor = &H80000012 '[/size][/font][font=宋体][size=10.5pt]更改字体颜色为黑色[/size][/font]
[font=宋体][size=10.5pt]Jieguo.Caption = "[/size][/font][font=宋体][size=10.5pt]程序未被修改"[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Else[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]MsgBox "[/size][/font][font=宋体][size=10.5pt]程序被修改,请不要非法修改本程序,共享软件云云...", , "被修改"[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Jieguo.ForeColor = &HFF& '[/size][/font][font=宋体][size=10.5pt]更改字体颜色为红色,表示警告[/size][/font]
[font=宋体][size=10.5pt]Jieguo.Caption = "[/size][/font][font=宋体][size=10.5pt]警告:程序被修改"[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]End If[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]这个使用代码,能看懂的就自己改写,看不懂的就添加到Private Sub Form_Load()事件中去,还有Private SubCommand1_Click()事件中。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]好了,保存工程后,开始编译为EXE文件吧,编译好后,用我们写好的VB-CRC32添加校验值注射工具进行注射一下,这个时候如果有杀毒软件在的话,而且比较好的话,可能会弹出提示问你允不允许修改什么的,我用的微点就会提示和拦截,需要防行。然后运行吧。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]效果如图:[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt][img=536,318]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image011.jpg[/img][/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]可以看到这里显示的目标程序的CRC32自校验码为:60B04682[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我们用UltraEdit打开注射过了的目标主体程序,在末尾看到:[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image013.jpg[/img][/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]可见已经添加成功了,运行主体程序:[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt][img=155,97]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image014.jpg[/img][/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt][img=453,323]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image015.jpg[/img][/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt][img=451,323]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image016.jpg[/img][/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]看来校验通过了,那么我们下面来模拟下破解者修改程序的情况:[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]在VBExplorer中,我们找到检测按钮事件起始地址:405F90[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]代开OD来装载目标主体程序,CTRL+G 直接到 405F90[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]00405F[/size][/font][font=宋体][size=10.5pt]90
> \55
PUSH EBP[/size][/font]
[font=宋体][size=10.5pt]00405F[/size][/font][font=宋体][size=10.5pt]91
.
8BEC
MOV EBP,ESP[/size][/font]
[font=宋体][size=10.5pt]00405F[/size][/font][font=宋体][size=10.5pt]93
.
83EC 0C
SUB ESP,0C[/size][/font]
[font=宋体][size=10.5pt]00405F[/size][/font][font=宋体][size=10.5pt]96
.
6876124000
PUSH<JMP.&MSVBVM60.__vbaExceptHandler>
;
SE [/size][/font][font=宋体][size=10.5pt]处理程序安装[/size][/font]
[font=宋体][size=10.5pt]00405F[/size][/font][font=宋体][size=10.5pt]9B
.
64:A1 0000000>MOV EAX,DWORD PTR FS:[0][/size][/font]
[font=宋体][size=10.5pt]00405FA1
.
50
PUSH EAX[/size][/font]
[font=宋体][size=10.5pt]00405FA2
.
64:8925 00000>MOV DWORD PTR FS:[0],ESP[/size][/font]
[font=宋体][size=10.5pt]00405FA9
.
81EC 9C000000 SUB ESP,9C[/size][/font]
[font=宋体][size=10.5pt]00405FAF
.
53
PUSH EBX[/size][/font]
[font=宋体][size=10.5pt]00405FB0
.
56
PUSH ESI[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]0040604D
. /0F84 D1000000 JE VB[/size][/font][font=宋体][size=10.5pt]防破解.00406124[/size][/font]
[font=宋体][size=10.5pt]‘[/size][/font][font=宋体][size=10.5pt]我们把这句改为必跳实验下,看看CRC32校验的威力[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]0040604D
/E9D2000000
JMP VB[/size][/font][font=宋体][size=10.5pt]防破解.00406124[/size][/font]
[font=宋体][size=10.5pt]00406052
|90
NOP[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]然后保存程序,运行修改后的程序如图:[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt][img=309,96]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image017.jpg[/img][/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt][img=452,323]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image018.jpg[/img][/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]到此我们完成了VB-CRC32自校验程序的设计全部过程,有些问题必须讲以下:[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]也许会有人问:“小爱老师,听说CRC32很厉害,防修改。但是我用了你的代码之后,刚发表的共享软件就被人修改了,怎么回事?”[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]问到点子上了,确实CRC查错能力很强,但是它本身也有脆弱性,本身防修改,但是事实恰恰相反,你可以问下身边的解密高手,当他们遇到CRC32自校验的时候怎么办?[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]一般都是爆破,还有些是替换,替换的话还要重新计算新的CRC32值,比较罗嗦,所以大家都喜欢爆掉CRC32的关键比较点来突破CRC32,而且以此为荣。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]如果你设计VB-CRC32自校验,怎样处理这种情况?首先你要隐蔽你的比较方式,采用浮点计算,套用异常,故意设置隐藏剧情来保护CRC-32的校验,这是个好办法。也有高手说要加壳带CRC32校验。[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]前辈们给的办法是把校验值进行变换,分段,分开,分时,不定时,在各种场合和代码角落进行验证,尽量不给检测到非法修改的提示,而是检测到非法修改也不告诉破解者,悄悄变换程序流程,让他迷路去吧[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]甚至是报复破解者,这个我是不推荐的,但是我可以给个快速关机的过程,直接调用可以在几秒内关闭对方计算机,让对方来不及保存破解笔记和资料,注:往往破解者用影子系统或者虚拟机[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]‘在通用部分加入如下声明:[/size][/font]
[font=宋体][size=10.5pt]Private Declare Function RtlAdjustPrivilege& Lib"ntdll" (ByVal Privilege&, ByVal NewValue&, ByValNewThread&, OldValue&)[/size][/font]
[font=宋体][size=10.5pt]Private Declare Function NtShutdownSystem& Lib"ntdll" (ByVal ShutdownAction&)[/size][/font]
[font=宋体][size=10.5pt]Private Const SE_SHUTDOWN_PRIVILEGE& = 19[/size][/font]
[font=宋体][size=10.5pt]Private Const ShutDown& = 0[/size][/font]
[font=宋体][size=10.5pt]Private Const RESTART& = 1[/size][/font]
[font=宋体][size=10.5pt]Private Const POWEROFF& = 2[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]‘在窗体代码部分增加:[/size][/font]
[font=宋体][size=10.5pt]Sub TurboShutdown(Index As Integer)[/size][/font]
[font=宋体][size=10.5pt]
RtlAdjustPrivilegeSE_SHUTDOWN_PRIVILEGE, 1, 0, 0[/size][/font]
[font=宋体][size=10.5pt]
Select Case Index[/size][/font]
[font=宋体][size=10.5pt]
Case 1 '[/size][/font][font=宋体][size=10.5pt]关机[/size][/font]
[font=宋体][size=10.5pt]
NtShutdownSystem ShutDown[/size][/font]
[font=宋体][size=10.5pt]
Case 2 '[/size][/font][font=宋体][size=10.5pt]重启动[/size][/font]
[font=宋体][size=10.5pt]
NtShutdownSystem RESTART[/size][/font]
[font=宋体][size=10.5pt]
Case 3 '[/size][/font][font=宋体][size=10.5pt]关机[/size][/font]
[font=宋体][size=10.5pt]
NtShutdownSystem POWEROFF[/size][/font]
[font=宋体][size=10.5pt]
End Select[/size][/font]
[font=宋体][size=10.5pt]End Sub[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]调用该快速关机指令为:[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]Call TurboShutdown(1)[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]希望对你有用,但是不要拿来欺负正常使用你软件的顾客哦,不然把顾客都吓跑了[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]注意:以上VB-CRC32全部设计代码和工程文件及程序都发布在附件了,请自行下载[/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]第二章
[/size][/font][font=宋体][size=10.5pt]第二讲[/size][/font]
[size=15.0pt]VB[/size][font=宋体][size=15.0pt]时间自校验设计[/size][/font][size=15.0pt][/size]
[size=15.0pt] [/size]
[font=宋体][size=10.5pt]上一讲我们讲了使用[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]进行[/size][/font][size=10.5pt]CRC32[/size][font=宋体][size=10.5pt]自校验的设计,相信是能让部分[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]软件作者受益的。下次见到你们发表[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]软件的时候,我希望不是随便爆破修改就能破解的了。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]也许你认为[/size][/font][size=10.5pt]VB-CRC32[/size][font=宋体][size=10.5pt]设计有点复杂,你问“小爱老师,有没有简单点的防爆破自校验?”[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]当然是有的[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]你可以先实验下,随便编译个程序,单击右键查看属性,你会发现它包含了你的最后修改时间,一般的复制,黏贴等都不会修改它的“修改时间”属性。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]然而,当破解者修改了你的软件就会被记录下最新的修改时间,如果破解者不注意,而你的设计又够隐蔽,倒是可以检查这个来判断破解者有没有修改过你的软件。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]来,跟我一起做运动[/size][/font][size=10.5pt]……[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0[/size][font=宋体][size=10.5pt]新建工程[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]添加一个按钮,起名为“检测”[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]编写一个检测自身修改时间并作比较的函数:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]Private Function ShiJiancheck() As Boolean[/size]
[size=10.5pt]ShiJiancheck = False[/size]
[size=10.5pt]Dim iFile As String[/size]
[size=10.5pt]Dim FileTime As String[/size]
[size=10.5pt]iFile = App.Path & "\" &App.EXEName & ".exe"[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]获取自身启动路径[/size][/font][size=10.5pt][/size]
[size=10.5pt]FileTime = Format(FileDateTime(iFile),"YYYYMMDDHHMMSS")[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]获得字符串形式的文件最后修改时间[/size][/font][size=10.5pt][/size]
[size=10.5pt]If FileTime = "20080808080808" Then[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]示范设置为[/size][/font][size=10.5pt]2008[/size][font=宋体][size=10.5pt]年[/size][/font][size=10.5pt]08[/size][font=宋体][size=10.5pt]月[/size][/font][size=10.5pt]08[/size][font=宋体][size=10.5pt]日[/size][/font][size=10.5pt]08[/size][font=宋体][size=10.5pt]时[/size][/font][size=10.5pt]08[/size][font=宋体][size=10.5pt]分[/size][/font][size=10.5pt]08[/size][font=宋体][size=10.5pt]秒,这里大家可以自己定,最好不要太特别[/size][/font][size=10.5pt][/size]
[size=10.5pt]ShiJiancheck = True[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]ShiJiancheck = False[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]End Function[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]调用该函数直接当作布尔变量用即可[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]如下调用:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]Private Sub Command1_Click()[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]注意,文件本身的修改时间应该不是我们设定的值[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]所以编译好[/size][/font][size=10.5pt]EXE[/size][font=宋体][size=10.5pt]文件后[/size][/font][size=10.5pt],[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]用文件属性修改器来修改文件最后修改时间到指定数值[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]这个数值不要太特殊了[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]文件属性修改器已经放在同个文件夹下了[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]请使用[/size][/font][size=10.5pt][/size]
[size=10.5pt]If ShiJiancheck = False Then[/size]
[size=10.5pt]MsgBox "[/size][font=宋体][size=10.5pt]文件被修改[/size][/font][size=10.5pt]",, "[/size][font=宋体][size=10.5pt]警告[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]MsgBox "[/size][font=宋体][size=10.5pt]文件正常[/size][/font][size=10.5pt]",, "[/size][font=宋体][size=10.5pt]通过[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]效果如图:(正常状态)[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=319,240]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image019.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]文件被修改后:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=319,240]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image020.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]跟[/size][/font][size=10.5pt]CRC32[/size][font=宋体][size=10.5pt]比,此办法短小精悍,但是容易被识破,请隐蔽比较和检测,不要把结果显示出来,知道了吧?给破解制造一次意外事故应该不是难事吧?[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第二章
[/size][/font][font=宋体][size=10.5pt]第三讲[/size][/font][size=10.5pt][/size]
[size=15.0pt]VB[/size][font=宋体][size=15.0pt]大小自校验设计[/size][/font][size=15.0pt][/size]

[font=宋体]“小爱老师,上面的方法都要修改什么的,太麻烦了,有没有更通用,更普遍的办法,且不用修改程序的呢?”[/font]

[font=宋体]“当然有了,那就是[/font]VB[font=宋体]里面的检测文件大小,但是已经见得多了,已经没什么杀伤力了”[/font]

Vb[font=宋体]里常用检测文件大小的函数为[/font]FILELEN[font=宋体](路径)[/font]

[font=宋体]跟我一起做运动[/font]……

[font=宋体]打开[/font]VB6.0 [font=宋体]新建工程[/font]

[font=宋体]先编写个检测自身大小的函数:[/font]

[font=宋体]我是代码起始线————————————————————————————————[/font]

Private Function FileBig() As Long
'[font=宋体]如果文件巨大[/font],[font=宋体]那么改[/font]LONG[font=宋体]为[/font]DOUBLE
Dim FileLujin As String
filelujing = App.Path & "\"& App.EXEName & ".exe"
FileBig = FileLen(filelujing)
End Function

[font=宋体]我是代码终止线————————————————————————————————[/font]

[font=宋体]具体使用看下面代码:[/font]

[font=宋体]我司代码起始线————————————————————————————————[/font]

Private Sub Form_Load()
If FileBig > 27300 Then
'[font=宋体]第一次这个数字随便设置[/font],[font=宋体]先编译好[/font]
'[font=宋体]用压缩壳将它压缩[/font],[font=宋体]查看压缩后文件大小[/font]
'[font=宋体]回到这里[/font],[font=宋体]修改数值比压缩后的大小大那儿一些就够了[/font]
'[font=宋体]如果被脱壳了[/font],[font=宋体]程序体积就会膨胀[/font]
'[font=宋体]从而被我们检测出来[/font]
'[font=宋体]当然要注意了[/font],[font=宋体]如果是保护壳的话[/font]
'[font=宋体]加壳后反而更大[/font],[font=宋体]这个时候[/font],[font=宋体]我们的判断[/font]
'[font=宋体]语句就要反过来了[/font]
MsgBox "[font=宋体]程序被脱壳了[/font]", , "[font=宋体]警告[/font]"
Else
MsgBox "[font=宋体]程序正常[/font]", , "[font=宋体]通过[/font]"
End If
End Sub

[font=宋体]我是代码终止线————————————————————————————————[/font]

[font=宋体]编译,加壳([/font]ASPACK[font=宋体])程序从[/font]45056[font=宋体]字节压缩为[/font] 27136 [font=宋体]字节,[/font]27300[font=宋体]略大于[/font]27136[font=宋体],脱壳后应该比[/font]45056[font=宋体]可能还要大,这样就能实现检测大小来发现脱壳,也就发现修改了。[/font]

[font=宋体]如图:[/font]

[img=104,95]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image021.jpg[/img]

[font=宋体]脱壳后:大小[/font]71168[font=宋体]字节,为什么这么大呢?呵呵,可能是垃圾代码和垃圾段还没清理吧,可以用[/font]LORDPE[font=宋体]重建,应该会小一点。[/font]

[font=宋体]重建[/font]PE[font=宋体]后,程序大小[/font]46261[font=宋体]字节[/font]
[font=宋体]运行看看:如图[/font]

[img=105,98]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image022.jpg[/img]

[font=宋体]实验成功,但是我还是要提醒一下,这种方法隐蔽点,不要提示的话,也许还能存活,对于[/font]VB[font=宋体]程序,一旦发现自校验,初学者或者有点基础的人都会想到去断点[/font]FILELEN[font=宋体]函数,直接捕获你的对比关键点。[/font]

[font=宋体]所以自校验的设计最关键在于隐蔽和起到误导作用为好,不知不觉中就到了羊肠小道,永远没有回头路[/font]……

[font=宋体]另外要介绍的是同样是检测文件大小以确定是否被脱壳,有些软件作者把数值通过计算好,通过注射方法,写入到主体程序的文件头,这种方法可以比较准确的限定文件大小,而且不容易被发现哦,比方说“超级硬盘搜索正式版”,它就是这么检测的。[/font]

[font=宋体]有点作者把[/font]VB[font=宋体]程序的数据全部加在一起,比较最后的和,这也是种办法,所以大家要学会思考和创新,没有什么是做不到的。[/font]


[font=宋体]第二章
[/font][font=宋体]第四讲[/font]
[size=15.0pt]VB[/size][font=宋体][size=15.0pt]防[/size][/font][size=15.0pt]LOADER[/size][font=宋体][size=15.0pt]设计金蝉脱壳[/size][/font][size=15.0pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]《加密解密技术内幕》一书里提到过两种方法防[/size][/font][size=10.5pt]LOADER[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]其指的是防[/size][/font][size=10.5pt]SMARTCHECK[/size][font=宋体][size=10.5pt],[/size][/font][size=10.5pt]WKTVB DEBUGGER[/size][font=宋体][size=10.5pt]等[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这些技术已经为人所熟知,起不到多么好的作用,我们就了解一下吧,为我们的“金蝉脱壳”做铺垫。[/size][/font]

[font=&quot]1.
[/font][font=宋体]查找特定的窗口标题[/font]
[font=宋体]就像第一讲里提到的:[/font]

[font=宋体]我是引用起始线————————————————————————————————[/font]

[i][font=宋体][size=9.0pt]二、反[/size][/font][/i][i][font=&quot][size=9.0pt]SMARTCHECK[/size][/font][/i][i][font=宋体][size=9.0pt]加载,[/size][/font][/i][i][font=&quot][size=9.0pt]SMARTCHECK[/size][/font][/i][i][font=宋体][size=9.0pt]是调试[/size][/font][/i][i][font=&quot][size=9.0pt]VB[/size][/font][/i][i][font=宋体][size=9.0pt]的利器,有必要对其进行防范。小楼前辈在软件加密技术内幕中提到两种检测方法:[/size][/font][/i][i]
[/i][i][font=宋体][size=9.0pt]利用[/size][/font][/i][i][font=&quot][size=9.0pt]VB[/size][/font][/i][i][font=宋体][size=9.0pt]的[/size][/font][/i][i][font=&quot][size=9.0pt]AppActivate[/size][/font][/i][i][font=宋体][size=9.0pt]函数激活[/size][/font][/i][i][font=&quot][size=9.0pt]SMARTCHECK[/size][/font][/i][i][font=宋体][size=9.0pt]窗口,然后发送[/size][/font][/i][i][font=&quot][size=9.0pt]ALT+F4[/size][/font][/i][i][font=宋体][size=9.0pt]进行关闭该窗口和利用[/size][/font][/i][i][font=&quot][size=9.0pt]FindWindow[/size][/font][/i][i][font=宋体][size=9.0pt]发现[/size][/font][/i][i][font=&quot][size=9.0pt]SMARTCHECK[/size][/font][/i][i][font=宋体][size=9.0pt]窗口直接将其关闭,其代码基本上是这样:[/size][/font][/i][i][font=&quot][size=9.0pt]
winHwnd = FindWindow(vbNullString, "Numega SmartCheck")
If winHwnd <> 0 Then
AppActivate "Numega SmartCheck"
sendkey "%{f4}", True
sendkey "%y", True
   [/size][/font][/i][i][font=宋体][size=9.0pt]其实,我觉得直接检测进程[/size][/font][/i][i][font=&quot][size=9.0pt]SMARTCHK.EXE[/size][/font][/i][i][font=宋体][size=9.0pt]是否存在也可以,方法跟上面类似,你还可以检测其它比如[/size][/font][/i][i][font=&quot][size=9.0pt]W32DASM[/size][/font][/i][i][font=宋体][size=9.0pt]等进程,附件中的[/size][/font][/i][i][font=&quot][size=9.0pt]Anti-Load[/size][/font][/i][i][font=宋体][size=9.0pt]就是实例,发现[/size][/font][/i][i][font=&quot][size=9.0pt]SMARTCHK[/size][/font][/i][i][font=宋体][size=9.0pt]调用,自动退出:[/size][/font][/i][i][font=&quot][size=9.0pt]
…..
If InStr(LCase(Process.szExeFile), "smartchk.exe") > 0 Then
           smart = Process.th32ProcessID
          TerminateProcess hprocess, 0
          Unload Me
        Exit Do
        End If
…….
[/size][/font][/i][font=宋体][size=10.5pt]我是引用终止线————————————————————————————————[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]2.
[/size][/font][font=宋体][size=10.5pt]设置步长和时值计算法[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]其原理是软件正常执行的某一块过程是很快的,基本没多少延时;而通过调试器加载,其加载时间往往要多出十几倍。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]这种方法其实应该是反调试反跟踪里用到的,这里就只提下原理,讲到反调试的时候,我再把我知道的写出来。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]目前还有异常[/size][/font][font=&quot][size=10.5pt]SHE[/size][/font][font=宋体][size=10.5pt]处理,使得调试器无碍继续加载。还有其他的办法,但是我涉及较浅,以后有机会都放到反调试一块讲。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]讲完常见的[/size][/font][font=&quot][size=10.5pt]VB[/size][/font][font=宋体][size=10.5pt]反[/size][/font][font=&quot][size=10.5pt]LOADER[/size][/font][font=宋体][size=10.5pt],你是不是觉得不够好使?如查标题,我改标题你不久查不到了吗?[/size][/font]
[font=宋体][size=10.5pt]如步长记时,现在的电脑配置参差不齐,这步长时值该怎么时值好呢?[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]左思右想,终于被我想到了个办法——金蝉脱壳[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]所谓金蝉脱壳指的是核心的东西在你眼皮底下溜走了,抓不到。留下的是一层幻灭的轮回。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]VB[/size][/font][font=宋体][size=10.5pt]金蝉脱壳反[/size][/font][font=&quot][size=10.5pt]LOADER[/size][/font][font=宋体][size=10.5pt]技术基于程序迭代[/size][/font][font=&quot][size=10.5pt]SHELL[/size][/font][font=宋体][size=10.5pt],第一次运行不会真的开始,而是为了调用本身进行第二次运行,就此结束掉第一次运行,以此类推,知道几百几千次,需要的时间大概在半秒到左右。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]形象点讲就像小孩子走路,故意跌倒,然后爬起来,又故意跌倒,让你永远把握不到他,知道他再起来的时候,你早就离开那里了。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]比如[/size][/font][font=&quot][size=10.5pt]A[/size][/font][font=宋体][size=10.5pt]实例,运行后,重新调用[/size][/font][font=&quot][size=10.5pt]A[/size][/font][font=宋体][size=10.5pt],然后本次[/size][/font][font=&quot][size=10.5pt]A[/size][/font][font=宋体][size=10.5pt]实例自动结束,第二次[/size][/font][font=&quot][size=10.5pt]A[/size][/font][font=宋体][size=10.5pt]实例启动,再次调用[/size][/font][font=&quot][size=10.5pt]A[/size][/font][font=宋体][size=10.5pt]实例,然后又关闭自己。这样调试器第一跟踪,如果不爆破的话,势必无法继续跟了,到后来,调试器里显示的是父本程序已经结束了,但实际中,经过几百到几千次迭代[/size][/font][font=&quot][size=10.5pt]SHELL[/size][/font][font=宋体][size=10.5pt]后,程序已经打开。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]就像人生一样,调试器跟踪的只是你的上一世,甚至是几百几千世以前的你,而现在的你还好好得活着。这个时候,如果不爆破的话,调试器大概还可以用附加来强行钻入程序空间。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]这样的思路是可行的,但是你有没有想到过如何判断本次运行已经达到要求,可以正常开始?还是继续轮回?[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]要求程序依靠自己的标记,而不依靠外界的标记,不然容易被人发现且从外界修改是非常容易攻破的。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]因为程序是同一个程序,凭什么上一辈子要立刻轮回,而这辈子就可以正常存活呢?判断的标准在哪里?同样的程序,同样的标准,为什么会产生不同的轮回结果?[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]答案呼之欲出了,对了,就是随机数。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]通过概率,每次轮回的概率是一样的,是同样的标准,但是概率本身又可以导致不同的方向和结果。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]于是我想到设置一个循环取随机数的结构,循环[/size][/font][font=&quot][size=10.5pt]7[/size][/font][font=宋体][size=10.5pt]次,每次产生一个随机数,要么是[/size][/font][font=&quot][size=10.5pt]1[/size][/font][font=宋体][size=10.5pt],要么是零,然后把这七个数相加来判断是否等于零,如果等于零就不必继续轮回了,如果不等于零,那么[/size][/font][font=&quot][size=10.5pt]SHELL[/size][/font][font=宋体][size=10.5pt]自己,然后马上死掉。因为每次随机数取[/size][/font][font=&quot][size=10.5pt]0[/size][/font][font=宋体][size=10.5pt]活着取[/size][/font][font=&quot][size=10.5pt]1[/size][/font][font=宋体][size=10.5pt]的概率是一样的,都是[/size][/font][font=&quot][size=10.5pt]0.5[/size][/font][font=宋体][size=10.5pt],所以,[/size][/font][font=&quot][size=10.5pt]7[/size][/font][font=宋体][size=10.5pt]次随机数取值全部为零的概率是[/size][/font][font=&quot][size=10.5pt]0.5^7[/size][/font][font=宋体][size=10.5pt]=[/size][/font][font=&quot][size=10.5pt]0.0078125[/size][/font][font=宋体][size=10.5pt],倒数为[/size][/font][font=&quot][size=10.5pt]128[/size][/font][font=宋体][size=10.5pt],即大概需要轮回[/size][/font][font=&quot][size=10.5pt]128[/size][/font][font=宋体][size=10.5pt]次才可以正常运行程序,否则都是[/size][/font][font=&quot][size=10.5pt]SHELL[/size][/font][font=宋体][size=10.5pt]自己,然后父本死掉。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]单单靠解释可能还是有朋友看不明白,没关系,我们先写程序先,慢慢测试调试,你就发现其巧妙的地方了。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]首先写一个[/size][/font][font=&quot][size=10.5pt]7[/size][/font][font=宋体][size=10.5pt]次循环取[/size][/font][font=&quot][size=10.5pt]0[/size][/font][font=宋体][size=10.5pt]或取[/size][/font][font=&quot][size=10.5pt]1[/size][/font][font=宋体][size=10.5pt]的结构,然后把[/size][/font][font=&quot][size=10.5pt]7[/size][/font][font=宋体][size=10.5pt]次结果相加,与[/size][/font][font=&quot][size=10.5pt]0[/size][/font][font=宋体][size=10.5pt]作比较,将轮回金蝉脱克功能嵌入进去。以后程序在运行开头,只要调用一次我的这个[/size][/font][font=&quot][size=10.5pt]SUB[/size][/font][font=宋体][size=10.5pt]过程即可实现防[/size][/font][font=&quot][size=10.5pt]LOADER[/size][/font][font=宋体][size=10.5pt],等会我们还要测试下效果呢。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]PrivateSub JinChan()[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]OnError GoTo ANTI[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]只有在被调试的时候才有可能出错[/size][/font][font=&quot][size=10.5pt],[/size][/font][font=宋体][size=10.5pt]恰好被我们捕获[/size][/font][font=&quot][size=10.5pt],[/size][/font][font=宋体][size=10.5pt]呵呵[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]DimLujing As String[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]储存程序自身路径[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]DimSuiji(7) As Byte[/size][/font]
[font=&quot][size=10.5pt]'7[/size][/font][font=宋体][size=10.5pt]个元素数组[/size][/font][font=&quot][size=10.5pt],[/size][/font][font=宋体][size=10.5pt]用于储存每次随机数[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]Dimn As Long[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]循环计数器[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]DimPanduan As Double[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]累加器[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]Lujing= App.Path & "\" & App.EXEName & ".exe"[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]获得程序自身路径[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]Forn = 1 To 7[/size][/font]
[font=&quot][size=10.5pt]Randomize[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]每次都初始化随机数生成器[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]Suiji(n)= Int(Rnd * 2)[/size][/font]
[font=&quot][size=10.5pt]‘[/size][/font][font=宋体][size=10.5pt]取随机数[/size][/font][font=&quot][size=10.5pt]0[/size][/font][font=宋体][size=10.5pt]或者[/size][/font][font=&quot][size=10.5pt]1[/size][/font]
[font=&quot][size=10.5pt]Panduan= Panduan + Suiji(n)[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]累加[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]Nextn[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]IfPanduan > 0 Then[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]如果累加总结果不为零[/size][/font][font=&quot][size=10.5pt],[/size][/font][font=宋体][size=10.5pt]那就[/size][/font][font=&quot][size=10.5pt]SHELL[/size][/font][font=宋体][size=10.5pt]自己一次[/size][/font][font=&quot][size=10.5pt],[/size][/font][font=宋体][size=10.5pt]然后通过[/size][/font][font=&quot][size=10.5pt]END[/size][/font][font=宋体][size=10.5pt]结束自己[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]ShellLujing, 1[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]进入下一个轮回哦[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]End[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]结束这一世[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]EndIf[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]如果上面的累加器等于零,则说明达到了[/size][/font][font=&quot][size=10.5pt]0.5^7[/size][/font][font=宋体][size=10.5pt]的概率了,其倒数为[/size][/font][font=&quot][size=10.5pt]128[/size][/font][font=宋体][size=10.5pt],即我们已经轮[/size][/font][font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]回[/size][/font][font=&quot][size=10.5pt]128[/size][/font][font=宋体][size=10.5pt]是世了。[/size][/font][font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]调试器跟踪的只是我们的第一世。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]到这里来的话也就是不执行[/size][/font][font=&quot][size=10.5pt]SHELL[/size][/font][font=宋体][size=10.5pt]内容,也不执行[/size][/font][font=&quot][size=10.5pt]END[/size][/font][font=宋体][size=10.5pt],直接到这里来了[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]正常运行[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]Exitsub[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]ANTI:[/size][/font]
[font=&quot][size=10.5pt]MsgBox"[/size][/font][font=宋体][size=10.5pt]发现调试器[/size][/font][font=&quot][size=10.5pt],[/size][/font][font=宋体][size=10.5pt]请关闭调试器[/size][/font][font=&quot][size=10.5pt]", , "[/size][/font][font=宋体][size=10.5pt]警告[/size][/font][font=&quot][size=10.5pt]"[/size][/font]
[font=&quot][size=10.5pt]End[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]EndSub[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]以后只要把[/size][/font][font=&quot][size=10.5pt]JinChan[/size][/font][font=宋体][size=10.5pt]写入到主窗体[/size][/font][font=&quot][size=10.5pt]LOAD[/size][/font][font=宋体][size=10.5pt]事件中,就实现了金蝉脱壳效果。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]大家跟我来做运动:[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]打开[/size][/font][font=&quot][size=10.5pt]VB6.0 [/size][/font][font=宋体][size=10.5pt]新建工程[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]在窗体代码里,拷贝上面的代码进去[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]然后在[/size][/font][font=&quot][size=10.5pt]Private Sub Form_Load()[/size][/font][font=宋体][size=10.5pt]里输入[/size][/font][font=&quot][size=10.5pt]JinChan,[/size][/font][font=宋体][size=10.5pt]编译生成[/size][/font][font=&quot][size=10.5pt]EXE[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]即:[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]PrivateSub Form_Load()[/size][/font]
[font=&quot][size=10.5pt]JinChan[/size][/font]
[font=&quot][size=10.5pt]EndSub[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]先运行一下[/size][/font][font=&quot][size=10.5pt]EXE[/size][/font][font=宋体][size=10.5pt],看看速度如何,然后再用[/size][/font][font=&quot][size=10.5pt]OD[/size][/font][font=宋体][size=10.5pt]或者[/size][/font][font=&quot][size=10.5pt]SMARTCHECK[/size][/font][font=宋体][size=10.5pt]等测试下,看看是不是无法跟踪到轮回后的这一世,前提是不能爆破。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]效果还是很好的,[/size][/font][font=&quot][size=10.5pt]OD[/size][/font][font=宋体][size=10.5pt]如果开着[/size][/font][font=&quot][size=10.5pt]HIDEOD[/size][/font][font=宋体][size=10.5pt]插件的话,那么在执行[/size][/font][font=&quot][size=10.5pt]SHELL[/size][/font][font=宋体][size=10.5pt]的时候,会自动捕获错误以发现调试器,然后程序自动结束,也相当于起到了防[/size][/font][font=&quot][size=10.5pt]LOADER[/size][/font][font=宋体][size=10.5pt]作用。如果[/size][/font][font=&quot][size=10.5pt]OD[/size][/font][font=宋体][size=10.5pt]关闭[/size][/font][font=&quot][size=10.5pt]HIDEOD[/size][/font][font=宋体][size=10.5pt]插件,那么就可以直接体现出“金蝉脱壳”的效果了。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]如图:通过捕获异常发现调试器[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image024.jpg[/img][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]如图,如果没有异常,那么金蝉脱克将发挥作用,轮回百世。调试器里已经结束,但是程序其实轮回转世了。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image026.jpg[/img][/size][/font]
[font=宋体][size=10.5pt]好了,没想到随便写写可以写这么多,看的我头晕了。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]希望你也别头晕,我们来总结下,《[/size][/font][font=&quot][size=10.5pt]VB [/size][/font][font=宋体][size=10.5pt]共享软件防破解涉及技术初探(二)》都讲了那些内容:[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]1、
[/size][/font][font=宋体][size=10.5pt]设计思想:水桶原理[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]2、
[/size][/font][font=宋体][size=10.5pt]完整性校验,包括[/size][/font][font=&quot][size=10.5pt]VB-CRC32[/size][/font][font=宋体][size=10.5pt]注射器和主体的编写;文件修改时间自校验;文件大小自校验等[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]3、
[/size][/font][font=宋体][size=10.5pt]防[/size][/font][font=&quot][size=10.5pt]LOADER[/size][/font][font=宋体][size=10.5pt]设计,包括查找标题,经典时值,还有重点的“金蝉脱壳”反[/size][/font][font=&quot][size=10.5pt]LOADER[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]这一期就到这里了,熬夜写教程很累,呵呵[/size][/font][font=&quot][size=10.5pt][/size][/font]
[align=center][align=center][font=宋体][size=10.5pt]还是老规矩,如果有时间,有精力,有空,有能力,我将接着写《[/size][/font][b][size=10.5pt][b]VB [/b][/size][/b][b][font=宋体][size=10.5pt][b]共享软件防破解设计[/b][/size][/font][/b][b][size=10.5pt][b][/b][/size][/b][/align][/align][b][font=宋体][size=10.5pt][b]技术初探(三)》,感谢大家的支持。[/b][/size][/font][/b][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]希望大家能多顶顶,尤其是学习[/size][/font][font=&quot][size=10.5pt]VB[/size][/font][font=宋体][size=10.5pt]写软件的朋友,希望对你有用。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[align=center][align=center][size=10.5pt] [/size][/align][/align][align=center][align=center][size=10.5pt] [/size][/align][/align][align=center][align=center][size=10.5pt] [/size][/align][/align][align=center][align=center][size=10.5pt] [/size][/align][/align][align=center][align=center][size=10.5pt] [/size][/align][/align][align=center][align=center][size=10.5pt] [/size][/align][/align][align=center][align=center][size=10.5pt] [/size][/align][/align][align=center][align=center][size=10.5pt] [/size][/align][/align][align=center][align=center][size=10.5pt] [/size][/align][/align][align=center][align=center][size=10.5pt] [/size][/align][/align][align=center][align=center][size=10.5pt] [/size][/align][/align][align=center][align=center][size=10.5pt] [/size][/align][/align][align=center][align=center][size=10.5pt] [/size][/align][/align][align=center][align=center][size=10.5pt] [/size][/align][/align][align=center][align=center][font=宋体][size=10.5pt]作者:爱琴海[/size][/font][size=10.5pt][SCG] 2008/09/06[/size][font=宋体][size=10.5pt](转载请保留该信息)[/size][/font][size=10.5pt][/size][/align][/align][font=&quot][size=10.5pt] [/size][/font]

最美我中文 发表于 2009-12-5 11:55

[align=center][align=center][b][size=14.0pt]VB [/size][/b][b][font=宋体][size=14.0pt]共享软件防破解设计技术初探(三)[/size][/font][/b][b][size=14.0pt][/size][/b][/align][/align]
[align=center][align=center][font=宋体][size=10.5pt]作者:爱琴海[/size][/font][size=10.5pt][SCG] 2008/09/10[/size][font=宋体][size=10.5pt](转载请保留该信息)[/size][/font][size=10.5pt][/size][/align][/align][size=10.5pt] [/size]
[font=宋体]第一篇我粗略的讲了以下几个内容:[/font]

[font=&quot][size=10.5pt]1、
[/size][/font][font=宋体][size=10.5pt]文件完整性,防止被非法修改[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]2、
[/size][/font][font=宋体][size=10.5pt]运行时的校验,防止被[/size][/font][size=10.5pt]LOADER[/size]
[font=&quot][size=10.5pt]3、
[/size][/font][font=宋体][size=10.5pt]反调试,防止动态跟踪和挂接[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]4、
[/size][/font][font=宋体][size=10.5pt]防静态反汇编分析[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]5、
[/size][/font][font=宋体][size=10.5pt]注册码系统(算法部分,核心内容)[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]6、
[/size][/font][font=宋体][size=10.5pt]加壳防脱壳[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]7、
[/size][/font][font=宋体][size=10.5pt]隐蔽性设计[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]8、
[/size][/font][font=宋体][size=10.5pt]另辟蹊径[/size][/font][size=10.5pt][/size]

[font=宋体]第二篇我详细得讲解了以下内容:[/font]

[font=&quot][size=10.5pt]1[/size][/font][font=宋体][size=10.5pt]、设计思想:水桶原理[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]2[/size][/font][font=宋体][size=10.5pt]、完整性校验,包括[/size][/font][font=&quot][size=10.5pt]VB-CRC32[/size][/font][font=宋体][size=10.5pt]注射器和主体的编写;文件修改时间自校验;文件大小自校验等[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]3[/size][/font][font=宋体][size=10.5pt]、防[/size][/font][font=&quot][size=10.5pt]LOADER[/size][/font][font=宋体][size=10.5pt]设计,包括查找标题,经典时值,还有重点的“金蝉脱壳”反[/size][/font][font=&quot][size=10.5pt]LOADER[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]上节课我忘讲了种常见的反[/size][/font][font=&quot][size=10.5pt]LOADER[/size][/font][font=宋体][size=10.5pt]的方法:释放程序法(借鸡生蛋)[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]这里赶紧补上:[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[align=center][align=center][font=宋体][size=10.5pt]释放程序法(借鸡生蛋)[/size][/font][font=&quot][size=10.5pt][/size][/font][/align][/align][font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]原理:讲需要保护的程序作为自定义资源添加到新的[/size][/font][font=&quot][size=10.5pt]VB[/size][/font][font=宋体][size=10.5pt]程序里,新程序一运行就自动释放内部包含的程序到特定位置,然后通过[/size][/font][font=&quot][size=10.5pt]SHELL[/size][/font][font=宋体][size=10.5pt]调用,自身则结束运行,怀疑就是“借鸡生蛋”,也是常用的木马病毒免杀技术。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]打开[/size][/font][font=&quot][size=10.5pt]VB6.0 [/size][/font][font=宋体][size=10.5pt]新建工程,然后单击“外接程序”――“外接程序管理器”――“[/size][/font][font=&quot][size=10.5pt]VB 6 [/size][/font][font=宋体][size=10.5pt]资源编辑器”,在右下角选项里选择“加载[/size][/font][font=&quot][size=10.5pt]/[/size][/font][font=宋体][size=10.5pt]卸载”,然后单击“确定”[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]这时,在[/size][/font][font=&quot][size=10.5pt]VB6.0[/size][/font][font=宋体][size=10.5pt]主程序窗口上方的工具条最后,就会出现一个跟注册表编辑程序挺像的绿色图标,单击它。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]如图:[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image002.jpg[/img][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]选择自定义添加图标,然后在出现的窗口里,选择你要保护的[/size][/font][font=&quot][size=10.5pt]EXE[/size][/font][font=宋体][size=10.5pt]程序。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]如图:[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt][img=455,324]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image003.jpg[/img][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]添加完资源后,按下“保存”按钮[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]这样,资源就被添加为代号为[/size][/font][font=&quot][size=10.5pt]101[/size][/font][font=宋体][size=10.5pt]的数据,同理,就绪添加,就从[/size][/font][font=&quot][size=10.5pt]102[/size][/font][font=宋体][size=10.5pt]开始,一直增长上去,你也可以自己修改代号,方便记忆。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]下面我们来写一个自动释放子体的过程[/size][/font][font=&quot][size=10.5pt]SUB[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码启示线————————————————————————————————[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]PrivateSub Shifang()[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]OnError GoTo TakeError[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]DimLujing As String[/size][/font]
[font=&quot][size=10.5pt]Lujing= "C:\WINDOWS\system32\[/size][/font][font=宋体][size=10.5pt]缓存[/size][/font][font=&quot][size=10.5pt].exe"[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]定义缓存路径[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]IfDir(Lujing) = "" Then[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]检测子体是否已经存在[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]不是的话就直接释放一个即可[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]DimShuzu() As Byte[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]定义一个数组储存数据[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]Shuzu()= LoadResData(101, "CUSTOM")[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]加载数据[/size][/font][font=&quot][size=10.5pt],101[/size][/font][font=宋体][size=10.5pt]代号指的就是我们添加的[/size][/font][font=&quot][size=10.5pt]EXE[/size][/font][font=宋体][size=10.5pt]子体[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]OpenLujing For Binary As #1[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]定义一个缓存路径[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]Put#1, , Shuzu()[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]开始写入[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]Close#1[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]关闭通道[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]Else[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]KillLujing[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]发现已经存在就删除它[/size][/font][font=&quot][size=10.5pt],[/size][/font][font=宋体][size=10.5pt]然后就重新创建[/size][/font][font=&quot][size=10.5pt];[/size][/font][font=宋体][size=10.5pt]目的是为了防止有人故意同名替换[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]定义一个数组储存数据[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]Shuzu()= LoadResData(101, "CUSTOM")[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]加载数据[/size][/font][font=&quot][size=10.5pt],101[/size][/font][font=宋体][size=10.5pt]代号指的就是我们添加的[/size][/font][font=&quot][size=10.5pt]EXE[/size][/font][font=宋体][size=10.5pt]子体[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]OpenLujing For Binary As #1[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]定义一个缓存路径[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]Put#1, , Shuzu()[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]开始写入[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]Close#1[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]关闭通道[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]EndIf[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]ShellLujing, vbNormalFocus[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]释放好后就[/size][/font][font=&quot][size=10.5pt]SHELL[/size][/font][font=宋体][size=10.5pt]使其运行[/size][/font][font=&quot][size=10.5pt],[/size][/font][font=宋体][size=10.5pt]接下去就结束掉自己[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]End[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]TakeError:[/size][/font]
[font=&quot][size=10.5pt]'[/size][/font][font=宋体][size=10.5pt]一般发生错误是因为子体正在运行[/size][/font][font=&quot][size=10.5pt],[/size][/font][font=宋体][size=10.5pt]无法删除或者覆盖[/size][/font][font=&quot][size=10.5pt],[/size][/font][font=宋体][size=10.5pt]或者是因为[/size][/font][font=&quot][size=10.5pt]OD[/size][/font][font=宋体][size=10.5pt]的[/size][/font][font=&quot][size=10.5pt]HIDEOD[/size][/font][font=宋体][size=10.5pt]插件引起[/size][/font][font=&quot][size=10.5pt]SHELL[/size][/font][font=宋体][size=10.5pt]错误[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]MsgBox"[/size][/font][font=宋体][size=10.5pt]请检查我是否正在运行?或者,是因为调试器?请检查[/size][/font][font=&quot][size=10.5pt]", , "[/size][/font][font=宋体][size=10.5pt]发现问题了[/size][/font][font=&quot][size=10.5pt]"[/size][/font]
[font=&quot][size=10.5pt]End[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]EndSub[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]调用的话,在[/size][/font][font=&quot][size=10.5pt]FORM[/size][/font][font=宋体][size=10.5pt]的[/size][/font][font=&quot][size=10.5pt]LOAD[/size][/font][font=宋体][size=10.5pt]事件里,或者其他启动事件里即可,如下:[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt]PrivateSub Form_Load()[/size][/font]
[font=&quot][size=10.5pt]Shifang[/size][/font]
[font=&quot][size=10.5pt]EndSub[/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]看看效果吧![/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]正常运行,跟运行一个程序感觉上没有什么差别[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]如果加载[/size][/font][font=&quot][size=10.5pt]OD[/size][/font][font=宋体][size=10.5pt]调试器的话,如果[/size][/font][font=&quot][size=10.5pt]OD[/size][/font][font=宋体][size=10.5pt]刚好加载[/size][/font][font=&quot][size=10.5pt]HIDEOD[/size][/font][font=宋体][size=10.5pt]插件的话,就会提示错误,发现调试器:[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]如图:[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image005.jpg[/img][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]如果关闭[/size][/font][font=&quot][size=10.5pt]HIDEOD[/size][/font][font=宋体][size=10.5pt]插件,就会自动借鸡生蛋,使调试器无法加载正确的子体程序[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]如图:[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image007.jpg[/img][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]需要注意一点,只要够小心的人,一定会发现真正的程序所在,所以子体程序最好加上自删除代码,也就是检测到[/size][/font][font=&quot][size=10.5pt]UNLOAD[/size][/font][font=宋体][size=10.5pt]事件后,自动删除自己,或者调用批处理,隐藏删除自己。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我碰到过的一些用[/size][/font][font=&quot][size=10.5pt]VB[/size][/font][font=宋体][size=10.5pt]写的外挂也就是用这种技术来逃避调试器的。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]这种技术就讲解到这里,我们开始新的篇章喽[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]第三篇我将具体介绍[/size][/font][font=&quot][size=10.5pt]1[/size][/font][font=宋体][size=10.5pt]、[/size][/font][font=&quot][size=10.5pt]VB[/size][/font][font=宋体][size=10.5pt]反调试反跟踪[/size][/font][size=10.5pt] 2[/size][font=宋体][size=10.5pt]、防静态反汇编分析[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]设计加密解密不久,能力有限,见识短浅,请各位高手见谅,有错误和不足之处敬请原谅,并请你阐述你自己的见解,共同完成《[/size][/font][b][size=10.5pt][b]VB [/b][/size][/b][b][font=宋体][size=10.5pt][b]共享软件防破解设计技术初探》系列文章,您的参与和支持是我的荣幸和骄傲。[/b][/size][/font][/b][size=10.5pt][/size]
[font=&quot][size=10.5pt] [/size][/font]

[font=宋体]这篇开篇前我把自己想到的[/font]VB[font=宋体]程序防破解设计图展示下,看看大家想到了什么?自由发挥[/font]

[img=308,255]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image008.jpg[/img]

[font=宋体]我心中总有个声音:你设计的只是针对技术层面,无法真的长久的保证你的软件不被破解[/font]

[font=宋体]实际生活中,我们需要八卦一样的“阴阳鱼”,一切造化的根本。(我在故弄玄虚吧?)[/font]
[font=宋体]一个是阳刚的“法律”保障,一个是怀柔的“道义”安抚。[/font]

[font=宋体]在这里引述一篇文章里的片段,具体作者是谁,大家自己查[/font]
[font=宋体]原文是《[/font][font=&quot][size=10.5pt][b][url=http://blog.csdn.net/wangjiwei2010/archive/2006/09/22/1267020.aspx][font=宋体]如何让你的共享软件在国内赚到每月超过万元[/font][/url][/b][/size][/font][font=宋体][size=10.5pt][b]》[/b][/size][/font][font=&quot][size=10.5pt][b][/b][/size][/font]
[font=&quot][size=10.5pt][b] [/b][/size][/font]
[font=宋体][size=10.5pt][b]引用从这里开始————————————————————————————————[/b][/size][/font][font=&quot][size=10.5pt][b][/b][/size][/font]
[align=left][align=left][font=宋体][size=9.0pt]四、面对盗版不惊慌[/size][/font]
[font=宋体][size=9.0pt]当用户找到了你的软件,下载安装并试用之后,发现使用简单,符合自己的需求,很想要,如果你是用户,显然,你就会去找盗版,如何找?两条途径吗[/size][/font][font=&quot][size=9.0pt][/size][/font][/align][/align][align=left][align=left][font=宋体][size=9.0pt]第一:到搜索引擎中去搜索某某软件后面加一个破解,注册机之类的。结果呢?人家找到了,也就不会买了。另外,还会去盗版碟市场去找,看看有没有破解版的碟。呵呵,第一种情况好对付,你不是在搜索引擎中找吗?作为作者,你也可以用你的正版软件冒充盗版软件到处去发布呀,比如:你可以发布某某软件的破解版,让你的假破解版充斥了整个搜索引擎的结果。当用户下载了[/size][/font][font=&quot][size=9.0pt]10[/size][/font][font=宋体][size=9.0pt]个假破解之后,也自然会想到,这个软件没有破解版了。哦,对了,如果有真破解出现在搜索结果的前几位,也不用着急,首先,打电话给你所在地的公证处,花[/size][/font][font=&quot][size=9.0pt]300[/size][/font][font=宋体][size=9.0pt]元,把你所找到的页面做个公证。(我保证你这[/size][/font][font=&quot][size=9.0pt]300[/size][/font][font=宋体][size=9.0pt]元能够赚回来),然后,想办法找到这个网站的站长,不要管这个网站是个人的还是企业的。联系这个站长,把公证书的复印件,你软件版权的复印件传真给他,限定他在[/size][/font][font=&quot][size=9.0pt]7[/size][/font][font=宋体][size=9.0pt]日内与你进行协商解决。过期,你将在你所在地的人民法院起诉(诉讼费[/size][/font][font=&quot][size=9.0pt]50[/size][/font][font=宋体][size=9.0pt]元),什么?诉状不会写?找我呀,[/size][/font][font=&quot][size=9.0pt]100[/size][/font][font=宋体][size=9.0pt]元,帮你写一份。如何计算赔偿金额?哦,很简单,一般下载站都有提供下载数统计的,用下载量乘以你的软件的价格就是他该赔的金额,(呵呵,算起来很吓人的)。如果你很忙,找个律师是值得的。[/size][/font][font=&quot][size=9.0pt][/size][/font][/align][/align][align=left][align=left]
[font=宋体][size=9.0pt]第二、如果在盗版碟市场出现了你的软件,那我告诉你,是喜也是忧,喜的是,你的软件很有名吗,忧的是,只有升级,做更好的软件了。辛苦你了。为了避免这种情况的出现,在你的软件中,加上网上认证的加密办法是可行的。加密点千万不要搞在一个地方,另外,为了防止跟踪破解,一个简单的办法,就是认证通过之后,不要弹出对话框之类的,默默的就让用户开始用吧。千万不要弹出什么:恭喜您,您注册成功了,恭喜您,您登陆成功了的对话框。人家找你的加密点,一跟踪这个对话框就行了。呵呵,这只是防破解的小技巧。其他的防破解方法,你可以查阅相关资料。一句话,与破解做斗争,不该妥协。哪怕花费比所得还要高,你也要与破解盗版做斗争,如同抗日一样,和平时期,也要抗日。要用抗日的精神来抵抗破解盗版。什么?你的软件也是用的盗版[/size][/font][font=&quot][size=9.0pt]VC[/size][/font][font=宋体][size=9.0pt]写的?这也没关系,那是另外一回事情,微软没找你麻烦,那是微软的事。并不妨碍你找破解者的麻烦。总不能因为唐朝的时候咋们侵略过别国,就不抵抗日本侵略了吧?[/size][/font][font=&quot][size=9.0pt][/size][/font][/align][/align][font=&quot][size=10.5pt][b] [/b][/size][/font]
[font=宋体][size=10.5pt][b]引用到此结束—————————————————————————————————[/b][/size][/font][font=&quot][size=10.5pt][b][/b][/size][/font]
[font=&quot][size=10.5pt][b] [/b][/size][/font]
[font=宋体][size=10.5pt][b]文中作者告诉我们的是:[/b][/size][/font][font=&quot][size=10.5pt][b][/b][/size][/font]
[font=&quot][size=10.5pt][b] [/b][/size][/font]
[font=&quot][size=10.5pt][b]1、
[/b][/size][/font][font=宋体][size=10.5pt][b]定时关注互联网搜索引擎关于你的软件破解信息[/b][/size][/font][font=&quot][size=10.5pt][b][/b][/size][/font]
[font=&quot][size=10.5pt][b]2、
[/b][/size][/font][font=宋体][size=10.5pt][b]到盗版碟市场看看有没有你的软件破解注册版[/b][/size][/font][font=&quot][size=10.5pt][b][/b][/size][/font]
[font=&quot][size=10.5pt][b]3、
[/b][/size][/font][font=宋体][size=10.5pt][b]冒充破解版在网上大量发布,覆盖大部分搜索出来的破解信息资源[/b][/size][/font][font=&quot][size=10.5pt][b][/b][/size][/font]
[font=&quot][size=10.5pt][b]4、
[/b][/size][/font][font=宋体][size=10.5pt][b]利用法律武器,作公证、取证,警告发布破解信息的站点或者论坛或者其他发布者[/b][/size][/font][font=&quot][size=10.5pt][b][/b][/size][/font]
[font=&quot][size=10.5pt][b]5、
[/b][/size][/font][font=宋体][size=10.5pt][b]聘请律师,委托代办,发律师信,甚至对簿公堂。[/b][/size][/font][font=&quot][size=10.5pt][b][/b][/size][/font]
[font=&quot][size=10.5pt][b]6、
[/b][/size][/font][font=宋体][size=10.5pt][b]发现破解版大量存在,那么只能更新软件,加强加密强度。[/b][/size][/font][font=&quot][size=10.5pt][b][/b][/size][/font]
[font=宋体][size=10.5pt][b](如硬件加密狗,反正羊毛出在羊身上[/b][/size][/font][font=&quot][size=10.5pt][b]…..[/b][/size][/font][font=宋体][size=10.5pt][b])[/b][/size][/font][font=&quot][size=10.5pt][b][/b][/size][/font]
[font=&quot][size=10.5pt][b]7、
[/b][/size][/font][font=宋体][size=10.5pt][b]隐藏注册结果信息,让用户用着吧,让破解者徘徊迷路吧[/b][/size][/font][font=&quot][size=10.5pt][b][/b][/size][/font]
[font=&quot][size=10.5pt][b]8、
[/b][/size][/font][font=宋体][size=10.5pt]要用抗日的精神来抵抗破解盗版[/size][/font][font=&quot][size=10.5pt][b][/b][/size][/font]


[font=宋体]相信作者能靠共享软件月入万金,在这里由衷的恭喜他发财。[/font]

[font=宋体]这个讲的就是我要说的法律武器,阳刚十足,捍卫自己的利益。但有时,刚性太强,反而容易折断,高碳钢硬度很大,但是脆;低碳钢硬度比较小,但是柔韧。[/font]

[font=宋体]这里重点聊聊怀柔“道义”,你的软件的质量,软件的功能要对得起你收的注册费,这个就是道义;[/font]
[font=宋体]你的售后服务,服务的态度和服务水平要对得起你的承诺,这个就是道义;[/font]
[font=宋体]你对未注册版的限制要合理,不要给用户带来很不良好的体验和心理感觉,这个就是道义;不能强迫用户注册,动不动就跳到注册网页去了,这个就是道义;[/font]
[font=宋体]你对某些支持过你,给你提好意见的用户,免费送注册码,这个也是道义;[/font]
[font=宋体]定期给某些特定用户群发放免费注册码,或者在特定的时候发布特定的纪念版免费回馈社会,这个也是道义;[/font]
[font=宋体]你的防破解设计里不应该有刺激破解者的语言和指令,如关机、格盘、删除系统文件、摧毁数据等,这个更是道义了。[/font]

[font=宋体]有这样的软件,它在收取少量的注册费后,将部分收入以公开名义捐赠给四川灾区,这样的软件在道义上他是高尚的,在道义上便已经让很多有良知的高手罢手了。破解者破解了它,发布了它,他将遭到道义上的谴责和唾弃。[/font]

[font=宋体]《道德经》讲“道可道非常道”,这“道”便是一切,道义也是“道”的范畴。你的软件连道义都没有,先不说会不会激怒破解者和一些不搞破解的逆向分析师来破解你的软件(无他,只因不爽)单单说有没有用户用你的破解版都还是个问题呢。[/font]

[font=宋体]比如说:江民炸弹[/font]

[font=宋体]引用从此开始—————————————————————————————————[/font]

[font=宋体][size=9.0pt]简介[/size][/font][font=&quot][size=9.0pt]
1997[/size][/font][font=宋体][size=9.0pt]年[/size][/font][font=&quot][size=9.0pt]6[/size][/font][font=宋体][size=9.0pt]月[/size][/font][font=&quot][size=9.0pt]24[/size][/font][font=宋体][size=9.0pt]日王江民先生在其主页上发布了[/size][/font][font=&quot][size=9.0pt]kv300l++[/size][/font][font=宋体][size=9.0pt]版,内含逻辑炸弹。[/size][/font]
[font=宋体][size=9.0pt]凡是在[/size][/font][font=&quot][size=9.0pt]mk300v4[/size][/font][font=宋体][size=9.0pt]制作的仿真盘(盗版盘)上执行[/size][/font][font=&quot][size=9.0pt]kv300l++[/size][/font][font=宋体][size=9.0pt]的用户硬盘数据均被破坏,[/size][/font]
[font=宋体][size=9.0pt]同时硬盘被锁,软硬盘皆不能启动。[/size][/font][font=&quot][size=9.0pt]
Kv300[/size][/font][font=宋体][size=9.0pt]逻辑炸弹可以造成电脑软硬盘都不能启动的现象,[/size][/font]
[font=宋体][size=9.0pt]当时在电脑界引起轰动。这是用常规原理不能解释的现象。[/size][/font][font=&quot][size=9.0pt]

kv300[/size][/font][font=宋体][size=9.0pt]逻辑炸弹表现[/size][/font][font=&quot][size=9.0pt]
1[/size][/font][font=宋体][size=9.0pt].先破坏文件分配表,然后修改分区表造成硬盘被锁。[/size][/font][font=&quot][size=9.0pt]
2[/size][/font][font=宋体][size=9.0pt].不做任何备份[/size][/font][font=&quot][size=9.0pt]
3[/size][/font][font=宋体][size=9.0pt].没有任何提示[/size][/font][font=&quot][size=9.0pt]
4[/size][/font][font=宋体][size=9.0pt].在特定条件下激发(盗版盘)[/size][/font][font=&quot][size=9.0pt]
5[/size][/font][font=宋体][size=9.0pt].王江民始终没有公开提供恢复程序;[/size][/font][font=&quot][size=9.0pt]
6[/size][/font][font=宋体][size=9.0pt].如果用一般常用的修复磁盘工具,如[/size][/font][font=&quot][size=9.0pt]NORTON,[/size][/font][font=宋体][size=9.0pt]会造成不可逆转的损失;[/size][/font][font=&quot][size=9.0pt]
7[/size][/font][font=宋体][size=9.0pt].对其的恢复类似于[/size][/font][font=&quot][size=9.0pt]cih[/size][/font][font=宋体][size=9.0pt]破坏数据的恢复,因为需要重建分区表。[/size][/font][font=&quot][size=9.0pt]
8[/size][/font][font=宋体][size=9.0pt].在[/size][/font][font=&quot][size=9.0pt]win95[/size][/font][font=宋体][size=9.0pt]环境下执行同样会造成文件分配表被破坏,数据损失。[/size][/font]
[font=宋体][size=9.0pt]处理[/size][/font][font=&quot][size=9.0pt]

1997[/size][/font][font=宋体][size=9.0pt]年[/size][/font][font=&quot][size=9.0pt]7[/size][/font][font=宋体][size=9.0pt]月[/size][/font][font=&quot][size=9.0pt]23[/size][/font][font=宋体][size=9.0pt]日,国内[/size][/font][font=&quot][size=9.0pt]5[/size][/font][font=宋体][size=9.0pt]家反病毒软件公司(以下简称五厂商)在北京联合举行新闻发布会,一起谴责国内另一家著名的反病毒软件公司[/size][/font][font=&quot][size=9.0pt]—[/size][/font][font=宋体][size=9.0pt]北京江民新技术有限责任公司(以下简称江民公司)。在发布会上,五厂商向多家新闻机构发放了一份[/size][/font][font=&quot][size=9.0pt]“[/size][/font][font=宋体][size=9.0pt]联合声明[/size][/font][font=&quot][size=9.0pt]”[/size][/font][font=宋体][size=9.0pt],称江民公司[/size][/font][font=&quot][size=9.0pt]6[/size][/font][font=宋体][size=9.0pt]月下旬发布的[/size][/font][font=&quot][size=9.0pt]KV300L+ +[/size][/font][font=宋体][size=9.0pt]版反病毒软件(网络下载版)(以下简称[/size][/font][font=&quot][size=9.0pt]KV300[/size][/font][font=宋体][size=9.0pt],本文无特殊说明,所指的均是这一特定下载版本)中含有[/size][/font][font=&quot][size=9.0pt]“[/size][/font][font=宋体][size=9.0pt]逻辑炸弹[/size][/font][font=&quot][size=9.0pt]”[/size][/font][font=宋体][size=9.0pt],[/size][/font][font=&quot][size=9.0pt]“[/size][/font][font=宋体][size=9.0pt]在特定条件下对计算机实施破坏,其结果与某些计算机病毒的破坏作用相似[/size][/font][font=&quot][size=9.0pt]……” —7[/size][/font][font=宋体][size=9.0pt]月[/size][/font][font=&quot][size=9.0pt]24[/size][/font][font=宋体][size=9.0pt]日,江民公司对五厂商的[/size][/font][font=&quot][size=9.0pt]“[/size][/font][font=宋体][size=9.0pt]联合声明[/size][/font][font=&quot][size=9.0pt]”[/size][/font][font=宋体][size=9.0pt]做出了强烈反应,认为这时[/size][/font][font=&quot][size=9.0pt]“[/size][/font][font=宋体][size=9.0pt]不正当的侵权行为[/size][/font][font=&quot][size=9.0pt]”[/size][/font][font=宋体][size=9.0pt],并多次在各专业计算机所刊上登载[/size][/font][font=&quot][size=9.0pt]“[/size][/font][font=宋体][size=9.0pt]严正声明[/size][/font][font=&quot][size=9.0pt]”[/size][/font][font=宋体][size=9.0pt],江民公司对此的解释是:江民公司并未在[/size][/font][font=&quot][size=9.0pt]KV300[/size][/font][font=宋体][size=9.0pt]中安放任何破坏性程序。五厂商所称的[/size][/font][font=&quot][size=9.0pt]“[/size][/font][font=宋体][size=9.0pt]逻辑炸弹[/size][/font][font=&quot][size=9.0pt]”[/size][/font][font=宋体][size=9.0pt],其实是江民公司为打击日益猖獗的盗版软件行为而在软件中编制的[/size][/font][font=&quot][size=9.0pt]“[/size][/font][font=宋体][size=9.0pt]逻辑锁[/size][/font][font=&quot][size=9.0pt]”[/size][/font][font=宋体][size=9.0pt],这一[/size][/font][font=&quot][size=9.0pt]“[/size][/font][font=宋体][size=9.0pt]逻辑锁[/size][/font][font=&quot][size=9.0pt]”[/size][/font][font=宋体][size=9.0pt]首先不可能对任何购买正版产品的用户造成任何影和损失,其次对部分盗版用户也只是起到暂时锁住机器的作用。江民公司特别强调,[/size][/font][font=&quot][size=9.0pt]KV300[/size][/font][font=宋体][size=9.0pt]中的[/size][/font][font=&quot][size=9.0pt]“[/size][/font][font=宋体][size=9.0pt]逻辑锁[/size][/font][font=&quot][size=9.0pt]”[/size][/font][font=宋体][size=9.0pt]与病毒没有关系,因为病毒是具有自我复制和传染性的破坏性程序,而[/size][/font][font=&quot][size=9.0pt]“[/size][/font][font=宋体][size=9.0pt]逻辑锁[/size][/font][font=&quot][size=9.0pt]”[/size][/font][font=宋体][size=9.0pt]却不会对用户数据造成任何伤害[/size][/font][font=&quot][size=9.0pt] 1997[/size][/font][font=宋体][size=9.0pt]年[/size][/font][font=&quot][size=9.0pt]9[/size][/font][font=宋体][size=9.0pt]月[/size][/font][font=&quot][size=9.0pt]8[/size][/font][font=宋体][size=9.0pt]日,公安部门认定[/size][/font][font=&quot][size=9.0pt]kv300L++[/size][/font][font=宋体][size=9.0pt]事件违反计算机安全保护条例之[/size][/font][font=&quot][size=9.0pt]23[/size][/font][font=宋体][size=9.0pt]条[/size][/font][font=&quot][size=9.0pt],[/size][/font][font=宋体][size=9.0pt]属于故意输入有害数据,危害计算机信息[/size][/font]
[font=宋体][size=9.0pt]系统安全的行为,对其做出罚款[/size][/font][font=&quot][size=9.0pt]3000[/size][/font][font=宋体][size=9.0pt]元的决定[/size][/font]
[font=宋体][size=9.0pt]关于[/size][/font][font=&quot][size=9.0pt]KV300 '[/size][/font][font=宋体][size=9.0pt]逻辑锁[/size][/font][font=&quot][size=9.0pt]' [/size][/font][font=宋体][size=9.0pt]的看法[/size][/font]
[font=宋体][size=9.0pt]王江民口口声声说[/size][/font][font=&quot][size=9.0pt] KV300 L++ [/size][/font][font=宋体][size=9.0pt]里面没有逻辑炸弹[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]只有所谓[/size][/font][font=&quot][size=9.0pt] '[/size][/font][font=宋体][size=9.0pt]主动式逻辑锁[/size][/font][font=&quot][size=9.0pt]'. [/size][/font][font=宋体][size=9.0pt]似乎这样讲就不需要承担责任了[/size][/font][font=&quot][size=9.0pt]!
        [/size][/font][font=宋体][size=9.0pt]的确[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]在中国有关计算机安全和保护软件消费者的法律还不健全[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]王江民的类似行为暂时还无法受到法律的制裁[/size][/font][font=&quot][size=9.0pt]. [/size][/font][font=宋体][size=9.0pt]但我们需要进行这方面的讨论[/size][/font][font=&quot][size=9.0pt]. [/size][/font][font=宋体][size=9.0pt]以了解我们消费者的权利和可以采取的措施[/size][/font][font=&quot][size=9.0pt].
        [/size][/font][font=宋体][size=9.0pt]从道义上和法律意义上讲[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]王江民的这种做法已经侵犯了公民的权利[/size][/font][font=&quot][size=9.0pt]. [/size][/font][font=宋体][size=9.0pt]王江民认为盗版应视同小偷[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]可以用锁把他锁起来[/size][/font][font=&quot][size=9.0pt]. [/size][/font][font=宋体][size=9.0pt]但是[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]我们应该清楚[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]中国法律只付予了警察等执法机关有执法的权利[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]你王江民有什么权利执法[/size][/font][font=&quot][size=9.0pt]? [/size][/font][font=宋体][size=9.0pt]你用逻辑锁把你的软件锁起来[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]是你的权利[/size][/font][font=&quot][size=9.0pt]. [/size][/font][font=宋体][size=9.0pt]但王江民没有权利锁别人的门[/size][/font][font=&quot][size=9.0pt]!   [/size][/font][font=宋体][size=9.0pt]即使[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]经过国家有关部门的批准[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]王江民有这样的执法权[/size][/font][font=&quot][size=9.0pt]. [/size][/font][font=宋体][size=9.0pt]王江民也必须经过广告等形式公之于众[/size][/font][font=&quot][size=9.0pt].
        [/size][/font][font=宋体][size=9.0pt]从计算机安全角度讲[/size][/font][font=&quot][size=9.0pt]. [/size][/font][font=宋体][size=9.0pt]王江民至今没能确认正版用户不会受到意外损害[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]他也没有通过适当渠道告知正版用户避免意外损害的方法[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]他只是说明受到损害时由他解锁[/size][/font][font=&quot][size=9.0pt]. [/size][/font][font=宋体][size=9.0pt]这使[/size][/font][font=&quot][size=9.0pt]KV300 [/size][/font][font=宋体][size=9.0pt]的正版用户会因此存在资料失密和损失的危险[/size][/font][font=&quot][size=9.0pt]. [/size][/font][font=宋体][size=9.0pt]对此[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]如何赔偿[/size][/font][font=&quot][size=9.0pt]??
        [/size][/font][font=宋体][size=9.0pt]由于[/size][/font][font=&quot][size=9.0pt], KV 300 [/size][/font][font=宋体][size=9.0pt]内含有可能危害消费者权利和计算机安全的[/size][/font][font=&quot][size=9.0pt]'[/size][/font][font=宋体][size=9.0pt]逻辑锁[/size][/font][font=&quot][size=9.0pt]'. [/size][/font][font=宋体][size=9.0pt]在目前[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]国家没有相关法律的情况下[/size][/font][font=&quot][size=9.0pt]. [/size][/font][font=宋体][size=9.0pt]我们消费者有权利相互告知并通知[/size][/font][font=&quot][size=9.0pt] KV300 [/size][/font][font=宋体][size=9.0pt]的潜在用户[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]选择其他的产品[/size][/font][font=&quot][size=9.0pt], [/size][/font][font=宋体][size=9.0pt]放弃[/size][/font][font=&quot][size=9.0pt] KV 300.[/size][/font]
[font=&quot][size=9.0pt] [/size][/font]
[font=宋体][size=10.5pt]引用到此结束—————————————————————————————————[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]就像坛子里很多人讲的一样“先别急着想着防破解,要把软件功能和质量放在第一位”[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]呵呵,还好,扯得不是很远,可以把大家的思路引向更广阔的防破解设计上去,我很荣幸。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]回到技术层面,下面我们开始讲解:[/size][/font][font=&quot][size=10.5pt]1[/size][/font][font=宋体][size=10.5pt]、[/size][/font][font=&quot][size=10.5pt]VB[/size][/font][font=宋体][size=10.5pt]反调试反跟踪[/size][/font][size=10.5pt] 2[/size][font=宋体][size=10.5pt]、防静态反汇编分析[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第三章
[/size][/font][font=宋体][size=10.5pt]第一讲[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]备注:这一讲将是比较长的,请准备好开水茶叶或者咖啡。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=15.0pt]VB[/size][font=宋体][size=15.0pt]的反调试设计[/size][/font][size=15.0pt][/size]
[size=15.0pt] [/size]
[font=宋体][size=10.5pt]这里要讲解的[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]反调试有以下几种:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=&quot][size=10.5pt]1、
[/size][/font][font=宋体][size=10.5pt]检测父进程反[/size][/font][font=&quot][size=10.5pt]RING3[/size][/font][font=宋体][size=10.5pt]调试器[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]2、
[/size][/font][font=&quot][size=10.5pt]FindWindow[/size][/font][font=宋体][size=10.5pt]检测敏感窗口[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]3、
[/size][/font][size=10.5pt]EnumChildWindows[/size][font=宋体][size=10.5pt]枚举所有窗体,检测敏感字符[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]4、
[/size][/font][font=宋体][size=10.5pt]检测进程名字来排雷[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]5、
[/size][/font][font=宋体][size=10.5pt]利用[/size][/font][font=&quot][size=10.5pt]IsDebuggerPresent[/size][/font][font=宋体][size=10.5pt]检测调试器[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]6、
[/size][/font][font=宋体][size=10.5pt]加密字符串,错误提示诱导陷阱[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]7、
[/size][/font][font=宋体][size=10.5pt]利用[/size][/font][font=&quot][size=10.5pt]SEH[/size][/font][font=宋体][size=10.5pt]进行反跟踪[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]8、
[/size][/font][font=宋体][size=10.5pt]加[/size][/font][size=10.5pt]VM[/size][font=宋体][size=10.5pt]或者[/size][/font][size=10.5pt]P-CODE[/size][font=宋体][size=10.5pt]编译[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]9、
[/size][/font][font=宋体][size=10.5pt]直接反汇编修改代码(破解者用的招数,我们也可以用来防守)[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]10、
[/size][/font][font=宋体][size=10.5pt]隐蔽性设计[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]11、
[/size][/font][font=宋体][size=10.5pt]步长、时值反调试(包含启动时间检测)[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]12、
[/size][/font][font=宋体][size=10.5pt]检测内存分配大小反调试[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]13、
[/size][/font][font=宋体][size=10.5pt]窗口置顶反调试[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]14、
[/size][/font][font=宋体][size=10.5pt]检测按键,一般是[/size][/font][size=10.5pt]F2[/size][font=宋体][size=10.5pt](断点)、[/size][/font][size=10.5pt]F7[/size][font=宋体][size=10.5pt](单步步进)、[/size][/font][size=10.5pt]F8[/size][font=宋体][size=10.5pt](逐过程步过)、[/size][/font][size=10.5pt]F9[/size][font=宋体][size=10.5pt](运行)[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]15、
[/size][/font][font=宋体][size=10.5pt]检测前台窗口反调试[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]16、
[/size][/font][size=10.5pt]SeDebugPrivilege[/size][font=宋体][size=10.5pt]检测调试器[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]17、
[/size][/font][font=宋体][size=10.5pt]关键部分算法的时候锁定鼠标干扰调试分析[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]18、
[/size][/font][size=10.5pt]GetStartupInfo[/size][font=宋体][size=10.5pt]反调试[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]其实方法很多很多,建议大家购买《加密与解密第三版》里面有些很好的方法,奈何能力有限,经验不足,我还在琢磨中[/size][/font][size=10.5pt]……[/size][font=宋体][size=10.5pt]与君共勉[/size][/font][size=10.5pt]……[/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=&quot][size=10.5pt]第一、
[/size][/font][font=宋体][size=10.5pt]检测父进程反[/size][/font][font=&quot][size=10.5pt]RING3[/size][/font][font=宋体][size=10.5pt]调试器[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]简要介绍下原理:一般用户都是在[/size][/font][font=&quot][size=10.5pt]WINDOWS[/size][/font][font=宋体][size=10.5pt]桌面下打开我们写的程序,而不是在什么调试器下的,也就是说,调用我们程序的是[/size][/font][font=&quot][size=10.5pt]explorer.exe[/size][/font][font=宋体][size=10.5pt]程序,而不是[/size][/font][font=&quot][size=10.5pt]A.exe[/size][/font][font=宋体][size=10.5pt]也不是[/size][/font][font=&quot][size=10.5pt]B.exe[/size][/font][font=宋体][size=10.5pt],它们都对应有个[/size][/font][font=&quot][size=10.5pt]ID[/size][/font][font=宋体][size=10.5pt],我们只需要检测其父亲[/size][/font][font=&quot][size=10.5pt]ID[/size][/font][font=宋体][size=10.5pt]跟[/size][/font][font=&quot][size=10.5pt]explorer.exe[/size][/font][font=宋体][size=10.5pt]的[/size][/font][font=&quot][size=10.5pt]ID[/size][/font][font=宋体][size=10.5pt]是否一致,就说明是否正常打开还是被调试了。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]提示,[/size][/font][font=&quot][size=10.5pt]OD[/size][/font][font=宋体][size=10.5pt]的[/size][/font][font=&quot][size=10.5pt]HIDEOD[/size][/font][font=宋体][size=10.5pt]插件里,如果挑上“[/size][/font][font=&quot][size=10.5pt]Process32NEXT[/size][/font][font=宋体][size=10.5pt]”的话,此方法无效。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]请打开[/size][/font][font=&quot][size=10.5pt]VB6.0 [/size][/font][font=宋体][size=10.5pt]新建工程[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]在窗体通用里,复制以下[/size][/font][font=&quot][size=10.5pt]API[/size][/font][font=宋体][size=10.5pt]和其他参数声明[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]我是代码启始线————————————————————————————————[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[size=10.5pt]PrivateDeclare Function CreateToolhelp32Snapshot Lib "kernel32" (ByValdwFlags As Long, ByVal th32ProcessID As Long) As Long[/size]
[size=10.5pt]PrivateDeclare Function Process32First Lib "kernel32" (ByVal hSnapShot AsLong, lppe As PROCESSENTRY32) As Long[/size]
[size=10.5pt]PrivateDeclare Function Process32Next Lib "kernel32" (ByVal hSnapShot AsLong, lppe As PROCESSENTRY32) As Long[/size]
[size=10.5pt]PrivateDeclare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)As Long[/size]
[size=10.5pt]PrivateDeclare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess AsLong, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long[/size]
[size=10.5pt]PrivateDeclare Function TerminateProcess Lib "kernel32" (ByVal hProcess AsLong, ByVal uExitCode As Long) As Long[/size]
[size=10.5pt]ConstMAX_PATH As Integer = 260[/size]
[size=10.5pt]ConstTH32CS_SNAPPROCESS As Long = 2&[/size]
[size=10.5pt]PrivateType PROCESSENTRY32[/size]
[size=10.5pt]
dwSize As Long[/size]
[size=10.5pt]
cntUsage As Long[/size]
[size=10.5pt]
th32ProcessID As Long[/size]
[size=10.5pt]
th32DefaultHeapID As Long[/size]
[size=10.5pt]
th32ModuleID As Long[/size]
[size=10.5pt]
cntThreads As Long[/size]
[size=10.5pt]
th32ParentProcessID As Long[/size]
[size=10.5pt]
pcPriClassBase As Long[/size]
[size=10.5pt]
dwFlags As Long[/size]
[size=10.5pt]
szExeFile As String * 1024[/size]
[size=10.5pt]End Type[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]然后我们在窗体里写个[/size][/font][size=10.5pt]SUB[/size][font=宋体][size=10.5pt]过程,以后直接调用即可。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Fujincheng()[/size]
[size=10.5pt] [/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]这个过程是检测父进程的父进程是否是[/size][/font][size=10.5pt]EXPLORE[/size][font=宋体][size=10.5pt]的父进程[/size][/font][size=10.5pt][/size]
[size=10.5pt]DimProcess As PROCESSENTRY32[/size]
[size=10.5pt]DimhSnapShot As Long[/size]
[size=10.5pt]Dim XNNAs Long[/size]
[size=10.5pt]Dim flagAs Boolean[/size]
[size=10.5pt]Dim mNameAs String[/size]
[size=10.5pt]Dim i AsInteger[/size]
[size=10.5pt]Dim pidAs Long, explorer As Long '[/size][font=宋体][size=10.5pt]注意这[/size][/font][size=10.5pt]2[/size][font=宋体][size=10.5pt]个变量就用来存放[/size][/font][size=10.5pt]2[/size][font=宋体][size=10.5pt]个[/size][/font][size=10.5pt]ID[/size]
[size=10.5pt] [/size]
[size=10.5pt]hSnapShot= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&) '[/size][font=宋体][size=10.5pt]建立进程快照[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]搜索[/size][/font][size=10.5pt]explorer.exe[/size][font=宋体][size=10.5pt]进程[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]并获得其[/size][/font][size=10.5pt]ID[/size]
[size=10.5pt]
If hSnapShot Then[/size]
[size=10.5pt]
Process.dwSize = 1060[/size]
[size=10.5pt]
If (Process32First(hSnapShot, Process))Then '[/size][font=宋体][size=10.5pt]遍历第一个进程[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]获得[/size][/font][size=10.5pt]PROCESSENTRY32[/size][font=宋体][size=10.5pt]结构[/size][/font][size=10.5pt][/size]
[size=10.5pt]
Do[/size]
[size=10.5pt]
i = InStr(1, Process.szExeFile,Chr(0))
'[/size][font=宋体][size=10.5pt]获得映像名称[/size][/font][size=10.5pt][/size]
[size=10.5pt]
mName = LCase(Left(Process.szExeFile, i- 1)) '[/size][font=宋体][size=10.5pt]并转换成小写[/size][/font][size=10.5pt][/size]
[size=10.5pt]
[/size]
[size=10.5pt]
If mName = "explorer.exe"Then
'[/size][font=宋体][size=10.5pt]是不是[/size][/font][size=10.5pt]explorer.exe[/size]
[size=10.5pt]

explorer = Process.th32ProcessID[/size]
[size=10.5pt]
ElseIf mName = LCase(App.EXEName &".exe") Then
'[/size][font=宋体][size=10.5pt]是不是自己[/size][/font][size=10.5pt][/size]
[size=10.5pt]
pid =Process.th32ParentProcessID
'[/size][font=宋体][size=10.5pt]获得父进程[/size][/font][size=10.5pt]ID[/size]
[size=10.5pt]
Else[/size]
[size=10.5pt]
flag = False[/size]
[size=10.5pt]
End If[/size]
[size=10.5pt]
Loop Until (Process32Next(hSnapShot, Process)< 1) '[/size][font=宋体][size=10.5pt]遍历所有进程直到返回值为[/size][/font][size=10.5pt]False[/size]
[size=10.5pt]
End If[/size]
[size=10.5pt]
XNN = CloseHandle(hSnapShot)[/size]
[size=10.5pt]
End If[/size]
[size=10.5pt] [/size]
[size=10.5pt]DimOpenit As Long[/size]
[size=10.5pt] [/size]
[size=10.5pt]Openit =OpenProcess(1&, -1&, pid)[/size]
[size=10.5pt]
[/size]
[size=10.5pt]If pid<> explorer Then MsgBox "[/size][font=宋体][size=10.5pt]发现父进程调试[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]警告[/size][/font][size=10.5pt]":TerminateProcess Openit, 0[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]如果发现父进程不对,就结束掉父进程,对使用[/size][/font][size=10.5pt]HIDEOD[/size][font=宋体][size=10.5pt]中的[/size][/font][size=10.5pt]Process32NEXT[/size][font=宋体][size=10.5pt]的[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]无效[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我们设计的代码先找出[/size][/font][font=&quot][size=10.5pt]explorer.exe[/size][/font][font=宋体][size=10.5pt]进程的[/size][/font][font=&quot][size=10.5pt]ID[/size][/font][font=宋体][size=10.5pt]号,然后找出本程序的父进程,两者对比,发现不一样就说明很有可能被调试,那么就用[/size][/font][size=10.5pt]OpenProcess[/size][font=宋体][size=10.5pt]打开该进程,用[/size][/font][size=10.5pt]TerminateProcess[/size][font=宋体][size=10.5pt]结束掉该可以进程。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]使用方法如下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Form_Load()[/size]
[size=10.5pt]Fujincheng[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]效果如图:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image010.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image012.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]说明该方法对待通用[/size][/font][size=10.5pt]RING3[/size][font=宋体][size=10.5pt]级调试器应该都是有效果的[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=&quot][size=10.5pt]第二、
[/size][/font][font=&quot][size=10.5pt]FindWindow[/size][/font][font=宋体][size=10.5pt]检测敏感窗口[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]原理简介:一般程序都有标题栏,也就是程序最上面的那一栏,该栏显示的就是[/size][/font][size=10.5pt]FindWindow[/size][font=宋体][size=10.5pt]可以查到的字符。我们以此来检测黑名单即可简单检测到调试,继而作出响应。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]请打开[/size][/font][font=&quot][size=10.5pt]VB6.0 [/size][/font][font=宋体][size=10.5pt]新建工程[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]在窗体通用里,复制以下[/size][/font][font=&quot][size=10.5pt]API[/size][/font][font=宋体][size=10.5pt]声明[/size][/font][font=&quot][size=10.5pt][/size][/font]
[size=10.5pt] [/size]
[size=10.5pt]PrivateDeclare Function FINDWINDOW Lib "user32" Alias"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName AsString) As Long[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]然后在窗体代码处,我们写一个过程即可实现调用:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub GuanbiFindwindow(Mingzi As String)[/size]
[size=10.5pt]winHwnd =FINDWINDOW(vbNullString, Mingzi)[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]获得窗口句柄[/size][/font][size=10.5pt][/size]
[size=10.5pt]IfwinHwnd <> 0 Then[/size]
[size=10.5pt]AppActivateMingzi[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]激活窗体为活动[/size][/font][size=10.5pt][/size]
[size=10.5pt]SendKeys"%{f4}", True[/size]
[size=10.5pt]'ALT[/size][font=宋体][size=10.5pt]+[/size][/font][size=10.5pt]F4 [/size][font=宋体][size=10.5pt]结束掉[/size][/font][size=10.5pt][/size]
[size=10.5pt]SendKeys"%y", True[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]如何调用?请看:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Form_Load()[/size]
[size=10.5pt] [/size]
[size=10.5pt]GuanbiFindwindow("[/size][font=宋体][size=10.5pt]计算器[/size][/font][size=10.5pt]")[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]关闭计算器是为了方便大家验证[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]GuanbiFindwindow("Numega SmartCheck")[/size]
[size=10.5pt] [/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]这样调用即可[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]不要放到按钮事件[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]如果不小心激活了我们自己的窗体[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]那就结束不掉调试进程了[/size][/font][size=10.5pt][/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]实验效果表明,可以结束掉我们规定好的窗口,效果不错。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第三、
[/size][/font][size=10.5pt]EnumChildWindows[/size][font=宋体][size=10.5pt]枚举所有窗体,检测敏感字符[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]简要原理:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]可以用[/size][/font][size=10.5pt]EnumChildWindows[/size][font=宋体][size=10.5pt]来枚举窗体,检测到所有相关敏感字眼,即可判断为调试,继而作出响应。为什么要用这个呢?你有没有发现[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]调试器版本真的很多,尤其是修改版的,基本上,高手都喜欢收藏些特别点的调试器,标题栏都不一样,如果用[/size][/font][size=10.5pt]FINDWINDOW[/size][font=宋体][size=10.5pt]来查找的话,还不郁闷死啊?[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]但是你又发现了没?基本[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]打开后,或者开始调试后,标题栏里总有“[/size][/font][size=10.5pt]CPU[/size][font=宋体][size=10.5pt]”这三个字符,[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]而[/size][/font][size=10.5pt]SMARTCHECK[/size][font=宋体][size=10.5pt]大都包含[/size][/font][size=10.5pt]smart[/size][font=宋体][size=10.5pt]字样?所以我们可以用[/size][/font][size=10.5pt]EnumChildWindows[/size][font=宋体][size=10.5pt]来枚举所有窗口标题栏来检测它们中有没有包含[/size][/font][size=10.5pt]CPU[/size][font=宋体][size=10.5pt]三个字,如果有,宁可错杀,也不放过。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]请打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程[/size][/font]
[font=宋体][size=10.5pt]添加个[/size][/font][size=10.5pt]TIMER1 [/size][font=宋体][size=10.5pt]定时[/size][/font][size=10.5pt]500 [/size][font=宋体][size=10.5pt]建立个模块[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在模块中添加:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]DeclareFunction GetDesktopWindow Lib "user32" () As Long[/size]
[size=10.5pt]DeclareFunction EnumChildWindows Lib "user32" (ByVal hWndParent As Long,ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long[/size]
[size=10.5pt]DeclareFunction GetWindowText Lib "user32" Alias "GetWindowTextA"(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long[/size]
[size=10.5pt]DeclareFunction GetWindowTextLength Lib "user32" Alias"GetWindowTextLengthA" (ByVal hwnd As Long) As Long[/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt]FunctionEnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long[/size]
[size=10.5pt] [/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]针对[/size][/font][size=10.5pt]EnumChildProc[/size][font=宋体][size=10.5pt]写的自动处理函数[/size][/font][size=10.5pt][/size]
[size=10.5pt]
Dim sSave As String[/size]
[size=10.5pt]
sSave = Space$(GetWindowTextLength(hwnd) +1)[/size]
[size=10.5pt]
GetWindowText hwnd, sSave, Len(sSave)[/size]
[size=10.5pt]
sSave = Left$(sSave, Len(sSave) - 1)[/size]
[size=10.5pt]
sSave = Trim(sSave)[/size]
[size=10.5pt]
If JianCPU(sSave) = True Then MsgBox "[/size][font=宋体][size=10.5pt]发现调试器[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]请关闭[/size][/font][size=10.5pt]",, "[/size][font=宋体][size=10.5pt]警告[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]
EnumChildProc = 1[/size]
[size=10.5pt]EndFunction[/size]
[size=10.5pt] [/size]
[size=10.5pt]FunctionJianCPU(abcdef As String) As Boolean[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]检测字符集里有没有[/size][/font][size=10.5pt]cpu[/size][font=宋体][size=10.5pt]或者[/size][/font][size=10.5pt]smart[/size][font=宋体][size=10.5pt]字样[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]返回[/size][/font][size=10.5pt]TRUE[/size][font=宋体][size=10.5pt]表示包含[/size][/font][size=10.5pt][/size]
[size=10.5pt]JianCPU =False[/size]
[size=10.5pt]Dim nnnAs Long[/size]
[size=10.5pt]For nnn =1 To Len(abcdef) - 2[/size]
[size=10.5pt]IfLCase(Mid(abcdef, nnn, 3)) = "cpu" Then[/size]
[size=10.5pt]JianCPU =True[/size]
[size=10.5pt]Exit For[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]Next nnn[/size]
[size=10.5pt]For nnn =1 To Len(abcdef) - 4[/size]
[size=10.5pt]IfLCase(Mid(abcdef, nnn, 5)) = "smart" Then[/size]
[size=10.5pt]JianCPU =True[/size]
[size=10.5pt]Exit For[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]Next nnn[/size]
[size=10.5pt]EndFunction[/size]
[size=10.5pt] [/size]
[size=10.5pt]PublicSub MeiJu()[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]具体整合成为反调试利器[/size][/font][size=10.5pt][/size]
[size=10.5pt]On ErrorResume Next[/size]
[size=10.5pt]EnumChildWindowsGetDesktopWindow, AddressOf EnumChildProc, ByVal 0&[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]然后在窗体代码中,怎样调用呢?如下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Form_Load()[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]具体使用[/size][/font][size=10.5pt][/size]
[size=10.5pt]MeiJu[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Timer1_Timer()[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]具体使用[/size][/font][size=10.5pt][/size]
[size=10.5pt]MeiJu[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]即可,怎么样简单吧?[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]为什么要搞个定时器呢?那当然,因为我们要时刻检测全部窗体的敏感字符,我认为有些网吧封锁迅雷和“破解”关键字眼,凡是发现有包含的,就直接关闭窗口,也应该是采用类似的技巧的吧?[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]看效果吧:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image014.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第四、
[/size][/font][font=宋体][size=10.5pt]检测进程名字来排雷[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]不好意思,凌晨[/size][/font][size=10.5pt]3[/size][font=宋体][size=10.5pt]点多,有些打盹了。尽量把这些提到的讲完,没有提到的请大家专研解决。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]简要原理:同样是检测进程,只是比较黑名单而已,不是很简单吗?[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在通用部分复制以下变量声明和参数:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateDeclare Function CreateToolhelp32Snapshot Lib "kernel32" (ByValdwFlags As Long, ByVal th32ProcessID As Long) As Long[/size]
[size=10.5pt]PrivateDeclare Function Process32First Lib "kernel32" (ByVal hSnapshot AsLong, lppe As PROCESSENTRY32) As Long[/size]
[size=10.5pt]PrivateDeclare Function Process32Next Lib "kernel32" (ByVal hSnapshot AsLong, lppe As PROCESSENTRY32) As Long[/size]
[size=10.5pt]PrivateDeclare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)As Long[/size]
[size=10.5pt]PrivateType PROCESSENTRY32[/size]
[size=10.5pt]
dwSize
As Long[/size]
[size=10.5pt]
cntUsage
As Long[/size]
[size=10.5pt]
th32ProcessID
As Long[/size]
[size=10.5pt]
th32DefaultHeapID
As Long[/size]
[size=10.5pt]
th32ModuleID
As Long[/size]
[size=10.5pt]
cntThreads
As Long[/size]
[size=10.5pt]
th32ParentProcessID
As Long[/size]
[size=10.5pt]
pcPriClassBase
As Long[/size]
[size=10.5pt]
dwFlags
As Long[/size]
[size=10.5pt]
szExeFile
As String * 1024[/size]
[size=10.5pt]End Type[/size]
[size=10.5pt]ConstTH32CS_SNAPHEAPLIST = &H1[/size]
[size=10.5pt]ConstTH32CS_SNAPPROCESS = &H2[/size]
[size=10.5pt]ConstTH32CS_SNAPTHREAD = &H4[/size]
[size=10.5pt]ConstTH32CS_SNAPMODULE = &H8[/size]
[size=10.5pt]ConstTH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS OrTH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)[/size]
[size=10.5pt]ConstTH32CS_INHERIT = &H80000000[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]然后写个函数:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateFunction Jincheng(namex As String) As Boolean[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]编写个函数方便调用[/size][/font][size=10.5pt],namex[/size][font=宋体][size=10.5pt]是要检测的程序名[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]小写[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]返回[/size][/font][size=10.5pt]TRUE[/size][font=宋体][size=10.5pt]表示发现[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]Dim my AsPROCESSENTRY32[/size]
[size=10.5pt]Diml
As Long[/size]
[size=10.5pt]Dim l1 AsLong[/size]
[size=10.5pt]Dim mNameAs String[/size]
[size=10.5pt]Dim i AsInteger[/size]
[size=10.5pt]l =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)[/size]
[size=10.5pt]
If l Then[/size]
[size=10.5pt]
my.dwSize = 1060[/size]
[size=10.5pt]
If (Process32First(l, my)) Then
'[/size][font=宋体][size=10.5pt]遍历第一个进程[/size][/font][size=10.5pt][/size]
[size=10.5pt]
Do[/size]
[size=10.5pt]
i = InStr(1,my.szExeFile, Chr(0))[/size]
[size=10.5pt]

mName =LCase(Left(my.szExeFile, i - 1))[/size]
[size=10.5pt]
If mName = namex Then[/size]
[size=10.5pt]
Jincheng = True[/size]
[size=10.5pt]
Exit Function[/size]
[size=10.5pt]
Else[/size]
[size=10.5pt]
Jincheng = False[/size]
[size=10.5pt]
End If[/size]
[size=10.5pt]
Loop Until (Process32Next(l, my)< 1)
'[/size][font=宋体][size=10.5pt]遍历所有进程知道返回值为[/size][/font][size=10.5pt]False[/size]
[size=10.5pt]
End If[/size]
[size=10.5pt]
l1 = CloseHandle(l)[/size]
[size=10.5pt]End If[/size]
[size=10.5pt] [/size]
[size=10.5pt]EndFunction[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]怎样调用?请看:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Form_Load()[/size]
[size=10.5pt] [/size]
[size=10.5pt]IfJincheng("ollydbg.exe") = True Then MsgBox "[/size][font=宋体][size=10.5pt]发现[/size][/font][size=10.5pt]OLLYDBG[/size][font=宋体][size=10.5pt]调试器[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]请关闭[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]进程检测[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]如此调用即可[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]效果如图:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,418]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image016.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第五、
[/size][/font][font=宋体][size=10.5pt]利用[/size][/font][font=&quot][size=10.5pt]IsDebuggerPresent[/size][/font][font=宋体][size=10.5pt]检测调试器[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这个算很老的东西了,拿出来给初学者看看[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在通用部分写:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateDeclare Function IsDebuggerPresent Lib "kernel32" () As Long[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]调用:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Form_Load()[/size]
[size=10.5pt]IfIsDebuggerPresent Then MsgBox "[/size][font=宋体][size=10.5pt]发现调试器了[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]好累啊[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]凌晨[/size][/font][size=10.5pt]3[/size][font=宋体][size=10.5pt]:[/size][/font][size=10.5pt]36"[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]效果见图:(对[/size][/font][size=10.5pt]SMARTCHECK[/size][font=宋体][size=10.5pt]还有效果,对[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]基本无效了)[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image018.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第六、
[/size][/font][font=宋体][size=10.5pt]加密字符串,错误提示诱导陷阱[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]原理:破解者在破解[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]软件的时候,有的高手会查找宽字的十六进制码,然后在[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]中直接搜索如“注册成功”对应的编码,然后上下翻找,爆破什么的都来了,噩梦啊。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]所以为了反调试,你最好不要提示注册成功之类的,如果有什么字符容易泄露你的算法信息,那你必须把它隐藏,可以用[/size][/font][size=10.5pt]Chrw[/size][font=宋体][size=10.5pt]线转成数字形式,然后用的时候直接[/size][/font][size=10.5pt]Ascw[/size][font=宋体][size=10.5pt]转回字符即可实现隐藏,但是还是可以被人找到,最好的办法是实现动态解码。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我只简单的举个例子:字母[/size][/font][size=10.5pt]F[/size][font=宋体][size=10.5pt]的[/size][/font][size=10.5pt]ASCII[/size][font=宋体][size=10.5pt]码(十进制)为[/size][/font][size=10.5pt]70[/size][font=宋体][size=10.5pt],我用[/size][/font][size=10.5pt]ASC[/size][font=宋体][size=10.5pt]([/size][/font][size=10.5pt]70[/size][font=宋体][size=10.5pt])比直接用[/size][/font][size=10.5pt]F[/size][font=宋体][size=10.5pt]好,但是[/size][/font][size=10.5pt]ASC(70)[/size][font=宋体][size=10.5pt]也容易被查到,我建议是通过动态计算得出:[/size][/font][size=10.5pt]A = 34 B =36 C = Chr(A+B)[/size]
[font=宋体][size=10.5pt]这样就安全多了,但是设计[/size][/font][size=10.5pt]Chr [/size][font=宋体][size=10.5pt]和[/size][/font][size=10.5pt]Chrw [/size][font=宋体][size=10.5pt]的函数已经被人所知,也容易被人断点。但是我们还是要尽最大努力去阻止破解者。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我们随便设计一个实验下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateFunction ZiFujiemi(anum As Long, bnum As Long) As String[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]字符解密函数[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]用这个函数之前可以用相反的逆算来得到加密后的形式[/size][/font][size=10.5pt][/size]
[size=10.5pt]ZiFujiemi= ChrW(anum Xor bnum)[/size]
[size=10.5pt]EndFunction[/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Command1_Click()[/size]
[size=10.5pt]MsgBoxZiFujiemi(64, 22)[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]大写字母[/size][/font][size=10.5pt]V[/size][font=宋体][size=10.5pt]的[/size][/font][size=10.5pt]ASCII[/size][font=宋体][size=10.5pt]为[/size][/font][size=10.5pt]86,[/size][font=宋体][size=10.5pt]可拆成[/size][/font][size=10.5pt]64XOR 22,[/size][font=宋体][size=10.5pt]我的意思你能明白就好了[/size][/font][size=10.5pt][/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]可见只要是计算的,都比原字符要保险,中间进行转换即可。加密后,用[/size][/font][size=10.5pt]VBExplorer[/size][font=宋体][size=10.5pt]就分析不出我们的原始字符串了。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]那错误陷阱呢?恰恰相反,我们要设计一个捕捉[/size][/font][size=10.5pt]CRACKER[/size][font=宋体][size=10.5pt]虫的全套,比方说引诱破解者进入你设计好的,可以注册成功,但是是假成功,而且尽量不给真正的提示,那如何提高陷阱的捕捉率呢?[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]可以主动设置好字符串提示,如:“注册码错误”,“注册码正确”,“恭喜你”,“已注册”,“未注册”等等。讲破解着的眼球吸引过来,进入一个貌似算法的,而且算法也挺逼真的地方,注册完后也在标题栏或者什么地方显示个“已注册”字样,其实功能未解禁,[/size][/font][size=10.5pt]^_^[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程[/size][/font]
[font=宋体][size=10.5pt]添加一个名为“注册”的按钮,该按钮就是用来迷惑破解者的。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]编写以下一个[/size][/font][size=10.5pt]SUB[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Jiazhuce()[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]这是一个假注册陷阱[/size][/font][size=10.5pt][/size]
[size=10.5pt]Dim aJiaAs String[/size]
[size=10.5pt]Dim bJiaAs String[/size]
[size=10.5pt]Dim cJiaAs String[/size]
[size=10.5pt]Dim dJiaAs Double[/size]
[size=10.5pt]Dimnxunhuan As Integer[/size]
[size=10.5pt]aJia =Text1.Text[/size]
[size=10.5pt]Fornxunhuan = 1 To Len(Text1.Text)[/size]
[size=10.5pt]aJia =aJia & Asc(Mid(aJia, nxunhuan, 1))[/size]
[size=10.5pt]dJia =Val(aJia)[/size]
[size=10.5pt]Nextnxunhuan[/size]
[size=10.5pt] [/size]
[size=10.5pt]IfVal(dijia) = 57894321649498# Then[/size]
[size=10.5pt]cJia ="[/size][font=宋体][size=10.5pt]注册码正确,恭喜你[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]MsgBoxcJia, , "[/size][font=宋体][size=10.5pt]感谢[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]bJia ="[/size][font=宋体][size=10.5pt]注册码错误,请重新输入[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]MsgBoxbJia, , "[/size][font=宋体][size=10.5pt]错误[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]真正的注册过程在这里:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Form_Unload(Cancel As Integer)[/size]
[size=10.5pt]‘[/size][font=宋体][size=10.5pt]注册过程设计在关闭程序的瞬间[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]或者重新启动的时候验证[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]这里注册码是[/size][/font][size=10.5pt]123456[/size]
[size=10.5pt]IfVal(Text1.Text) = 123456 Then MsgBox ChrW(30495) & ChrW(27491) &ChrW(25104) & ChrW(21151), , ChrW(25552) & ChrW(31034)[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]按钮的代码调用:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Command1_Click()[/size]
[size=10.5pt]Jiazhuce[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]这就是个典型的假圈套[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]用字符串吸引破解者注意[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]其实真正的注册过程在[/size][/font][size=10.5pt]UNLOAD[/size][font=宋体][size=10.5pt]事件中[/size][/font][size=10.5pt][/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]看看效果图吧:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=246,91]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image019.jpg[/img][/size]
[font=宋体][size=10.5pt]字符查看软件显示了我们故意释放出来的假象[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=318,239]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image020.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=321,237]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image021.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这个例子很简单,但是原理希望初学者能专研下哦[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第七、
[/size][/font][font=宋体][size=10.5pt]利用[/size][/font][font=&quot][size=10.5pt]SEH[/size][/font][font=宋体][size=10.5pt]反调试[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]简介:[/size][/font][font=&quot][size=10.5pt]SEH [/size][/font][font=宋体][size=10.5pt]是什么?你就简单得理解为异常处理机制好了,可以这样认为:没有调试器存在的时候,我们实现设计好的处理错误的程序代码就携带者注册算法什么的正常运行;如果有调试器开着,那么,就自动把异常错误递交给调试器来处理,也就不运行我们事先安排好的处理代码了,这样就起到反调试作用。[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt] [/size][/font]
[font=宋体][size=10.5pt]更多信息请自行网络搜索[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程,再添加一个[/size][/font][size=10.5pt]FORM2[/size][font=宋体][size=10.5pt],新建模块[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在模块中添加:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt]PrivateType EXCEPTION_POINTERS[/size]
[size=10.5pt]
pExceptionRecord As Long[/size]
[size=10.5pt]
ContextRecord As Long[/size]
[size=10.5pt]End Type[/size]
[size=10.5pt] [/size]
[size=10.5pt]PublicDeclare Function SetUnhandledExceptionFilter Lib "kernel32" (ByVallpTopLevelExceptionFilter As Long) As Long[/size]
[size=10.5pt] [/size]
[size=10.5pt]PublicFunction NewExceptionHandler(ByRef lpExceptionPointers As EXCEPTION_POINTERS)As Long[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]在这里可以添加一些关键算法[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]一些关键步骤都可以放这里[/size][/font][size=10.5pt][/size]
[size=10.5pt]IfVal(Form1.Text1.Text) = 123456 Then[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]注册码真正正确[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]恭喜[/size][/font][size=10.5pt]": Form2.Label1.Caption = "[/size][font=宋体][size=10.5pt]注册成功[/size][/font][size=10.5pt]": Form1.Hide: Form2.Show[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]真实比较[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]注册码错误[/size][/font][size=10.5pt]",, "[/size][font=宋体][size=10.5pt]错误[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]ResumeNext[/size]
[size=10.5pt]EndFunction[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在[/size][/font][size=10.5pt]FORM2[/size][font=宋体][size=10.5pt]中建立一个[/size][/font][size=10.5pt]LABEL1[/size][font=宋体][size=10.5pt],添加代码:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Form_Unload(Cancel As Integer)[/size]
[size=10.5pt]UnloadForm1[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在[/size][/font][size=10.5pt]FORM1[/size][font=宋体][size=10.5pt]中添加一个[/size][/font][size=10.5pt]TEXT1[/size][font=宋体][size=10.5pt]和一个[/size][/font][size=10.5pt]COMMAND1[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]添加如下代码:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateDeclare Sub DebugBreak Lib "kernel32" ()[/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Command1_Click()[/size]
[size=10.5pt]On ErrorGoTo BACK[/size]
[size=10.5pt] [/size]
[size=10.5pt]DebugBreak[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]产生异常的[/size][/font][size=10.5pt]INT[/size][font=宋体][size=10.5pt]指令[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]凡是流程顺这下来的都是错误的[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]不管怎样都是假注册圈套[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]然后恰恰是调试器接手了这块[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]于是就变成了往下运行[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]Dim a AsLong[/size]
[size=10.5pt]Dim b AsLong[/size]
[size=10.5pt] [/size]
[size=10.5pt]a =123456 + Val(Text1.Text)[/size]
[size=10.5pt]b = a Xor6543215[/size]
[size=10.5pt]b = b + a[/size]
[size=10.5pt] [/size]
[size=10.5pt]If b = 0Then[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]凡是流程顺着来到这里的都死错误的[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]不管怎样都是假注册圈套[/size][/font][size=10.5pt][/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]虚假比较,注册码错误[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]提示[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]虚假比较,注册码错误[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]错误[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End If[/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt]BACK:[/size]
[size=10.5pt] [/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Form_Load()[/size]
[size=10.5pt]SetUnhandledExceptionFilterAddressOf NewExceptionHandler[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Form_Unload(Cancel As Integer)[/size]
[size=10.5pt]SetUnhandledExceptionFilter0&[/size]
[size=10.5pt]UnloadForm2[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这样我们就简单的完成了一个[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]编写的[/size][/font][size=10.5pt]SEH[/size][font=宋体][size=10.5pt]反调试程序[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]一些关键的解密算法最好放到异常中去执行,然后判断等,而有调试器的状态下,会被调试器捕获异常,进而改变流程。起到了一定的反调试作用。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我们来尝试测试一下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]正常情况,输入注册码错误:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=321,238]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image022.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]正常情况,注册成功[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=322,238]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image023.jpg[/img][/size]
[size=10.5pt][img=319,238]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image024.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]调试器状态下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image026.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image028.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]注意要这个[/size][/font][size=10.5pt]SEH[/size][font=宋体][size=10.5pt]的效果的话,[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]调试设置里不能选中“忽略[/size][/font][size=10.5pt]INT3[/size][font=宋体][size=10.5pt]中断”。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]从上述测试中我们看到:有调试器调试的时候,破解者被引到了我们设计好的假冒的算法部分,而真实的算法则因[/size][/font][size=10.5pt]SEH[/size][font=宋体][size=10.5pt]作用而不再执行。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]当然,你也可以自己精心设计一个异常,让调试器去捕获,让破解者中招。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第八、加[/size][/font][size=10.5pt]VM[/size][font=宋体][size=10.5pt]或者[/size][/font][size=10.5pt]P-CODE[/size][font=宋体][size=10.5pt]编译[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]加[/size][/font][size=10.5pt]VM[/size][font=宋体][size=10.5pt]的话,其原理是虚拟执行加密的代码,模拟了一个新的环境,让破解者云里雾里,而且一句简单的代码可以发胖好多倍,一句话:累死你。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]VMProtect[/size][font=宋体]是当前一款很强的虚拟机保护软件,经过[/font][size=10.5pt]VMProtect[/size][font=宋体]处理的软件,能大大提高破解者的分析成本,是目前一种比较理想的保护方式。[/font][size=10.5pt]VMProtect[/size][font=宋体]关键是用好,一定要将程序关键代码进行处理,必要时用[/font]OllyDBG[font=宋体]检查一下被处理的代码。[/font]

[font=宋体]另外,经虚拟机处理代码效率会降低,因此一些对效率要求比较高的代码就不适合用[/font][size=10.5pt]VMProtect[/size][font=宋体]进行处理。[/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]关于[/size][/font][size=10.5pt]VM[/size][font=宋体][size=10.5pt]怎么用,我只简单的讲了:用[/size][/font][size=10.5pt]VMProtect[/size][font=宋体][size=10.5pt]打开你的[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]程序,设置好要加密的地址简单加密即可,[/size][/font][size=10.5pt]VMProtect 1.2[/size][font=宋体][size=10.5pt]版以后支持[/size][/font][size=10.5pt]SDK[/size][font=宋体][size=10.5pt],我们在[/size][/font][size=10.5pt]Vb[/size][font=宋体][size=10.5pt]里可以这样标记保护的开始地址和结束地址:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=554,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image030.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]标记开始:[/size][/font][size=10.5pt][/size]
[size=10.5pt]CallVarPtr(“VMProtect begin”)[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]标记结束:[/size][/font][size=10.5pt][/size]
[size=10.5pt]CallVarPtr(“VMProtect end”)[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这样能更有效得定位和保护我们的算法部分。具体使用教学请参考:[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]http://bbs.pediy.com/printthread.php?t=49979[/size][/font]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]实际生活中,[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]程序虚拟环境用的最多的是[/size][/font][size=10.5pt]P-CODE[/size][font=宋体][size=10.5pt]编译模式,准确的讲是解析执行。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=441,348]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image031.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在[/size][/font][size=10.5pt]VB6.0[/size][font=宋体][size=10.5pt]里按照上述的图片设置编译方式即可,编译出来的[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]程序基本上是在[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]的[/size][/font][size=10.5pt]DLL[/size][font=宋体][size=10.5pt]里穿来穿去,云里雾里,如果再配合异常处理,陷阱,反调试和修改程序代码的话,真的很难破解了。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第九、直接反汇编修改代码(破解者用的招数,我们也可以用来防守)[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]编译好一个程序后,为了防止[/size][/font][size=10.5pt]VBExplorer[/size][font=宋体][size=10.5pt]等静态分析工具查看到我们的具体事件地址等,有必要修改下[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]程序开始的代码,利用的就是平衡堆栈和[/size][/font][size=10.5pt]JMP[/size][font=宋体][size=10.5pt]等指令,加上点经典的时值反调试,效果就出来了,你甚至可以利用这个技术,把自己关键的算法也给搬家了,东一个家,西一个家,让破解者东奔西走,疲惫不堪。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]004018CC >/$
68 7C1D4000
PUSH 1112.00401D7C[/size]
[size=10.5pt]004018D1
|.
E8 F0FFFFFF
CALL<JMP.&MSVBVM60.#100> [/size]
[font=宋体][size=10.5pt]这个明显透露了[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]程序,我们要做的是搬走这个位置[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]换句话说是把这个[/size][/font][size=10.5pt]CALL[/size][font=宋体][size=10.5pt]移走,移到天南海角去[/size][/font][size=10.5pt]……[/size]
[size=10.5pt]004018D6
|.
0000
ADD BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018D8
|.
0000
ADD BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018DA
|.
0000
ADD BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018DC
|.
3000
XOR BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018DE
|.
0000
ADD BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018E0
|.
3800
CMP BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018E2
|.
0000
ADD BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018E4
|.
0000
ADD BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018E6
|.
0000
ADD BYTE PTR DS:[EAX],AL[/size]
[size=10.5pt]004018E8
|.
3A28
CMP CH,BYTE PTR DS:[EAX][/size]
[size=10.5pt]004018EA
|.
8A00
MOV AL,BYTE PTR DS:[EAX][/size]
[size=10.5pt]004018EC
\.
CF
IRETD[/size]
[font=宋体][size=10.5pt]修改后:―――――――――――――――――――――――》》》[/size][/font][size=10.5pt][/size]
[size=10.5pt]
004018CC > $ /E9 7FA50100
JMP [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].0041BE50[/size]
[size=10.5pt]004018D1
|90
NOP[/size]
[size=10.5pt]004018D2
|90
NOP[/size]
[size=10.5pt]004018D3
|90
NOP[/size]
[size=10.5pt]004018D4
|90
NOP[/size]
[size=10.5pt]004018D5
|90
NOP[/size]
[size=10.5pt]0041BE50
60
PUSHAD[/size]
[size=10.5pt]0041BE51
0F31
RDTSC[/size]
[font=宋体][size=10.5pt]经典时值,单步跟,不小心的话就会进入到错误地址[/size][/font][size=10.5pt][/size]
[size=10.5pt]0041BE53
8BC8
MOV ECX,EAX[/size]
[size=10.5pt]0041BE55
0F31
RDTSC[/size]
[size=10.5pt]0041BE57
2BC1
SUB EAX,ECX[/size]
[size=10.5pt]0041BE59
3D 00050000
CMP EAX,500[/size]
[size=10.5pt]0041BE5E
^ 0F8F BAF9FFFF
JG [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].0041B81E[/size]
[size=10.5pt]0041BE64
83F8 00
CMP EAX,0[/size]
[size=10.5pt]0041BE67
^ 0F8C C7F9FFFF
JL [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].0041B834[/size]
[size=10.5pt]0041BE6D
61
POPAD[/size]
[size=10.5pt]0041BE6E
68 68504000
PUSH [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].00405068[/size]
[size=10.5pt]0041BE73
60
PUSHAD[/size]
[size=10.5pt]0041BE74
0F31
RDTSC[/size]
[size=10.5pt]0041BE76
8BC8
MOV ECX,EAX[/size]
[size=10.5pt]0041BE78
0F31
RDTSC[/size]
[size=10.5pt]0041BE7A
2BC1
SUB EAX,ECX[/size]
[size=10.5pt]0041BE7C
3D00050000
CMP EAX,500[/size]
[size=10.5pt]0041BE81
^ 0F8F ADF9FFFF
JG [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].0041B834[/size]
[size=10.5pt]0041BE87
83F8 00
CMP EAX,0[/size]
[size=10.5pt]0041BE8A
^ 0F8C8EF9FFFF
JL [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].0041B81E[/size]
[size=10.5pt]0041BE90
61
POPAD[/size]
[size=10.5pt]0041BE91
E8 305AFEFF
CALL<JMP.&MSVBVM60.#100>[/size]
[font=宋体][size=10.5pt]搬到这里来了[/size][/font][size=10.5pt][/size]
[size=10.5pt]0041BE96
^ 0F85 3A5AFEFF
JNZ [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].004018D6[/size]
[size=10.5pt]0041BE9C
^ 0F84 345AFEFF
JE [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].004018D6[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]效果:[/size][/font][size=10.5pt][/size]
[size=10.5pt][img=553,382]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image033.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image035.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt]RDTSC[/size][font=宋体][size=10.5pt]指令是什么意思?当然是检测时间用的,[/size][/font][font=宋体]不少壳代码使用[/font][size=10.5pt]RDTSC[/size][font=宋体]来检测运行时间[/font],[font=宋体]如果在[/font]OD[font=宋体]里调试,时间必定要延长,这样壳利用两次[/font][size=10.5pt]RDTSC[/size][font=宋体]时间差就可发现被调试器。[/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]如果有时间,你可以自己设计得更恐怖点,东一句西一句,让别人无法还原[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第十、
[/size][/font][font=宋体][size=10.5pt]隐蔽性设计[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]调试者如果已经分析到了你的算法部分,你怎么办?[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]所以事先还得有准备,也就是隐蔽性设计。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]一段算法,在一般情况下,不执行正确的算法验证,除非已经悄悄得验证了注册码前面几位或者后面几位正确的时候,才悄悄得执行正确的算法验证。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这样可以在一定程度上让破解者感到郁闷,和无所适从。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程[/size][/font]
[font=宋体][size=10.5pt]新建[/size][/font][size=10.5pt] TEXT1[/size][font=宋体][size=10.5pt]和[/size][/font][size=10.5pt]TEXT2 [/size][font=宋体][size=10.5pt]还有添加一个[/size][/font][size=10.5pt]COMMAND1[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在代码窗口我们编写如下注册过程[/size][/font][size=10.5pt]SUB[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]SubZhuCe(name As String, code As String)[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]设计一个隐蔽算法的反调试注册过程[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]可用真正注册码[/size][/font][size=10.5pt]:[/size]
[size=10.5pt]'name:maplescg[/size]
[size=10.5pt]'code:844123456[/size]
[size=10.5pt] [/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]假注册码[/size][/font][size=10.5pt]:[/size]
[size=10.5pt]'name:maplescg[/size]
[size=10.5pt]'code:14245066571[/size]
[size=10.5pt] [/size]
[size=10.5pt]DimNxunhuan As Integer[/size]
[size=10.5pt]Dim YinbiAs Double[/size]
[size=10.5pt]DimZhongzhuan As String[/size]
[size=10.5pt] [/size]
[size=10.5pt]Dim ZhangAs Double[/size]
[size=10.5pt]Dim MihuoAs String[/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt]On ErrorGoTo Yes[/size]
[size=10.5pt] [/size]
[size=10.5pt]IfLen(name) < 5 Then MsgBox "[/size][font=宋体][size=10.5pt]用户名长度不能小于[/size][/font][size=10.5pt]5[/size][font=宋体][size=10.5pt]位[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]提示[/size][/font][size=10.5pt]": Exit Sub[/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt]ForNxunhuan = 1 To Len(name)[/size]
[size=10.5pt]Yinbi =Yinbi + Asc(Mid(name, Nxunhuan, 1))[/size]
[size=10.5pt]NextNxunhuan[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]循环取用户名所有字母的[/size][/font][size=10.5pt]ASC[/size][font=宋体][size=10.5pt]值之和[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]Zhongzhuan= Yinbi[/size]
[size=10.5pt] [/size]
[size=10.5pt]IfLen(code) <= Len((Zhongzhuan)) Then MsgBox "[/size][font=宋体][size=10.5pt]注册码长度不够[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]提示[/size][/font][size=10.5pt]": Exit Sub[/size]
[size=10.5pt] [/size]
[size=10.5pt]Zhang =Yinbi Xor Val(Left(code, Len(Zhongzhuan)))[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]将上述值跟输入注册码左边开始,相同长度的数值[/size][/font][size=10.5pt]XOR[/size]
[size=10.5pt] [/size]
[size=10.5pt]Zhang =Log(Zhang)[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]对[/size][/font][size=10.5pt]XOR[/size][font=宋体][size=10.5pt]值进行[/size][/font][size=10.5pt]LOG[/size][font=宋体][size=10.5pt]运算,注意[/size][/font][size=10.5pt]LOG[/size][font=宋体][size=10.5pt]有个特点是什么?[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]当[/size][/font][size=10.5pt]ZHANG[/size][font=宋体][size=10.5pt]为零的时候会出现一个数值为[/size][/font][size=10.5pt]5[/size][font=宋体][size=10.5pt]的异常[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]我们这里就是利用这个特点来设计隐蔽的注册过程来[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]反跟踪。[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]请问,破解者跟到这里了,他怎么会知道这里必须[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]产生一个异常值为[/size][/font][size=10.5pt]5[/size][font=宋体][size=10.5pt]的异常才能跟到正确的注册过程[/size][/font][size=10.5pt],[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]如果不出现[/size][/font][size=10.5pt]5[/size][font=宋体][size=10.5pt]异常的话,也没什么现象可以给他分析的[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]他只能继续分析下去,就像走一条大路,他根本就没发现[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]必须走小路才有收获,而一直走下去,貌似正确,实际被耍了[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt]Mihuo =Right(Zhang, 8)[/size]
[size=10.5pt]IfRight(code, Len(code) - Len(Zhongzhuan)) = Mihuo Then[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]假注册成功[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]无语了吧[/size][/font][size=10.5pt]?",, "^_^"[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]假注册码错误[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]落入陷阱[/size][/font][size=10.5pt]",, "^_^"[/size]
[size=10.5pt] [/size]
[size=10.5pt]End If[/size]
[size=10.5pt]Exit Sub[/size]
[size=10.5pt] [/size]
[size=10.5pt]Yes:[/size]
[size=10.5pt]IfErr.Number = 5 Then[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]检测异常类型是否为[/size][/font][size=10.5pt]5[/size][font=宋体][size=10.5pt],若为[/size][/font][size=10.5pt]5[/size][font=宋体][size=10.5pt]说明是[/size][/font][size=10.5pt]LOG[/size][font=宋体][size=10.5pt]异常了,表示可以进行正确的注册算法过程了[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]如果不是[/size][/font][size=10.5pt]5[/size][font=宋体][size=10.5pt],那就处理一般性的异常处理事务。[/size][/font][size=10.5pt][/size]
[size=10.5pt]'__________[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]这里开始可以嵌入我们真正的算法了[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]If Right(code,Len(code) - Len(Zhongzhuan)) = "123456" Then[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]真正注册成功[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]学会了吧[/size][/font][size=10.5pt]?"[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]真正算法里面最好不要出现太明显的提示信息,所以这里我把注册失败给提示给去掉了[/size][/font][size=10.5pt][/size]
[size=10.5pt]'__________[/size]
[size=10.5pt] [/size]
[size=10.5pt]Else[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]不好意思[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]请检测输入是否有问题[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]出错了[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]调用如下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Command1_Click()[/size]
[size=10.5pt]ZhuCeText1.Text, Text2.Text[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]可用真正注册码[/size][/font][size=10.5pt]:[/size]
[size=10.5pt]'name:maplescg[/size]
[size=10.5pt]'code:844123456[/size]
[size=10.5pt] [/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]假注册码[/size][/font][size=10.5pt]:[/size]
[size=10.5pt]'name:maplescg[/size]
[size=10.5pt]'code:14245066571[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]看明白了吧?原来是这样的注册反调试过程:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]如图:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=512,384]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image036.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]正常状况下,维持左边正常假注册过程,只有在三叉路口,实现了代号为[/size][/font][size=10.5pt]5[/size][font=宋体][size=10.5pt]的异常的时候,才执行右边正确的算法过程,而破解者基本看不明白在哪里有跳转,因为没有出现[/size][/font][size=10.5pt]JMP[/size][font=宋体][size=10.5pt]这类的代码,而关键的[/size][/font][size=10.5pt]LOG[/size][font=宋体][size=10.5pt]也被认为是计算注册码的必要函数,其实我们只是拿它来实现特定条件下的跳转工作。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我们把这个决定分支启动的关键点称为“门”。“门”要么很坚固,进不去;要么很隐蔽,找不到。小说里,电视里常常出现这样的“门”,为了找什么秘籍或者宝物,总是要找到很隐蔽或者很坚固的门才行。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]该方法胜在隐蔽,而不是强大上。抗破解能力不是很强,但是绝对会让别人惊喜一下(假注册成功)配合别的技巧,当真是有用武之地的,望君勉之。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]看效果图:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=355,245]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image037.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=355,245]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image038.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]真正注册成功:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=355,245]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image039.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第十一、步长、时值反调试(包含启动时间检测)[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]除了前面我们讲过的[/size][/font][size=10.5pt]RDTSC[/size][font=宋体][size=10.5pt]是经典的时值反调试指令可以被直接反汇编来写进我们的程序外,我们也可以用[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]自身携带的一些时值检函数如:[/size][/font][size=10.5pt]TIMER[/size][font=宋体][size=10.5pt](精确到毫秒);也可以用[/size][/font][size=10.5pt]API[/size][font=宋体][size=10.5pt]里的[/size][/font][size=10.5pt]GetTickCount[/size][font=宋体][size=10.5pt](精确到毫秒)[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]甚至可以用[/size][/font][size=10.5pt]API:[/size]
[size=10.5pt]GetProcessTimes [/size][font=宋体][size=10.5pt]来进行加载检测,以起到反调试作用。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这些技术,接下去,我们都要学,而且都要学会,一点都不难。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]先看[/size][/font][size=10.5pt]RDTSC[/size][font=宋体][size=10.5pt]指令:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]0041BE74
0F31
RDTSC[/size]
[size=10.5pt]‘[/size][font=宋体][size=10.5pt]获得时间[/size][/font][size=10.5pt][/size]
[size=10.5pt]0041BE76
8BC8
MOV ECX,EAX[/size]
[size=10.5pt]‘[/size][font=宋体][size=10.5pt]传值到[/size][/font][size=10.5pt]ECX[/size]
[size=10.5pt]0041BE78
0F31
RDTSC[/size]
[size=10.5pt]‘[/size][font=宋体][size=10.5pt]再次获得时间[/size][/font][size=10.5pt][/size]
[size=10.5pt]0041BE7A
2BC1
SUB EAX,ECX[/size]
[size=10.5pt]‘[/size][font=宋体][size=10.5pt]用这个值减去刚才我们储存到[/size][/font][size=10.5pt]ECX[/size][font=宋体][size=10.5pt]的值,也就得到了时间差[/size][/font][size=10.5pt][/size]
[size=10.5pt]0041BE7C
3D00050000
CMP EAX,500
[/size]
[size=10.5pt]‘[/size][font=宋体][size=10.5pt]比较这个时间差是否大于[/size][/font][size=10.5pt]500[/size][font=宋体][size=10.5pt]([/size][/font][size=10.5pt]H[/size][font=宋体][size=10.5pt]),若是大了说明存在调试[/size][/font][size=10.5pt][/size]
[size=10.5pt]0041BE81
^ 0F8F ADF9FFFF
JG [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].0041B834[/size]
[size=10.5pt]‘[/size][font=宋体][size=10.5pt]然后就随机跳到坟墓[/size][/font][size=10.5pt][/size]
[size=10.5pt]0041BE87
83F8 00
CMP EAX,0[/size]
[size=10.5pt]‘[/size][font=宋体][size=10.5pt]比较这个时间差是否小于[/size][/font][size=10.5pt]0[/size][font=宋体][size=10.5pt]([/size][/font][size=10.5pt]H[/size][font=宋体][size=10.5pt]),想想怎么可能小于零?光速也不行。[/size][/font][size=10.5pt][/size]
[size=10.5pt]0041BE8A
^ 0F8C8EF9FFFF
JL [/size][font=宋体][size=10.5pt]了凡第一[/size][/font][size=10.5pt].0041B81E[/size]
[size=10.5pt]
‘[/size][font=宋体][size=10.5pt]如果小于零说明调试时间太长了,以至轮回到了负数[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]里该指令我也不知道怎么编译,干脆大家也自己通过反汇编后来汇编添加吧[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]下面再讲:[/size][/font][size=10.5pt]GetTickCount [/size][font=宋体][size=10.5pt](返回系统启动以来经过的时间:毫秒)[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]同样也是利用时间差来计算一段或者一句指令执行的时间差,这个值不应该超过我们设置好的一个值。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程,添加一个[/size][/font][size=10.5pt]COMAND1[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在通用部分,添加[/size][/font][size=10.5pt]GetTickCount[/size][font=宋体][size=10.5pt]声明:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateDeclare Function GetTickCount Lib "kernel32" Alias"GetTickCount" () As Long[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[font=宋体][size=10.5pt]在[/size][/font][size=10.5pt]COMMAND1[/size][font=宋体][size=10.5pt]事件里添加以下代码:(实际编写中可以不拘一格)[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Command1_Click()[/size]
[size=10.5pt] [/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]假设这里是我们的注册过程,我们隔三差五随意将以下代码复制粘帖[/size][/font][size=10.5pt][/size]
[size=10.5pt]'——————————————————————————————[/size]
[size=10.5pt]Dim atimeAs Long[/size]
[size=10.5pt]Dim btimeAs Long[/size]
[size=10.5pt]atime =GetTickCount[/size]
[size=10.5pt]btime =GetTickCount[/size]
[size=10.5pt]If btime- atime = 0 Then[/size]
[size=10.5pt]MsgBoxbtime - atime, , "[/size][font=宋体][size=10.5pt]正常运行[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]经历时间[/size][/font][size=10.5pt]:"[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]实际软件中,应该彻底隐蔽这些提示消息[/size][/font][size=10.5pt][/size]
[size=10.5pt]Else[/size]
[size=10.5pt]MsgBoxbtime - atime, , "[/size][font=宋体][size=10.5pt]发现调试器[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]经历时间[/size][/font][size=10.5pt]:"[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]实际软件中,应该彻底隐蔽这些提示消息,直接引入错误的分支去执行乱七八糟的代码[/size][/font][size=10.5pt][/size]
[size=10.5pt]End If[/size]
[size=10.5pt]'——————————————————————————————[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]算法部分[/size][/font][size=10.5pt]......[/size]
[size=10.5pt] [/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]效果如图:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=342,239]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image040.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]发现调试工作:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image042.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]再讲系统自带的[/size][/font][size=10.5pt]TIMER[/size][font=宋体][size=10.5pt]函数[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程[/size][/font]
[font=宋体][size=10.5pt]添加[/size][/font][size=10.5pt]COMMAND1[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在它的事件代码里编写:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Command1_Click()[/size]
[size=10.5pt] [/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]假设这里是我们的注册过程,我们隔三差五随意将以下代码复制粘帖[/size][/font][size=10.5pt][/size]
[size=10.5pt]'------------------------------[/size]
[size=10.5pt]Dim ctimeAs Double[/size]
[size=10.5pt]Dim dtimeAs Double[/size]
[size=10.5pt]ctime =Timer[/size]
[size=10.5pt]dtime =Timer[/size]
[size=10.5pt]If dtime- ctime = 0 Then[/size]
[size=10.5pt]MsgBoxdtime - ctime, , "[/size][font=宋体][size=10.5pt]正常运行[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]经历时间[/size][/font][size=10.5pt]:"[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]实际软件中,应该彻底隐蔽这些提示消息[/size][/font][size=10.5pt][/size]
[size=10.5pt]Else[/size]
[size=10.5pt]MsgBoxdtime - ctime, , "[/size][font=宋体][size=10.5pt]发现调试器[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]经历时间[/size][/font][size=10.5pt]:"[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]实际软件中,应该彻底隐蔽这些提示消息,直接引入错误的分支去执行乱七八糟的代码[/size][/font][size=10.5pt][/size]
[size=10.5pt]End If[/size]
[size=10.5pt] [/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]可见[/size][/font][size=10.5pt]TIMER[/size][font=宋体][size=10.5pt]跟[/size][/font][size=10.5pt]GetTickCount[/size][font=宋体][size=10.5pt]有差不多的应用,可以扩展下思维吧。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]关于时间类反调试,我讲最后一个,一是重点介绍的一个:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]API:[/size]
[size=10.5pt]GetProcessTimes[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我们先来看看它的作用和使用规范:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateDeclare Function GetProcessTimes Lib "kernel32" Alias"GetProcessTimes" (ByVal hProcess As Long, lpCreationTime AsFILETIME, lpExitTime As FILETIME, lpKernelTime As FILETIME, lpUserTime AsFILETIME) As Long[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]获取与一个进程的经过时间有关的信息[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]Long[/size][font=宋体][size=10.5pt],非零表示成功,零表示失败。会设置[/size][/font][size=10.5pt]GetLastError[/size]
[size=10.5pt] [/size]
[size=10.5pt]hProcess-------
Long[/size][font=宋体][size=10.5pt],一个进程句柄[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]lpCreationTime-
FILETIME[/size][font=宋体][size=10.5pt],指定一个[/size][/font][size=10.5pt]FILETIME[/size][font=宋体][size=10.5pt]结构,在其中装载进程的创建时间[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]lpExitTime-----
FILETIME[/size][font=宋体][size=10.5pt],指定一个[/size][/font][size=10.5pt]FILETIME[/size][font=宋体][size=10.5pt]结构,在其中装载进程的中止时间[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]lpKernelTime---
FILETIME[/size][font=宋体][size=10.5pt],指定一个[/size][/font][size=10.5pt]FILETIME[/size][font=宋体][size=10.5pt]结构,在其中装载进程花在内核模式上的总时间[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]lpUserTime-----
FILETIME[/size][font=宋体][size=10.5pt],指定一个[/size][/font][size=10.5pt]FILETIME[/size][font=宋体][size=10.5pt]结构,在其中装载进程花在用户模式上的总时间[/size][/font][size=10.5pt][/size]
[size=10.5pt]
[/size]
[font=宋体][size=10.5pt]适用平台[/size][/font][size=10.5pt][/size]
[size=10.5pt]WindowsNT[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]可见可以用它来检测加载时候的创建时间,一般在[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]加载它,但是还没按[/size][/font][size=10.5pt]F9[/size][font=宋体][size=10.5pt]或者点运行,但是系统早已自动帮我们记录了它的“启动”时间,我们只要到程序获得自主权的时候,检测这个“启动”到底花了多少时间就可以发现调试器,进而反调试了。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]跟我一起来:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程[/size][/font]
[font=宋体][size=10.5pt]添加一个[/size][/font][size=10.5pt]LABEL1[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在通用部分写下以下代码:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]OptionExplicit[/size]
[size=10.5pt]PrivateDeclare Sub GetLocalTime Lib "kernel32" (ntt As SystemTime)[/size]
[size=10.5pt]PrivateDeclare Sub GetProcessTimes Lib "kernel32" (ByVal hProcess As Long,lpCreationTime As FILETIME, lpExitTime As FILETIME, lpKernelTime As FILETIME,lpUserTime As FILETIME)[/size]
[size=10.5pt]PrivateDeclare Function GetCurrentProcess Lib "kernel32" () As Long[/size]
[size=10.5pt]PrivateDeclare Sub FileTimeToSystemTime Lib "kernel32" (lpFileTime AsFILETIME, lpSystemTime As SystemTime)[/size]
[size=10.5pt]PrivateType SystemTime[/size]
[size=10.5pt]
wYear As Integer[/size]
[size=10.5pt]
wMonth As Integer[/size]
[size=10.5pt]
wDayOfWeek As Integer[/size]
[size=10.5pt]
wDay As Integer[/size]
[size=10.5pt]
wHour As Integer[/size]
[size=10.5pt]
wMinute As Integer[/size]
[size=10.5pt]
wSecond As Integer[/size]
[size=10.5pt]
wMilliseconds As Integer[/size]
[size=10.5pt]End Type[/size]
[size=10.5pt]PrivateType FILETIME[/size]
[size=10.5pt]
dwLowDateTime As Long[/size]
[size=10.5pt]
dwHighDateTime As Long[/size]
[size=10.5pt]End Type[/size]
[size=10.5pt]Dim id AsLong[/size]
[size=10.5pt]Dim cttAs FILETIME[/size]
[size=10.5pt]Dim ettAs FILETIME[/size]
[size=10.5pt]Dim kttAs FILETIME[/size]
[size=10.5pt]Dim uttAs FILETIME[/size]
[size=10.5pt]Dim sttAs SystemTime[/size]
[size=10.5pt]Dim nttAs SystemTime[/size]
[size=10.5pt]Dim qttAs Double[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]下面开始编写一个函数,可以方便复制和移植。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateFunction Antitime() As Boolean[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]自定义了一个利用[/size][/font][size=10.5pt]GetProcessTimes[/size][font=宋体][size=10.5pt]自动进行检测调试器的函数[/size][/font][size=10.5pt][/size]
[size=10.5pt]GetLocalTimentt[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]获得现在系统时间[/size][/font][size=10.5pt][/size]
[size=10.5pt]id =GetCurrentProcess[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]获得本进程[/size][/font][size=10.5pt]ID[/size]
[size=10.5pt]GetProcessTimesid, ctt, ett, ktt, utt[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]获得本进程[/size][/font][size=10.5pt]ID[/size][font=宋体][size=10.5pt]对应的信息[/size][/font][size=10.5pt][/size]
[size=10.5pt]FileTimeToSystemTimectt, stt[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]转换时间格式[/size][/font][size=10.5pt][/size]
[size=10.5pt]qtt =Val(ntt.wSecond) * 1000 + ntt.wMilliseconds - Val(stt.wSecond) * 1000 -stt.wMilliseconds[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]计算时间差[/size][/font][size=10.5pt][/size]
[size=10.5pt]If qtt> 80 Or qtt < 0 Then[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]如果时间差大于[/size][/font][size=10.5pt]80[/size][font=宋体][size=10.5pt]微秒或者小于[/size][/font][size=10.5pt]0[/size][font=宋体][size=10.5pt]就认为发现了调试,这个值大家可以自行修改[/size][/font][size=10.5pt][/size]
[size=10.5pt]Antitime= True[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]Antitime= False[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]EndFunction[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]如何引用?必须放到窗口的[/size][/font][size=10.5pt]LOAD[/size][font=宋体][size=10.5pt]事件或者[/size][/font][size=10.5pt]Initialize[/size][font=宋体][size=10.5pt]事件里,因为这连个事件在程序启动时加载,刚好可以给我们限定启动时间。请看代码:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Form_Initialize()[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]这样调用即可[/size][/font][size=10.5pt][/size]
[size=10.5pt]IfAntitime = True Then[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]发现调试器了[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]提醒[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]Label1.ForeColor= &HFF&[/size]
[size=10.5pt]Label1.Caption= "[/size][font=宋体][size=10.5pt]发现调试器[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]Label1.ForeColor= &H80000012[/size]
[size=10.5pt]Label1.Caption= "[/size][font=宋体][size=10.5pt]没有发现调试[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]请看效果图:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]没有调试时:[/size][/font][size=10.5pt][/size]
[size=10.5pt][img=372,237]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image043.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt]OD[/size][font=宋体][size=10.5pt]装载调试:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image045.jpg[/img][/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image047.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]你可以测试别的调试器,结果基本一样,可靠性还是比较高的。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]请合理利用,比较点等要设计的比较隐蔽才可以。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第十二、检测内存分配大小反调试[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]有没有发现?当程序被[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]带[/size][/font][size=10.5pt]HIDEOD[/size][font=宋体][size=10.5pt]插件调试的时候,其分配的内存底线和上线跟正常的情况是不一致的。利用这点,我们可以设计一个反[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]的函数。(其实其作用就是检测[/size][/font][size=10.5pt]HIDEOD[/size][font=宋体][size=10.5pt]插件用的,只要开启该插件,就能被发现)[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]需要[/size][/font][size=10.5pt]API:[/size]
[size=10.5pt]GetProcessWorkingSetSize[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我们一起测试下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程[/size][/font]
[font=宋体][size=10.5pt]添加[/size][/font][size=10.5pt]COMMAND1[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在通用部分添加:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateDeclare Function GetCurrentProcess Lib "kernel32" () As Long[/size]
[size=10.5pt]PrivateDeclare Function GetProcessWorkingSetSize Lib "kernel32" (ByValhProcess As Long, lpMinimumWorkingSetSize As Long, lpMaximumWorkingSetSize AsLong) As Long[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]然后我们编写函数[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateFunction JianNeicun(biggest As Long, smallest As Long) As Boolean[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]我们这里的最大值是[/size][/font][size=10.5pt]1413120[/size][font=宋体][size=10.5pt],最小值是[/size][/font][size=10.5pt]204800[/size]
[size=10.5pt]Dim yx AsLong[/size]
[size=10.5pt]Dim ax AsLong[/size]
[size=10.5pt]Dim bx AsLong[/size]
[size=10.5pt]Dim cx AsLong[/size]
[size=10.5pt]yx =GetCurrentProcess[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]获得[/size][/font][size=10.5pt]ID[/size]
[size=10.5pt]ax =GetProcessWorkingSetSize(yx, bx, cx)[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]获得内存分配信息[/size][/font][size=10.5pt][/size]
[size=10.5pt]'MsgBoxbx, , "min" '[/size][font=宋体][size=10.5pt]这里可以自行打开[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]以确定你的程序实际最小内存分配[/size][/font][size=10.5pt][/size]
[size=10.5pt]'MsgBoxcx, , "max" '[/size][font=宋体][size=10.5pt]这里可以自行打开[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]以确定你的程序实际最大内存分配[/size][/font][size=10.5pt][/size]
[size=10.5pt]If bx<> smallest Or cx <> biggest Then[/size]
[size=10.5pt]JianNeicun= True '[/size][font=宋体][size=10.5pt]发现调试器[/size][/font][size=10.5pt]OD[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]JianNeicun= False[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]EndFunction[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]怎样使用?[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]请看:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Command1_Click()[/size]
[size=10.5pt]IfJianNeicun(1413120, 204800) = True Then[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]这个值可以修改为你的程序的实际内存交付[/size][/font][size=10.5pt][/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]发现调试器[/size][/font][size=10.5pt]OD", , "[/size][font=宋体][size=10.5pt]提示[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]没有发现调试器[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]恭喜[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]效果图:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]正常:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=319,238]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image048.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]发现调试器[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]([/size][/font][size=10.5pt]HIDEOD[/size][font=宋体][size=10.5pt])[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image050.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]同样,每一个设计的反调试都需要隐蔽些,不然不就等于告诉别人“快来解决我”吗?[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第十三、窗口置顶反调试[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这个只是些小技巧,对付初级破解者还好,对付有些经验的破解者就容易过了。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]简要原理:利用[/size][/font][size=10.5pt]API[/size][font=宋体][size=10.5pt],将本程序窗口置顶,覆盖其他程序界面,使得破解者无法看到其他内容,也就无法看到调试器了。最好在注册过程中使用,以免影响用户其他作业。而且在置顶后,不要用[/size][/font][size=10.5pt]MSGBOX[/size][font=宋体][size=10.5pt]函数,否则会卡死掉,直接用[/size][/font][size=10.5pt]LABEL[/size][font=宋体][size=10.5pt]或者[/size][/font][size=10.5pt]TEXT[/size][font=宋体][size=10.5pt]显示结果和信息即可。注册结束后不要忘了解除置顶(直接关闭也可以)[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]需要使用[/size][/font][size=10.5pt]API:[/size]
[size=10.5pt]SetWindowPos[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]代开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程[/size][/font]
[font=宋体][size=10.5pt]添加[/size][/font][size=10.5pt]COMMAND1[/size][font=宋体][size=10.5pt]和两个[/size][/font][size=10.5pt]LABEL[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在通用里添加如下代码:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateDeclare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByValhWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long,ByVal cy As Long, ByVal wFlags As Long) As Long[/size]
[size=10.5pt]PrivateConst HWND_TOPMOST = -1[/size]
[size=10.5pt]PrivateConst SWP_NOMOVE = &H2[/size]
[size=10.5pt]PrivateConst SWP_NOSIZE = &H1[/size]
[size=10.5pt]PrivateConst SWP_NOZORDER = &H8[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]设计以下两个过程[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub SetFormTopmost()[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]该过程是使窗口置顶[/size][/font][size=10.5pt][/size]
[size=10.5pt]MAXme[/size]
[size=10.5pt]SetWindowPosForm1.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOZORDER + SWP_NOMOVE + SWP_NOSIZE[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub MAXme()[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]该过程是使窗口占满整个屏幕[/size][/font][size=10.5pt][/size]
[size=10.5pt]Me.Left =0[/size]
[size=10.5pt]Me.Top =0[/size]
[size=10.5pt]Me.Width= Screen.Width[/size]
[size=10.5pt]Me.Height= Screen.Height[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]调用如下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Command1_Click()[/size]
[size=10.5pt]IfVal(Text1.Text) = 123456 Then[/size]
[size=10.5pt]Label2.Caption= "[/size][font=宋体][size=10.5pt]注册成功[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]您可以关闭注册窗口了[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]Text1.Enabled= False[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]Label2.Caption= "[/size][font=宋体][size=10.5pt]授权码错误[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]请重新输入[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y AsSingle)[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]在鼠标触及按钮的时候启动置顶[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]实际应用中,你可以自己选择个隐蔽的地方来启动[/size][/font][size=10.5pt][/size]
[size=10.5pt]SetFormTopmost[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]编译即可[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]当用户注册的时候,鼠标触及[/size][/font][size=10.5pt]COMMAND[/size][font=宋体][size=10.5pt]后自动最大化窗口并且置顶,覆盖普通调试器。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]如果用户强行断点[/size][/font][size=10.5pt]COMMAND CLICK[/size][font=宋体][size=10.5pt]事件想跟踪注册算法的话,会引发窗口锁死,[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]的无法显示,本程序锁定无法继续操作。在一定程度上阻止了调试。一般来说破解这个反调试手段是爆破和修改相关[/size][/font][size=10.5pt]CALL[/size][font=宋体][size=10.5pt]调用,因此需要我们的[/size][/font][size=10.5pt]CRC32[/size][font=宋体][size=10.5pt]等及反调试手段相结合。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]该注册窗口可以作为你的程序的注册页面,其他页面没必要置顶。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我们看看效果:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image052.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image054.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第十四、检测按键,一般是[/size][/font][size=10.5pt]F2[/size][font=宋体][size=10.5pt](断点)、[/size][/font][size=10.5pt]F7[/size][font=宋体][size=10.5pt](单步步进)、[/size][/font][size=10.5pt]F8[/size][font=宋体][size=10.5pt](逐过程步过)、[/size][/font][size=10.5pt]F9[/size][font=宋体][size=10.5pt](运行)[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]一般程序都是用不到[/size][/font][size=10.5pt]F2[/size][font=宋体][size=10.5pt]、[/size][/font][size=10.5pt]F7[/size][font=宋体][size=10.5pt]、[/size][/font][size=10.5pt]F8[/size][font=宋体][size=10.5pt]、[/size][/font][size=10.5pt]F9[/size][font=宋体][size=10.5pt]等,而[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]刚好都需要,破解者破解过程中,会不停的按这些键,这个恐怕大家都养成习惯了,用鼠标的话比较麻烦。利用大家的习惯和不注意,我们可以检测这些按键,发现按键后立即警告等,随便你处理了。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这个很好玩,大家来实验下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程,添加[/size][/font][size=10.5pt]COMMAND1 [/size][font=宋体][size=10.5pt]和一个[/size][/font][size=10.5pt]TIMER1([/size][font=宋体][size=10.5pt]计时器[/size][/font][size=10.5pt]) [/size][font=宋体][size=10.5pt]设置为打开[/size][/font][size=10.5pt]100[/size][font=宋体][size=10.5pt]微秒。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在通用添加:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]OptionExplicit[/size]
[size=10.5pt]PrivateDeclare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long)As Integer[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]定义[/size][/font][size=10.5pt]API[/size][font=宋体][size=10.5pt]调用[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]接着设计一个检测按键并做相应的[/size][/font][size=10.5pt]SUB[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Anjian()[/size]
[size=10.5pt]IfGetAsyncKeyState(vbKeyF2) Then[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]你按了[/size][/font][size=10.5pt]F2[/size][font=宋体][size=10.5pt]键[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]怀疑你在用[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]断点[/size][/font][size=10.5pt]",, "[/size][font=宋体][size=10.5pt]警告[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]IfGetAsyncKeyState(vbKeyF7) Then[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]你按了[/size][/font][size=10.5pt]F7[/size][font=宋体][size=10.5pt]键[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]怀疑你在用[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]调试[/size][/font][size=10.5pt]",, "[/size][font=宋体][size=10.5pt]警告[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]IfGetAsyncKeyState(vbKeyF8) Then[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]你按了[/size][/font][size=10.5pt]F8[/size][font=宋体][size=10.5pt]键[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]怀疑你在用[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]调试[/size][/font][size=10.5pt]",, "[/size][font=宋体][size=10.5pt]警告[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]IfGetAsyncKeyState(vbKeyF9) Then[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]你按了[/size][/font][size=10.5pt]F9[/size][font=宋体][size=10.5pt]键[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]怀疑你在用[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]调试[/size][/font][size=10.5pt]",, "[/size][font=宋体][size=10.5pt]警告[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]调用如下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Command1_Click()[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]本按无对应算法注册[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]只是演示监视按键来反调试[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]假设破解者追踪本按钮事件[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]提醒[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Timer1_Timer()[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]用计时器来时时检测按键[/size][/font][size=10.5pt][/size]
[size=10.5pt]Anjian[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]看看效果[/size][/font][size=10.5pt]:[/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image056.jpg[/img][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]其他按钮也能检测出来,效果还好的。在程序运行的时候,如果下[/size][/font][size=10.5pt]F2[/size][font=宋体][size=10.5pt]断点,同样可以发出警告提示。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第十五、检测前台窗口反调试[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]当你的程序的注册按钮被点击,或者其他互动事件发发生,程序窗体就调到前台位置了。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我们可以据此检测是否有调试活动[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]利用[/size][/font][size=10.5pt]API[/size][font=宋体][size=10.5pt]:[/size][/font][size=10.5pt]GetForegroundWindow[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程,添加注册按钮[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在通用部分添加:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateDeclare Function GetForegroundWindow Lib "user32" () As Long[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]编写函数:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateFunction JianWindow() As Boolean[/size]
[size=10.5pt]Dim abcgAs Long[/size]
[size=10.5pt]abcg =GetForegroundWindow[/size]
[size=10.5pt]If abcg =Me.hWnd Then[/size]
[size=10.5pt]JianWindow= False[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]JianWindow= True[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]EndFunction[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]调用如下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Command1_Click()[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]如果断点在这里[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]那么就会被我们发现调试[/size][/font][size=10.5pt][/size]
[size=10.5pt]IfJianWindow = True Then[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]你在调试我[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]提示[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]没有发现调试[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]恭喜[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]效果如图:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image058.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第十六、[/size][/font][size=10.5pt]SeDebugPrivilege[/size][font=宋体][size=10.5pt]检测调试器[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]简要原理:当调试器调试程序的时候,程序的获得了对[/size][/font][size=10.5pt]csrss.exe[/size][font=宋体][size=10.5pt]进程的读取权利,而正常情况下,程序是没有这个权限的,我们来检测程序是否具备读取[/size][/font][size=10.5pt]csrss.exe[/size][font=宋体][size=10.5pt]的能力来判断是否被调试。针对[/size][/font][size=10.5pt]OD[/size][font=宋体][size=10.5pt]的话,如果[/size][/font][size=10.5pt]HIDEOD[/size][font=宋体][size=10.5pt]插件开启防护的话,那就没用了。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程[/size][/font]
[font=宋体][size=10.5pt]添加[/size][/font][size=10.5pt]COMMAND1[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在通用部分加入代码:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateDeclare Function CreateToolhelp32Snapshot Lib "kernel32" (ByValdwFlags As Long, ByVal th32ProcessID As Long) As Long[/size]
[size=10.5pt]PrivateDeclare Function Process32First Lib "kernel32" (ByVal hSnapShot AsLong, lppe As PROCESSENTRY32) As Long[/size]
[size=10.5pt]PrivateDeclare Function Process32Next Lib "kernel32" (ByVal hSnapShot AsLong, lppe As PROCESSENTRY32) As Long[/size]
[size=10.5pt]PrivateDeclare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)As Long[/size]
[size=10.5pt]PrivateDeclare Function TerminateProcess Lib "kernel32" (ByVal hProcess AsLong, ByVal uExitCode As Long) As Long[/size]
[size=10.5pt]
Private Declare Function OpenProcess Lib"kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle AsLong, ByVal dwAppProcessId As Long) As Long[/size]
[size=10.5pt]
[/size]
[size=10.5pt]ConstMAX_PATH As Integer = 260[/size]
[size=10.5pt]ConstTH32CS_SNAPPROCESS As Long = 2&[/size]
[size=10.5pt]PrivateType PROCESSENTRY32[/size]
[size=10.5pt]
dwSize As Long[/size]
[size=10.5pt]
cntUsage As Long[/size]
[size=10.5pt]
th32ProcessID As Long[/size]
[size=10.5pt]
th32DefaultHeapID As Long[/size]
[size=10.5pt]
th32ModuleID As Long[/size]
[size=10.5pt]
cntThreads As Long[/size]
[size=10.5pt]
th32ParentProcessID As Long[/size]
[size=10.5pt]
pcPriClassBase As Long[/size]
[size=10.5pt]
dwFlags As Long[/size]
[size=10.5pt]
szExeFile As String * 1024[/size]
[size=10.5pt]End Type[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]下面开始编写函数[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt]

[/size]
[size=10.5pt]PrivateFunction Opencsrss() As Boolean[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]发现调试器返回[/size][/font][size=10.5pt]TRUE[/size][font=宋体][size=10.5pt],没有发现则返回[/size][/font][size=10.5pt]FALSE[/size]
[size=10.5pt] [/size]
[size=10.5pt]On ErrorGoTo maple[/size]
[size=10.5pt]DimProcess As PROCESSENTRY32[/size]
[size=10.5pt]DimhSnapShot As Long[/size]
[size=10.5pt]Dim l1 AsLong[/size]
[size=10.5pt]Dim flagAs Boolean[/size]
[size=10.5pt]Dim mNameAs String[/size]
[size=10.5pt]Dim i AsInteger[/size]
[size=10.5pt]Dim pidAs Long, WOW As Long '[/size][font=宋体][size=10.5pt]注意这[/size][/font][size=10.5pt]2[/size][font=宋体][size=10.5pt]个变量就用来存放[/size][/font][size=10.5pt]2[/size][font=宋体][size=10.5pt]个[/size][/font][size=10.5pt]ID[/size]
[size=10.5pt]hSnapShot= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&) '[/size][font=宋体][size=10.5pt]建立进程快照[/size][/font][size=10.5pt][/size]
[size=10.5pt]
If hSnapShot Then[/size]
[size=10.5pt]
Process.dwSize = 1060[/size]
[size=10.5pt]
If (Process32First(hSnapShot, Process))Then '[/size][font=宋体][size=10.5pt]遍历第一个进程[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]获得[/size][/font][size=10.5pt]PROCESSENTRY32[/size][font=宋体][size=10.5pt]结构[/size][/font][size=10.5pt][/size]
[size=10.5pt]
Do[/size]
[size=10.5pt]
i = InStr(1, Process.szExeFile,Chr(0))
'[/size][font=宋体][size=10.5pt]获得映像名称[/size][/font][size=10.5pt][/size]
[size=10.5pt]
mName = LCase(Left(Process.szExeFile, i- 1)) '[/size][font=宋体][size=10.5pt]并转换成小写[/size][/font][size=10.5pt][/size]
[size=10.5pt]
[/size]
[size=10.5pt]
If mName = "csrss.exe"Then
'[/size][font=宋体][size=10.5pt]是不是[/size][/font][size=10.5pt]WOW.exe[/size]
[size=10.5pt]
WOW = Process.th32ProcessID
'[/size][font=宋体][size=10.5pt]获得进程[/size][/font][size=10.5pt]ID[/size]
[size=10.5pt]
End If[/size]
[size=10.5pt]
Loop Until (Process32Next(hSnapShot,Process) < 1) '[/size][font=宋体][size=10.5pt]遍历所有进程直到返回值为[/size][/font][size=10.5pt]False[/size]
[size=10.5pt]
End If[/size]
[size=10.5pt]
l1 = CloseHandle(hSnapShot)[/size]
[size=10.5pt]
End If[/size]
[size=10.5pt]
If WOW <> 0 Then[/size]
[size=10.5pt]
[/size]
[size=10.5pt]
Dim jiejie As Long[/size]
[size=10.5pt]
jiejie = OpenProcess(1&, -1&, WOW)[/size]
[size=10.5pt]
'[/size][font=宋体][size=10.5pt]测试打开能力[/size][/font][size=10.5pt][/size]
[size=10.5pt]
If jiejie <> 0 Then[/size]
[size=10.5pt]
Opencsrss = True[/size]
[size=10.5pt]
Else[/size]
[size=10.5pt]
Opencsrss = False[/size]
[size=10.5pt]
End If[/size]
[size=10.5pt]
[/size]
[size=10.5pt]
[/size]
[size=10.5pt]
End If[/size]
[size=10.5pt]ExitFunction[/size]
[size=10.5pt]maple:[/size]
[size=10.5pt]Opencsrss= False[/size]
[size=10.5pt] [/size]
[size=10.5pt]EndFunction[/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]调用如下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Command1_Click()[/size]
[size=10.5pt]IfOpencsrss = True Then[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]发现调试器[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]请关闭[/size][/font][size=10.5pt]",, "[/size][font=宋体][size=10.5pt]警告[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]没有发现调试[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]恭喜[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]效果如图:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image060.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第十七、关键部分算法的时候锁定鼠标干扰调试分析[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这个是个示范,其实你也可以编写针对键盘的封锁,来抗调试。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程[/size][/font]
[font=宋体][size=10.5pt]添加一个[/size][/font][size=10.5pt]TEXT1 [/size][font=宋体][size=10.5pt]添加一个[/size][/font][size=10.5pt]COMMAND1 [/size][font=宋体][size=10.5pt]添加一个[/size][/font][size=10.5pt]TIMER1[/size]
[font=宋体][size=10.5pt]选择[/size][/font][size=10.5pt]FORM1[/size][font=宋体][size=10.5pt]的[/size][/font][size=10.5pt]BORDERSTYLE[/size][font=宋体][size=10.5pt]为[/size][/font][size=10.5pt]NONE[/size][font=宋体][size=10.5pt],然后在[/size][/font][size=10.5pt]FORM1[/size][font=宋体][size=10.5pt]上画一个关闭叉叉,用[/size][/font][size=10.5pt]IMAGE1[/size][font=宋体][size=10.5pt]来覆盖,事件放在[/size][/font][size=10.5pt]IMAGE1 CLICK[/size][font=宋体][size=10.5pt]事件里来模拟关闭按钮。[/size][/font][size=10.5pt][/size]
[size=10.5pt]TIMER1[/size][font=宋体][size=10.5pt]的频率设置为[/size][/font][size=10.5pt]100[/size][font=宋体][size=10.5pt]微秒,默认打开。调节[/size][/font][size=10.5pt]FORM1[/size][font=宋体][size=10.5pt]的默认启动位置为屏幕中心。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在通用部分添加:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateType RECT[/size]
[size=10.5pt]
left
As Long[/size]
[size=10.5pt]
top
As Long[/size]
[size=10.5pt]
right
As Long[/size]
[size=10.5pt]
bottom
As Long[/size]
[size=10.5pt]
End Type[/size]
[size=10.5pt]
Private Type POINT[/size]
[size=10.5pt]
x
As Long[/size]
[size=10.5pt]
y
As Long[/size]
[size=10.5pt]
End Type[/size]
[size=10.5pt]
Private Declare Sub ClipCursor Lib"user32" (lpRect As Any)[/size]
[size=10.5pt]
Private Declare Sub GetClientRect Lib"user32" (ByVal hWnd As Long, lpRect As RECT)[/size]
[size=10.5pt]
Private Declare Sub ClientToScreen Lib"user32" (ByVal hWnd As Long, lpPoint As POINT)[/size]
[size=10.5pt]
Private Declare Sub OffsetRect Lib"user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long)[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]下面写成过程[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Suoding()[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]锁定鼠标范围的过程[/size][/font][size=10.5pt][/size]
[size=10.5pt]Dimclient
As RECT[/size]
[size=10.5pt]Dimupperleft
As POINT[/size]
[size=10.5pt]GetClientRectMe.hWnd, client[/size]
[size=10.5pt]upperleft.x= client.left[/size]
[size=10.5pt]upperleft.y= client.top[/size]
[size=10.5pt]ClientToScreenMe.hWnd, upperleft[/size]
[size=10.5pt]OffsetRectclient, upperleft.x, upperleft.y[/size]
[size=10.5pt]ClipCursorclient[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]其他调用和算法:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Timer1_Timer()[/size]
[size=10.5pt]Suoding[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]每过[/size][/font][size=10.5pt]100[/size][font=宋体][size=10.5pt]微秒锁定一次,防止鼠标脱离[/size][/font][size=10.5pt][/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]设计思路是程序一起动就自动锁定鼠标不离开程序范围,除非结束掉程序,或者完成注册为止[/size][/font][size=10.5pt][/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Image1_Click()[/size]
[size=10.5pt]'[/size][font=宋体][size=10.5pt]自定义关闭按钮,画出来的,哈哈哈[/size][/font][size=10.5pt][/size]
[size=10.5pt]End[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Command1_Click()[/size]
[size=10.5pt]IfVal(Text1.Text) = 123456 Then[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]恭喜你[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]注册成功[/size][/font][size=10.5pt]",, "[/size][font=宋体][size=10.5pt]恭喜[/size][/font][size=10.5pt]": End[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]注册码错误哦[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]错误[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]可见程序调用计时器每[/size][/font][size=10.5pt]100[/size][font=宋体][size=10.5pt]微秒锁定一次鼠标范围到我们程序自己身上,一启动程序的时候就发挥作用,使得破解者来不及使用其他程序,包括调试器。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]注册成功或者单击关闭叉叉后就可以退出程序,具有一定的实际意义,要去用户注册时候不能动别的程序,直接注册或者就别注册。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]破解者很可能会关闭我们的计时器,或者修改程序以躲避这个凡人的锁定,所以我们可以配合[/size][/font][size=10.5pt]CRC32[/size][font=宋体][size=10.5pt]等自校验或者其他抗调试手段结合在一起,使得这个锁定不容易被去除。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]效果还可以。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]请看图效:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image062.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第十八、[/size][/font][size=10.5pt]GetStartupInfo[/size][font=宋体][size=10.5pt]反调试[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]今天看了看前人的经典,发现可以在[/size][/font][size=10.5pt]Vb[/size][font=宋体][size=10.5pt]里实现[/size][/font][size=10.5pt]GetStartupInfo[/size][font=宋体][size=10.5pt]反调试[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]打开[/size][/font][size=10.5pt]VB6.0 [/size][font=宋体][size=10.5pt]新建工程[/size][/font]
[font=宋体][size=10.5pt]添加[/size][/font][size=10.5pt]COMMAND1[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]在通用里:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateDeclare Sub GetStartupInfo Lib "kernel32" Alias"GetStartupInfoA" (lpStartupInfo As STARTUPINFO)[/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateType STARTUPINFO '(createprocess)[/size]
[size=10.5pt]

cb AsLong[/size]
[size=10.5pt]
lpReserved As Long[/size]
[size=10.5pt]
lpDesktop As Long[/size]
[size=10.5pt]
lpTitle As Long[/size]
[size=10.5pt]
dwX As Long[/size]
[size=10.5pt]
dwY As Long[/size]
[size=10.5pt]
dwXSize As Long[/size]
[size=10.5pt]
dwYSize As Long[/size]
[size=10.5pt]
dwXCountChars As Long[/size]
[size=10.5pt]
dwYCountChars As Long[/size]
[size=10.5pt]
dwFillAttribute As Long[/size]
[size=10.5pt]
dwFlags As Long[/size]
[size=10.5pt]
wShowWindow As Integer[/size]
[size=10.5pt]
cbReserved2 As Integer[/size]
[size=10.5pt]
lpReserved2 As Long[/size]
[size=10.5pt]
hStdInput As Long[/size]
[size=10.5pt]
hStdOutput As Long[/size]
[size=10.5pt]
hStdError As Long[/size]
[size=10.5pt]End Type[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]编写函数:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateFunction StartAnti() As Boolean[/size]
[size=10.5pt]DimHuanjing As STARTUPINFO[/size]
[size=10.5pt]GetStartupInfoHuanjing[/size]
[size=10.5pt]IfHuanjing.dwX <> 0 Or Huanjing.dwY <> 0 Or Huanjing.dwXCountChars<> 0 Or Huanjing.dwYCountChars <> 0 Or Huanjing.dwFillAttribute<> 0 Or Huanjing.dwXSize <> 0 Or Huanjing.dwYSize <> 0 Then[/size]
[size=10.5pt]StartAnti= True[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]StartAnti= False[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]EndFunction[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]调用如下:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码起始线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Command1_Click()[/size]
[size=10.5pt]IfStartAnti = True Then[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]发现调试器[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]请关闭[/size][/font][size=10.5pt]",, "[/size][font=宋体][size=10.5pt]警告[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]没有发现调试器[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]通过[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[size=10.5pt]PrivateSub Form_Load()[/size]
[size=10.5pt]IfStartAnti = True Then[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]发现调试器[/size][/font][size=10.5pt],[/size][font=宋体][size=10.5pt]请关闭[/size][/font][size=10.5pt]",, "[/size][font=宋体][size=10.5pt]警告[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]Else[/size]
[size=10.5pt]MsgBox"[/size][font=宋体][size=10.5pt]没有发现调试器[/size][/font][size=10.5pt]", , "[/size][font=宋体][size=10.5pt]通过[/size][/font][size=10.5pt]"[/size]
[size=10.5pt]End If[/size]
[size=10.5pt]End Sub[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]我是代码终止线————————————————————————————————[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]效果如图(效率很高)[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt][img=553,415]file:///C:/Users/Woodu/AppData/Local/Temp/msohtmlclip1/02/clip_image064.jpg[/img][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]好累,第三章第一讲到此结束,我们回顾下,主要讲了以下几个内容:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=&quot][size=10.5pt]1、
[/size][/font][font=宋体][size=10.5pt]检测父进程反[/size][/font][font=&quot][size=10.5pt]RING3[/size][/font][font=宋体][size=10.5pt]调试器[/size][/font][font=&quot][size=10.5pt][/size][/font]
[font=&quot][size=10.5pt]2、
[/size][/font][font=&quot][size=10.5pt]FindWindow[/size][/font][font=宋体][size=10.5pt]检测敏感窗口[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]3、
[/size][/font][size=10.5pt]EnumChildWindows[/size][font=宋体][size=10.5pt]枚举所有窗体,检测敏感字符[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]4、
[/size][/font][font=宋体][size=10.5pt]检测进程名字来排雷[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]5、
[/size][/font][font=宋体][size=10.5pt]利用[/size][/font][font=&quot][size=10.5pt]IsDebuggerPresent[/size][/font][font=宋体][size=10.5pt]检测调试器[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]6、
[/size][/font][font=宋体][size=10.5pt]加密字符串,错误提示诱导陷阱[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]7、
[/size][/font][font=宋体][size=10.5pt]利用[/size][/font][font=&quot][size=10.5pt]SEH[/size][/font][font=宋体][size=10.5pt]进行反跟踪[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]8、
[/size][/font][font=宋体][size=10.5pt]加[/size][/font][size=10.5pt]VM[/size][font=宋体][size=10.5pt]或者[/size][/font][size=10.5pt]P-CODE[/size][font=宋体][size=10.5pt]编译[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]9、
[/size][/font][font=宋体][size=10.5pt]直接反汇编修改代码(破解者用的招数,我们也可以用来防守)[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]10、
[/size][/font][font=宋体][size=10.5pt]隐蔽性设计[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]11、
[/size][/font][font=宋体][size=10.5pt]步长、时值反调试(包含启动时间检测)[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]12、
[/size][/font][font=宋体][size=10.5pt]检测内存分配大小反调试[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]13、
[/size][/font][font=宋体][size=10.5pt]窗口置顶反调试[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]14、
[/size][/font][font=宋体][size=10.5pt]检测按键,一般是[/size][/font][size=10.5pt]F2[/size][font=宋体][size=10.5pt](断点)、[/size][/font][size=10.5pt]F7[/size][font=宋体][size=10.5pt](单步步进)、[/size][/font][size=10.5pt]F8[/size][font=宋体][size=10.5pt](逐过程步过)、[/size][/font][size=10.5pt]F9[/size][font=宋体][size=10.5pt](运行)[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]15、
[/size][/font][font=宋体][size=10.5pt]检测前台窗口反调试[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]16、
[/size][/font][size=10.5pt]SeDebugPrivilege[/size][font=宋体][size=10.5pt]检测调试器[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]17、
[/size][/font][font=宋体][size=10.5pt]关键部分算法的时候锁定鼠标干扰调试分析[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]18、
[/size][/font][size=10.5pt]GetStartupInfo[/size][font=宋体][size=10.5pt]反调试[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]其实方法多种多样,远不只这些,奈何我触及加密解密时间尚短,经验太少,水平太差,暂时无法详细给大家演示其他的反调试手段,大家可以看下《加密解密第三版》,对你也会有启发。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这篇文章写了几天,主要是白天太忙,金工实习,根本没时间写文章,发表得有些晚。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]第三章
[/size][/font][font=宋体][size=10.5pt]第二讲[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[align=center][align=center][font=宋体][size=10.5pt]防静态反汇编分析[/size][/font][size=10.5pt][/size][/align][/align][size=10.5pt] [/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]这一讲将是简短至极,相信大家也累了,我也写不了多少。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[size=10.5pt]VB[/size][font=宋体][size=10.5pt]防静态反汇编,有以下途径:[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=&quot][size=10.5pt]1、
[/size][/font][font=宋体][size=10.5pt]修改程序头,使得一些识别[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]的反汇编工具无法识别[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]2、
[/size][/font][font=宋体][size=10.5pt]加壳,最好是保护壳中的猛壳,可以很有效得保护你的资源和代码[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]3、
[/size][/font][font=宋体][size=10.5pt]虚拟机保护关键过程和代码[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]4、
[/size][/font][font=宋体][size=10.5pt]将程序作为子程序当作数据形式储存在母程序里(借鸡生蛋),事先先经过[/size][/font][size=10.5pt]XOR[/size][font=宋体][size=10.5pt]等的加密,运行母程序的时候[/size][/font][size=10.5pt]XOR[/size][font=宋体][size=10.5pt]逆算回子程序数据,然后释放到某个地方执行。[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]5、
[/size][/font][size=10.5pt]P-CODE[/size][font=宋体][size=10.5pt]方式编译,然后破坏程序开头等位置,也有一定的效果[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]6、
[/size][/font][font=宋体][size=10.5pt]大量使用假信息,迷惑静态分析的破解者。[/size][/font][size=10.5pt][/size]
[font=&quot][size=10.5pt]7、
[/size][/font][font=宋体][size=10.5pt]按照高人的话说,似乎可以依靠[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]内联汇编来添加花指令来抗静态分析。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]应该还有更多方法,我知道的太少了,[/size][/font][size=10.5pt]^_^[/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]好了,《[/size][/font][b][size=10.5pt][b]VB [/b][/size][/b][b][font=宋体][size=10.5pt][b]共享软件防破解设计技术初探(三)》就写到这里吧,精力差不多耗尽了。[/b][/size][/font][/b][b][size=10.5pt][b][/b][/size][/b]
[b][font=宋体][size=10.5pt][b]下一篇《[/b][/size][/font][/b][b][size=10.5pt][b]VB [/b][/size][/b][b][font=宋体][size=10.5pt][b]共享软件防破解设计技术初探(四)》我们将讲述:[/b][/size][/font][/b][font=宋体][size=10.5pt]注册码系统(算法部分,核心内容)和加壳防脱壳,估计那篇会比较短些。[/size][/font][size=10.5pt][/size]
[size=10.5pt] [/size]
[font=宋体][size=10.5pt]还是老规矩,若是有时间,有精力,有空,有能力,我将继续写下去,尽力完成整个系列,给[/size][/font][size=10.5pt]VB[/size][font=宋体][size=10.5pt]软件的防破解领域加入催化剂。[/size][/font][size=10.5pt][/size]
[b][size=14.0pt] [/size][/b]

[align=center][align=center][font=宋体][size=10.5pt]作者:爱琴海[/size][/font][size=10.5pt][SCG] 2008/09/10[/size][font=宋体][size=10.5pt](转载请保留该信息)[/size][/font][size=10.5pt][/size][/align][/align]

页: [1]

Powered by Discuz! Archiver 6.1.0F  © 2001-2007 Comsenz Inc.