Delphi编程如何防破解
来源:互联网 发布:ubuntu系统安装教程 编辑:程序博客网 时间:2024/04/30 08:02
版权归作者所有
Delphi编程反破解经验集-仲睿光(天下第一关口)
==========================
Delphi编程如何防破解
——不要让你的程序成为破解新手的练习目标
作者:仲睿光
大多数Delphi程序员不懂汇编,所以,他们使用的“保护措施”是相当脆弱的。
——题记
浏览国内的破解网站,随便找个软件一搜,就可能找到他的破解方法,那一个个看似有着固若金汤的注册机制的软件在众多高水平的Cracker面前显得那么软弱,而作为一名自由程序员,如何有效保护我们的合法利益呢??
⒈防止暴力破解
对爆破稍有了解的程序员应该知道,所有的程序验证注册码都逃脱不了判断语句,而判断语句在强大的反汇编工具面前却可以被任意修改,而且修改的步骤极为简单,仅仅是一个字节就搞定的事。
所以,我们需要找到一些足够有效的方式:
⑴进行Hash校检
★★★
对于这种方式,应该说是很简单的,比如CRC32,我们可以很轻松的编出这样的程序
方法,确定一个定值作为程序CRC32,然后编译(不要运行)然后用PEiD里的一个CRC工具来修正程序CRC,这个方法对菜鸟很有用,而且,校检部分一定要到处写,变着格式写,不要写一样的,而且多下几个暗桩,才能让破解者防不胜防。
⑵进行体积校检
★★★★
此方法需要一个强劲的压缩壳来配合使用,为什么呢??
这个方法的原理是
PE脱壳后,文件长度一般会增大,原因有以下几点:1、脱壳后,壳的尸体依然存在;
2、脱壳后,重新建立了新的Import节、Reloc节等;3、有些加壳程序,将原程序的某些节跟外壳增加的某些节合并后,搬移到了其他位置。4、脱壳时候,因为采用的是dump内存,所以,在内存中对齐的PE镜象一般也会大于原始的PE文件,各个节的dump实际尺寸也会较原始PE文件的实际尺寸大。而手工恢复它们是一件繁重的体力活,所以,我们可以这样做
在DPR和PAS中的各个角落都加入对程序体积的校检【代码自己研究】
提示:可以在不成立的条件下,故意执行一些错指令(请考虑使用内嵌汇编),使程序崩溃(嘻嘻够阴险了吧)或加入点死机代码,消遣消遣Cracker,让他吐血,且把体积随便添上个大数,然后加壳(多试几个加壳软件 如FSG、MEW、北斗、UPack,它们的压缩率都不错),取压完后体积最小的,记下字节数,然后填入校检,重新编译,加压,就可以让只会简单爆破的菜鸟们着急了。
⑶避开跳转指令
★
这种方式,我并不推荐,因为实现起来需要一定的汇编功底,因为实际上跳转指令无论如何也离不开,只是不让它出现在程序代码里,而是运行时开辟一块内存并动态执行代码。
方法
此文摘自KeyLife富翁笔记
作者: zgl198171
版权归作者所有
Delphi编程反破解经验集-仲睿光(天下第一关口)整理
====================
程序要执行首先要分配内存,在Win32下每个进程的内存地址空间都是虚拟的,其内存地址不是实际的物理地址,所以使用VirtualAlloc来完成虚拟内存的分配!
LPVOID VirtualAlloc(
LPVOID lpAddress,
SIZE_T dwSize,
DWORD flAllocationType,
DWORD flProtect
);
lpAddress 为申请的内存的起始地址,在Win32中你可以自己指定申请内存的地址范围!Win32中每个进程的地址空间为4GB,从0X00000000到0XFFFFFFFF。那是否可以在这个范围内任意分配内存?答案是否定的!在这其中只有一部分是可以供Win32应用使用的。使用GetSystemInfo获取系统信息,其中的lpMinimumApplicationAddress、lpMaximumApplicationAddress分别是可以使用的最小地址和最大地址。当然这里可以简单的设其值为Null,套用MSDN中的一句话:“If this parameter is NULL, the system determines where to allocate the region.”,直接将其交给系统去处理!
dwSize 为申请内存大小,以字节为单位,但如果其大小不为页的整数倍,系统将会加大内存达到页的整数倍。所以尽量按页来申请。同样可以用GetSystemInfo来获取dwPageSize。如Win9X下一页为4K,即4096字节。
flAllocationType 指定申请方式,flProtect 指定内存的保护方式,具体信息可查看MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/virtualalloc.asp
这里根据需要将两参数设为MEM_COMMIT(提交已经申请的内存)、PAGE_EXECUTE_READWRITE(执行和读写)
完成了内存分配的工作后,下面就是将待执行的代码保存到内存中。机器语言指令是多字节指令,所以接下来要做的就是将一串具体数字按字节写入内存中。
下面的代码完成了一段子程序的生成:
var
Code:PByte;
Str:String;
Data:Longint;
num:integer;
procedure AddCode(const CodeByte:Byte);//将数据赋给指针指向的位置
begin
Code^:=CodeByte;
Inc(Code);
Inc(num);
end;
begin
num:=0;
Code:=VirtualAlloc(nil, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
AddCode($50);//PUSH EAX
AddCode($B8);//MOV EAX
Str:='Hello World!';
Data:=Longint(Pointer(PChar(Str)));//取字符串地址
AddCode(Data and $FF);
AddCode(Data and $FF00 shr 8);
AddCode(Data and $FF0000 shr 16);
AddCode(Data and $FF000000 shr 24);
AddCode($E8);//CALL
Data:=Longint(@ShowMessage) - Longint(Code) - 4;//计算Showmessage的相对地址
AddCode(Data and $FF);
AddCode(Data and $FF00 shr 8);
AddCode(Data and $FF0000 shr 16);
AddCode(Data and $FF000000 shr 24);
AddCode($58);//POP EAX
AddCode($C3);//RET
Dec(Code,num);//指针移动,返回首地址
end;
也许可以通过相应技术手册来查询相应指令的含义,但在Win32下其实有种简单的理解方法。其实只要对任意一个Win32程序进行反编译,即可获得相应指令和汇编助记符的对应关系。
用汇编代码表述其意义为:
PUSH EAX
MOV EAX,[字符串地址]
CALL ShowMessage
POP EAX
RET
接下来,通过嵌入ASM代码:
asm
Call Code
end;
就完成了上面代码的动态调用执行。
⑷多线程校检
★★★★
多线程一直是调试工具的弱项,同时人的精力有限,难以同时跟踪若干个程序的代码,用这种方式可以有效的提高破解的难度。
⑸借助DLL动态链接库
★★★★★
这个方案,是我一直正在采用的方案,简单易行,而且很稳定,毕竟拆解一个DLL的难度要比分析可执行文件的难度高的多。
⑹制作畸形PE文件头
★★☆
制作畸形PE文件头的方法其实也不叫方法,因为畸形PE文件头被很广泛的应用于免杀方面。由于这个方法过于生僻,也不可详讲,请见附带的压缩包中PDF文件。
⑺将程序算法与壳的Hash码紧密的结合起来,比如用CRC加密一些常量,这样CRC被改了,程序不会正常运行的。
反注册机:
这里也不详细讲解了,只是最好用注册文件法,这样分析起来能更困难一些。要加上虚拟机的SDK,虚拟机随便选,自己写一个也不会太难。是在不行的话就用狗吧,USB狗很便宜了,而且性能也很不错。
- Delphi编程如何防破解
- SSH如何防破解
- 如何防暴力破解??
- 如何破解防拷贝光盘
- 注册码系统防破解教程,如何防破解?
- vb制作的软件如何防破解
- 安卓应用如何加固防破解
- Android APP破解技术有哪些?如何加密防破解?
- 如何深入Delphi编程
- 如何深入Delphi编程
- 如何保护.net中的dll文件(防破解、反编译)
- 如何保护.net中的dll文件(防破解、反编译)
- 如何保护.net中的dll文件(防破解、反编译)
- 如何保护.net中的dll文件(防破解、反编译)
- 如何给你的软件做到有效的防破解
- 如何保护.net中的dll文件(防破解、反编译)
- 如何保护.net中的dll文件(防破解、反编译)
- 如何做到基于NDK的Android应用防破解!
- How to deal with Gecko problem.
- 彻底解决fckeditor(jsp版)上传中文图片乱码问题
- 心德!
- ★Delphi编程反破解经验集说明★
- ANTI-DEDE的几个方法
- Delphi编程如何防破解
- 往一递增有序的顺序表中插入x,仍保持气有序性
- POJ1013
- IoAllocateDriverObjectExtension及伪码
- 2008“搞笑诺贝尔奖”颁布
- 74LS245的问题
- too...to... 与 enough...to... 与 so...that...的区别
- Ext.form.ComboBox提交始终获得displayField的值-解决
- pragma指令简介