VB 共享软件防破解设计技术初探三文档格式.docx
《VB 共享软件防破解设计技术初探三文档格式.docx》由会员分享,可在线阅读,更多相关《VB 共享软件防破解设计技术初探三文档格式.docx(83页珍藏版)》请在冰点文库上搜索。
![VB 共享软件防破解设计技术初探三文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/4e3a4b86-0028-40bd-ab43-802ade08fe07/4e3a4b86-0028-40bd-ab43-802ade08fe071.gif)
OnErrorGoToTakeError
DimLujingAsString
Lujing="
C:
\WINDOWS\system32\缓存.exe"
'
定义缓存路径
IfDir(Lujing)="
"
Then
检测子体是否已经存在
不是的话就直接释放一个即可
DimShuzu()AsByte
定义一个数组储存数据
Shuzu()=LoadResData(101,"
CUSTOM"
)
加载数据,101代号指的就是我们添加的EXE子体
OpenLujingForBinaryAs#1
定义一个缓存路径
Put#1,,Shuzu()
开始写入
Close#1
关闭通道
Else
KillLujing
发现已经存在就删除它,然后就重新创建;
目的是为了防止有人故意同名替换
EndIf
ShellLujing,vbNormalFocus
释放好后就SHELL使其运行,接下去就结束掉自己
End
TakeError:
一般发生错误是因为子体正在运行,无法删除或者覆盖,或者是因为OD的HIDEOD插件引起SHELL错误
MsgBox"
请检查我是否正在运行?
或者,是因为调试器?
请检查"
,"
发现问题了"
EndSub
我是代码终止线————————————————————————————————
调用的话,在FORM的LOAD事件里,或者其他启动事件里即可,如下:
PrivateSubForm_Load()
Shifang
看看效果吧!
正常运行,跟运行一个程序感觉上没有什么差别
如果加载OD调试器的话,如果OD刚好加载HIDEOD插件的话,就会提示错误,发现调试器:
如果关闭HIDEOD插件,就会自动借鸡生蛋,使调试器无法加载正确的子体程序
需要注意一点,只要够小心的人,一定会发现真正的程序所在,所以子体程序最好加上自删除代码,也就是检测到UNLOAD事件后,自动删除自己,或者调用批处理,隐藏删除自己。
我碰到过的一些用VB写的外挂也就是用这种技术来逃避调试器的。
这种技术就讲解到这里,我们开始新的篇章喽
第三篇我将具体介绍1、VB反调试反跟踪2、防静态反汇编分析
设计加密解密不久,能力有限,见识短浅,请各位高手见谅,有错误和不足之处敬请原谅,并请你阐述你自己的见解,共同完成《VB共享软件防破解设计技术初探》系列文章,您的参与和支持是我的荣幸和骄傲。
这篇开篇前我把自己想到的VB程序防破解设计图展示下,看看大家想到了什么?
自由发挥
我心中总有个声音:
你设计的只是针对技术层面,无法真的长久的保证你的软件不被破解
实际生活中,我们需要八卦一样的“阴阳鱼”,一切造化的根本。
(我在故弄玄虚吧?
一个是阳刚的“法律”保障,一个是怀柔的“道义”安抚。
在这里引述一篇文章里的片段,具体作者是谁,大家自己查
原文是《如何让你的共享软件在国内赚到每月超过万元》
引用从这里开始————————————————————————————————
四、面对盗版不惊慌
当用户找到了你的软件,下载安装并试用之后,发现使用简单,符合自己的需求,很想要,如果你是用户,显然,你就会去找盗版,如何找?
两条途径吗
第一:
到搜索引擎中去搜索某某软件后面加一个破解,注册机之类的。
结果呢?
人家找到了,也就不会买了。
另外,还会去盗版碟市场去找,看看有没有破解版的碟。
呵呵,第一种情况好对付,你不是在搜索引擎中找吗?
作为作者,你也可以用你的正版软件冒充盗版软件到处去发布呀,比如:
你可以发布某某软件的破解版,让你的假破解版充斥了整个搜索引擎的结果。
当用户下载了10个假破解之后,也自然会想到,这个软件没有破解版了。
哦,对了,如果有真破解出现在搜索结果的前几位,也不用着急,首先,打电话给你所在地的公证处,花300元,把你所找到的页面做个公证。
(我保证你这300元能够赚回来),然后,想办法找到这个网站的站长,不要管这个网站是个人的还是企业的。
联系这个站长,把公证书的复印件,你软件版权的复印件传真给他,限定他在7日内与你进行协商解决。
过期,你将在你所在地的人民法院起诉(诉讼费50元),什么?
诉状不会写?
找我呀,100元,帮你写一份。
如何计算赔偿金额?
哦,很简单,一般下载站都有提供下载数统计的,用下载量乘以你的软件的价格就是他该赔的金额,(呵呵,算起来很吓人的)。
如果你很忙,找个律师是值得的。
第二、如果在盗版碟市场出现了你的软件,那我告诉你,是喜也是忧,喜的是,你的软件很有名吗,忧的是,只有升级,做更好的软件了。
辛苦你了。
为了避免这种情况的出现,在你的软件中,加上网上认证的加密办法是可行的。
加密点千万不要搞在一个地方,另外,为了防止跟踪破解,一个简单的办法,就是认证通过之后,不要弹出对话框之类的,默默的就让用户开始用吧。
千万不要弹出什么:
恭喜您,您注册成功了,恭喜您,您登陆成功了的对话框。
人家找你的加密点,一跟踪这个对话框就行了。
呵呵,这只是防破解的小技巧。
其他的防破解方法,你可以查阅相关资料。
一句话,与破解做斗争,不该妥协。
哪怕花费比所得还要高,你也要与破解盗版做斗争,如同抗日一样,和平时期,也要抗日。
要用抗日的精神来抵抗破解盗版。
什么?
你的软件也是用的盗版VC写的?
这也没关系,那是另外一回事情,微软没找你麻烦,那是微软的事。
并不妨碍你找破解者的麻烦。
总不能因为唐朝的时候咋们侵略过别国,就不抵抗日本侵略了吧?
引用到此结束—————————————————————————————————
文中作者告诉我们的是:
1、定时关注互联网搜索引擎关于你的软件破解信息
2、到盗版碟市场看看有没有你的软件破解注册版
3、冒充破解版在网上大量发布,覆盖大部分搜索出来的破解信息资源
4、利用法律武器,作公证、取证,警告发布破解信息的站点或者论坛或者其他发布者
5、聘请律师,委托代办,发律师信,甚至对簿公堂。
6、发现破解版大量存在,那么只能更新软件,加强加密强度。
(如硬件加密狗,反正羊毛出在羊身上…..)
7、隐藏注册结果信息,让用户用着吧,让破解者徘徊迷路吧
8、要用抗日的精神来抵抗破解盗版
相信作者能靠共享软件月入万金,在这里由衷的恭喜他发财。
这个讲的就是我要说的法律武器,阳刚十足,捍卫自己的利益。
但有时,刚性太强,反而容易折断,高碳钢硬度很大,但是脆;
低碳钢硬度比较小,但是柔韧。
这里重点聊聊怀柔“道义”,你的软件的质量,软件的功能要对得起你收的注册费,这个就是道义;
你的售后服务,服务的态度和服务水平要对得起你的承诺,这个就是道义;
你对未注册版的限制要合理,不要给用户带来很不良好的体验和心理感觉,这个就是道义;
不能强迫用户注册,动不动就跳到注册网页去了,这个就是道义;
你对某些支持过你,给你提好意见的用户,免费送注册码,这个也是道义;
定期给某些特定用户群发放免费注册码,或者在特定的时候发布特定的纪念版免费回馈社会,这个也是道义;
你的防破解设计里不应该有刺激破解者的语言和指令,如关机、格盘、删除系统文件、摧毁数据等,这个更是道义了。
有这样的软件,它在收取少量的注册费后,将部分收入以公开名义捐赠给四川灾区,这样的软件在道义上他是高尚的,在道义上便已经让很多有良知的高手罢手了。
破解者破解了它,发布了它,他将遭到道义上的谴责和唾弃。
《道德经》讲“道可道非常道”,这“道”便是一切,道义也是“道”的范畴。
你的软件连道义都没有,先不说会不会激怒破解者和一些不搞破解的逆向分析师来破解你的软件(无他,只因不爽)单单说有没有用户用你的破解版都还是个问题呢。
比如说:
江民炸弹
引用从此开始—————————————————————————————————
简介
1997年6月24日王江民先生在其主页上发布了kv300l++版,内含逻辑炸弹。
凡是在mk300v4制作的仿真盘(盗版盘)上执行kv300l++的用户硬盘数据均被破坏,
同时硬盘被锁,软硬盘皆不能启动。
Kv300逻辑炸弹可以造成电脑软硬盘都不能启动的现象,
当时在电脑界引起轰动。
这是用常规原理不能解释的现象。
kv300逻辑炸弹表现
1.先破坏文件分配表,然后修改分区表造成硬盘被锁。
2.不做任何备份
3.没有任何提示
4.在特定条件下激发(盗版盘)
5.王江民始终没有公开提供恢复程序;
6.如果用一般常用的修复磁盘工具,如NORTON,会造成不可逆转的损失;
7.对其的恢复类似于cih破坏数据的恢复,因为需要重建分区表。
8.在win95环境下执行同样会造成文件分配表被破坏,数据损失。
处理
1997年7月23日,国内5家反病毒软件公司(以下简称五厂商)在北京联合举行新闻发布会,一起谴责国内另一家著名的反病毒软件公司—北京江民新技术有限责任公司(以下简称江民公司)。
在发布会上,五厂商向多家新闻机构发放了一份“联合声明”,称江民公司6月下旬发布的KV300L++版反病毒软件(网络下载版)(以下简称KV300,本文无特殊说明,所指的均是这一特定下载版本)中含有“逻辑炸弹”,“在特定条件下对计算机实施破坏,其结果与某些计算机病毒的破坏作用相似……”—7月24日,江民公司对五厂商的“联合声明”做出了强烈反应,认为这时“不正当的侵权行为”,并多次在各专业计算机所刊上登载“严正声明”,江民公司对此的解释是:
江民公司并未在KV300中安放任何破坏性程序。
五厂商所称的“逻辑炸弹”,其实是江民公司为打击日益猖獗的盗版软件行为而在软件中编制的“逻辑锁”,这一“逻辑锁”首先不可能对任何购买正版产品的用户造成任何影和损失,其次对部分盗版用户也只是起到暂时锁住机器的作用。
江民公司特别强调,KV300中的“逻辑锁”与病毒没有关系,因为病毒是具有自我复制和传染性的破坏性程序,而“逻辑锁”却不会对用户数据造成任何伤害1997年9月8日,公安部门认定kv300L++事件违反计算机安全保护条例之23条,属于故意输入有害数据,危害计算机信息系统安全的行为,对其做出罚款3000元的决定
关于KV300'
逻辑锁'
的看法
王江民口口声声说KV300L++里面没有逻辑炸弹,只有所谓'
主动式逻辑锁'
.似乎这样讲就不需要承担责任了!
的确,在中国有关计算机安全和保护软件消费者的法律还不健全,王江民的类似行为暂时还无法受到法律的制裁.但我们需要进行这方面的讨论.以了解我们消费者的权利和可以采取的措施.
从道义上和法律意义上讲,王江民的这种做法已经侵犯了公民的权利.王江民认为盗版应视同小偷,可以用锁把他锁起来.但是,我们应该清楚,中国法律只付予了警察等执法机关有执法的权利,你王江民有什么权利执法?
你用逻辑锁把你的软件锁起来,是你的权利.但王江民没有权利锁别人的门!
即使,经过国家有关部门的批准,王江民有这样的执法权.王江民也必须经过广告等形式公之于众.
从计算机安全角度讲.王江民至今没能确认正版用户不会受到意外损害,他也没有通过适当渠道告知正版用户避免意外损害的方法,他只是说明受到损害时由他解锁.这使KV300的正版用户会因此存在资料失密和损失的危险.对此,如何赔偿?
?
由于,KV300内含有可能危害消费者权利和计算机安全的'
.在目前,国家没有相关法律的情况下.我们消费者有权利相互告知并通知KV300的潜在用户,选择其他的产品,放弃KV300.
就像坛子里很多人讲的一样“先别急着想着防破解,要把软件功能和质量放在第一位”
呵呵,还好,扯得不是很远,可以把大家的思路引向更广阔的防破解设计上去,我很荣幸。
回到技术层面,下面我们开始讲解:
1、VB反调试反跟踪2、防静态反汇编分析
第三章第一讲
备注:
这一讲将是比较长的,请准备好开水茶叶或者咖啡。
VB的反调试设计
这里要讲解的VB反调试有以下几种:
1、检测父进程反RING3调试器
2、FindWindow检测敏感窗口
3、EnumChildWindows枚举所有窗体,检测敏感字符
4、检测进程名字来排雷
5、利用IsDebuggerPresent检测调试器
6、加密字符串,错误提示诱导陷阱
7、利用SEH进行反跟踪
8、加VM或者P-CODE编译
9、直接反汇编修改代码(破解者用的招数,我们也可以用来防守)
10、隐蔽性设计
11、步长、时值反调试(包含启动时间检测)
12、检测内存分配大小反调试
13、窗口置顶反调试
14、检测按键,一般是F2(断点)、F7(单步步进)、F8(逐过程步过)、F9(运行)
15、检测前台窗口反调试
16、SeDebugPrivilege检测调试器
17、关键部分算法的时候锁定鼠标干扰调试分析
18、GetStartupInfo反调试
其实方法很多很多,建议大家购买《加密与解密第三版》里面有些很好的方法,奈何能力有限,经验不足,我还在琢磨中……与君共勉……
第一、检测父进程反RING3调试器
简要介绍下原理:
一般用户都是在WINDOWS桌面下打开我们写的程序,而不是在什么调试器下的,也就是说,调用我们程序的是explorer.exe程序,而不是A.exe也不是B.exe,它们都对应有个ID,我们只需要检测其父亲ID跟explorer.exe的ID是否一致,就说明是否正常打开还是被调试了。
提示,OD的HIDEOD插件里,如果挑上“Process32NEXT”的话,此方法无效。
请打开VB6.0新建工程
在窗体通用里,复制以下API和其他参数声明
我是代码启始线————————————————————————————————
PrivateDeclareFunctionCreateToolhelp32SnapshotLib"
kernel32"
(ByValdwFlagsAsLong,ByValth32ProcessIDAsLong)AsLong
PrivateDeclareFunctionProcess32FirstLib"
(ByValhSnapShotAsLong,lppeAsPROCESSENTRY32)AsLong
PrivateDeclareFunctionProcess32NextLib"
PrivateDeclareFunctionCloseHandleLib"
(ByValhObjectAsLong)AsLong
PrivateDeclareFunctionOpenProcessLib"
(ByValdwDesiredAccessAsLong,ByValblnheritHandleAsLong,ByValdwAppProcessIdAsLong)AsLong
PrivateDeclareFunctionTerminateProcessLib"
(ByValhProcessAsLong,ByValuExitCodeAsLong)AsLong
ConstMAX_PATHAsInteger=260
ConstTH32CS_SNAPPROCESSAsLong=2&
PrivateTypePROCESSENTRY32
dwSizeAsLong
cntUsageAsLong
th32ProcessIDAsLong
th32DefaultHeapIDAsLong
th32ModuleIDAsLong
cntThreadsAsLong
th32ParentProcessIDAsLong
pcPriClassBaseAsLong
dwFlagsAsLong
szExeFileAsString*1024
EndType
然后我们在窗体里写个SUB过程,以后直接调用即可。
我是代码起始线————————————————————————————————
PrivateSubFujincheng()
这个过程是检测父进程的父进程是否是EXPLORE的父进程
DimProcessAsPROCESSENTRY32
DimhSnapShotAsLong
DimXNNAsLong
DimflagAsBoolean
DimmNameAsString
DimiAsInteger
DimpidAsLong,explorerAsLong'
注意这2个变量就用来存放2个ID
hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0&
)'
建立进程快照
搜索explorer.exe进程,并获得其ID
IfhSnapShotThen
Process.dwSize=1060
If(Process32First(hSnapShot,Process))Then'
遍历第一个进程,获得PROCESSENTRY32结构
Do
i=InStr(1,Process.szExeFile,Chr(0))'
获得映像名称
mName=LCase(Left(Process.szExeFile,i-1))'
并转换成小写
IfmName="
explorer.exe"
Then'
是不是explorer.exe
explorer=Process.th32ProcessID
ElseIfmName=LCase(App.EXEName&
"
.exe"
)Then'
是不是自己
pid=Process.th32ParentProcessID'
获得父进程ID
Else
flag=False
EndIf
LoopUntil(Process32Next(hSnapShot,Process)<
1)'
遍历所有进程直到返回值为False
XNN=CloseHandle(hSnapShot)
DimOpenitAsLong
Openit=OpenProcess(1&
-1&
pid)
Ifpid<
>
explorerThenMsgBox"
发现父进程调试"
警告"
:
TerminateProcessOpenit,0
如果发现父进程不对,就结束掉父进程,对使用HIDEOD中的Process32NEXT的OD无效
我们设计的代码先找出explorer.exe进程的ID号,然后找出本程序的父进程,两者对比,发现不一样就说明很有可能被调试,那么就用OpenProcess打开该进程,用TerminateProcess结束掉该可以进程。
使用方法如下:
Fujincheng
效果如图:
说明该方法对待通用RING3级调试器应该都是有效果的
第二、FindWindow检测敏感窗口
原理简介:
一般程序都有标题栏,也就是程序最上面的那一栏,该栏显示的就是FindWindow可以查到的字符。
我们以此来检测黑名单即可简单检测到调试,继而作出响应。
在窗体通用里,复制以下API声明
PrivateDeclareFunctionFINDWINDOWLib"
user32"
Alias"
FindWindowA"
(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong
然后在窗体代码处,我们写一个过程即可实现调用:
PrivateSubGuanbiFindwindow(MingziAsString)
winHwnd=FINDWINDOW(vbNullString,Mingzi)
获得窗口句柄
IfwinHwnd<
0Then
AppActivateMingzi
激活窗体为活动
SendKeys"
%{f4}"
True
ALT+F4结束掉
%y"