📄 no_crack_delphiapp.htm
字号:
<p><span class="font105">使用部分代码作为奇妙的数字表。<br>
(更适合评论部分)如果你像多数的破解者或喜欢用SOFT-ICE(一个流行的破解工具)改东西,你无法想象这会有多恼人, </span></p>
<p><span class="font105">和破解者斗智<br>
这部分很有趣:-) 贴上连续的NOP,就像你在做自我代码修改(天啊,什么乱七八糟的,NOP?哈!自我代码修改!白痴会花三年去捉摸那些本来该是什么东西)。混乱的注释代码。把代码分成小块,把它们遍布在可执行代码中,在它们中间使用(最好是有条件的)跳转。</span></p>
<p><span class="font105">提早发现SoftIce.。<br>
现在搞垮计算机,你可以搞垮奔腾或奔腾MMX计算机甚至不需要VXD,可以用操作码: F0 0F C7 C8 (非法的带锁定前缀的 cmpxchg8b 指令).
处此之外, 我们必须采取真正的措施:使用VXD把CPU带出保护模式。Windows 不喜欢那样,奇迹?另一方面,不要浪费太多的时间去写破坏反汇编程序或调试的代码。那没用,相信我,有人写了那些东西,另一些人立刻会有办法绕过它,所以,把你的兴趣转移到更重要的地方——那些容易且很快见效的措施,就像上面的技巧。<br>
--------------------------------------------------------------------------------<br>
针对DELPHI控件的破解<br>
--------------------------------------------------------------------------------<br>
让我们了解一些关于Borland公司新开发工具的内核吧。这些知识会使我们加快破解的速度,当然也使那些共享软件程序员更小心的使用Delphi,轻易的把他们的“秘密”暴露在那些好奇的目光下。<br>
VCL是指Visual Component Library(可视化组件库),它近来被Borland的可视化编程工具所使用,比如Delphi和C++Builder。<br>
这些环境使用特有的资源格式,在Resource Workshop(Borland编辑资源的一个工具)中显示为“RCDATA'”。这些资源中含有Delphi所谓的窗体(Forms),窗体是程序的窗口(Windows)。所有对窗口的设计的信息都包含内,当一个典型的Delphi程序开始运行时,其初始化代码建立这种窗体,并从资源中读取所需要的信息。有时,这种读取会被推迟——不常用的窗体在需要时才被建立和删除。这样的机制是Delphi的最大优势也是其最大的缺点。它大大提高了程序设计的速度,但是对于整个应用程序,它减慢了程序被调用时的速度</span></p>
<p><span class="font105">这部分中真正有趣的是:例程(被用来响应用户界面的窗体的元素)的地址是按名字邦定的。所以只要知道这些名字,我们就可以知道所需要的地址。<br>
如果你曾经破解过我的Delphi程序,你一定对那些烦琐的库之间的调用,比如API调用断点(breakpoint)和类似“do xx”的代码。<br>
[讨论一个十分有名的用Delphi写的应用程序] 就像你将见到的那样,我彻底的破解了它,而且十分轻松。我第一次安装以后一个星期后,我发现了一条令人厌恶的信息——“你的测试已经过期”。<br>
首先要做的是使用资源或窗体探测(SPY)工具收集有关目标EXE文件的有关信息。你也许会想到去查看TVALIDATORDLG——很明显,用户名和注册码是由此输入的。但是你会发现那只是一个简单的对话盒,真正的工作是由其调用者TSPLASHFORM来完成的。这是个恼人的窗口,它在程序关闭、按“关于”按钮和程序开始部分不断出现。<br>
你可以选择TsplashForm并且以文本格式观察之。关于按钮(Button)和标签(Label)的许多信息都将被很清楚的显示。让我们注意以下部分(接近最后):
</span></p>
<p><span class="font105">object RegButton: TButton<br>
Left = 200<br>
Top = 176<br>
Width = 97<br>
Height = 25<br>
Caption = 'Register'<br>
TabOrder = 1<br>
OnClick = RegButtonClick<br>
end</span></p>
<p><span class="font105">这是什么?这是带有“注册”标题的按钮。你可以看到它的大小,位置......和一个有启发性的名字——“OnClick”。
“OnClick”告诉我们当用户按注册按钮时所调用的例程,当我们有了名字(Name),我们可以搜索例程的地址。这是因为例程是和按钮以名字(Name)邦定的。<br>
使用一个十六进制编辑器观察"RegButtonClick",我发现了两次,第二个是资源本身,第一个是在地址表(Address Table)中的。</span></p>
<p><span class="font105">000A4990 ____ ____ ____ BC57 4A00 0E52 6567 4275 ______.WJ..RegBu</span></p>
<p><span class="font105">000A49A0 7474 6F6E 436C 6963 6B__ ____ ____ ____ ttonClick_______</span></p>
<p><span class="font105">现在,观察名字(Name)前那写神奇的数字,有一个字节('0E')指出了"RegButtonClick"
的长度(14 个字符)。而且,在此之前有其地址:004ABC57。</span></p>
<p><span class="font105">有的反汇编程序会以为文件太长,并且不能正确反汇编这部分——然而,使用特殊的工具,我们可以在此停止,对了,就停在我们按按钮的部分。<br>
这些会使你发现一个调用(CALL)。跟踪之,你会在44ECC8发现一个“标准栈框架(standard stack frame)”:</span></p>
<p><span class="font105">0044ECC8 55 push ebp<br>
0044ECC9 8BEC mov ebp, esp<br>
这是一种程序员所写的,在高级例程开始部分所需要的东西。我们已经避开了一长串由Windows通知(Notification)所产生的VCL库调用,来到了正确的位置。<br>
在此,你可以方便的用设置断点的方法来测试一些调用——你会发现它们是用来显示要求输入用户名和口令的对话盒。然后,注册码是由用户名和用户的输入比较所产生的。你可以输入你所选择的用户名,和任何东西作为注册码,在BPX到44ED69之后,一个调用一个例程用来比较两个字符串。D
EDX会显示你输入(冒牌)的注册码,EAX会显示正确的注册码,简单吧?初学者只需10分钟就可以完成,<br>
如何避免被类似的程序破解?<br>
阅读我以上的技巧。最基本的是不要用由双击按钮或有属性监视器(Object inspector.)生成默认的方法,在程序的其它部分写代码,最好是在另外的模板中,然后用类似以下的代码与按钮关联:</span></p>
<p><span class="font105">RegButton.OnClick := RegButtonClick;</span></p>
<p><span class="font105">当然你需要在窗体建立时(被调用前)执行这段代码,最好是被一些无关的例程所调用,当然这远远不能防止你的程序被破解,但至少不会像你刚才看到的那样容易。</span></p>
<p><span class="font105">--------------------------------------------------------------------------------<br>
关于注册码的提示<br>
(如果你无法避免它) <br>
--------------------------------------------------------------------------------<br>
在安全,可行性,可编程性和最终用户的头痛间寻求平衡。 <br>
太长的,无字母的注册码可能造成连续的输入错误。考虑要求输入确认域(多数是口令),或者至少提供一个“不固定”的注册码输入域,以便用户可以每次重写注册码,也许最后正确的输入了。许多人会仅仅“瞥一眼”以比较输入的注册码和他们所收到E-Mail里的注册好,他们最终认为,他们输入了正确的注册码。但是字体太小或者他们懒得注意到底“I”和“1”被交换了位置(就像'l83jjd_0)pH1lTe'
)。<br>
根据不同用户的反馈,注册码输入区必须无限制的接受任何长度的信息。不要让破解者了解你的注册码的类型——如果你采取“在线确认(online-verification)”并显示它有10个字符长或只接受大写字母将给予他们帮助——不要这样做!<br>
计算潜在用户的数量!没有比这样的事更坏的了:你把用户数限制在9,999,你不希望有第10,000个用户,因为如此你就必须升级你的注册码以满足这第1,000个用户。<br>
如果你的注册码有10位,可能有10^10个注册码。但是,你的应用程序可能只允许10^4(10,000)个用户,你必须采取某种算法使10^4个用户每人一个得到10^10个注册码中一个。这保护了用户和你的应用程序本身受到穷举攻击(就像一个使用VXD的宏播放器那样)。如果只有10^4个用户,而你定义了10^9个合法的注册码,那么平均每试10次,就会有一个“合法”的注册码。然而,在预期只有10^4的情况下,平均每10^6次才会成功。即使是使用高速的计算机和极快的宏播放器(击键模拟输入注册码),要在10^6中寻找到需要的注册码所花费的时间也是无法计算的。<br>
从用户名(User name)到注册码(Registeration code)不应该只有简单的运算,它必须是有既精通数学又精通汇编语言的人用汇编语言实现(记注,Delphi仍然允许你直接使用汇编(ASM)代码)!然后,检查你的操作,绘制流程图,了解它是如何工作的。要彻底了解你自己的工作,特别是它的不足之处。<br>
要有创新意识,不要用任何看起来简单、迅速、有效的东西,除非你信奉类似爱因斯坦的相对论的学说。你的方法的确是简单,也的确是迅速,但是绝对不是有效,的确是容易被破解。我十分抱歉,我并非天才,没有找到一种行之有效的保护方案能维持太长时间。</span></p>
<p><span class="font105">只是些想法:)</span></p>
<p><span class="font105">Richey</span></p>
<p><span class="font105">如果你有这方面的技巧或建议,请给我发电子邮件!<br>
如果你想支持我在本页上的工作,或简单的说声“谢谢”为了将我的财富与您分享,我将很高兴,如果你能注册我的一个程序<br>
在你的支持下,这将不断更新,最后更新98年9月28日 </span></p>
<br>
<div align="center" class="font9"><span class="font9">『Site:<a href="../index.html" target="_top">delphi爱好者</a>
| E-mail:<a href="mailto:delphifan@990.net%20">delphifan@990.net </a>| Webmaster:<a href="../aboutme.htm" target="_top">梁
明</a>』</span> <br>
<span class="font9">---------------------------------------------------------------------------</span>
</div>
<div align="center"> </div>
<div align="center">
<input type="button" value="返 回" onClick="history.go( -1 );return true;" name="button">
</div>
<!-- #EndEditable -->
</BODY>
<!-- #EndTemplate -->
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -