校验EXE文件防止软件被破解

潍坊市职工大学计算机系 刘红军

01-7-17 下午 02:30:28


软件凝聚的开发者的心血,几乎每个好用的共享软件都被破解过,保护软件免遭破解,是每个软件作者的心愿。无论你限制软件的使用次数还是天数,破解者只需要用反编译软件,直接把exe文件中的次数限制修改成无限,或修改跳转指令,使注册码码无效。
如何保护自己的软件免遭破解呢?程序运行时自我校验是比较好的办法。
一、原理如下:
软件开发者要有两个可执行文件,一个是CRC.EXE,负责校验共享软件的EXE文件,获得其校验码,写入文件SYSTEM.DLL(故意取这个名字,迷惑破解者,校验码最好加密,本文未加密)。另一个是SELFCRC.EXE,即我们编写的共享软件,它具有自我进行校验的功能。共享软件发布时,至少要包含两个文件:SELFCRC.EXE和SYSTEM.DLL。
共享软件每次运行时,首先进行自我校验,结果跟SYSTEM.DLL中的校验码比较,正确则正常执行,错误则发出警告后删除自己。如果用户删除了SYSTEM.DLL文件,程序也会拒绝执行并删除自己。这样可以保证只要破解者修改了EXE文件,该文件就不能运行了。
二、CRC.EXE的界面以及源代码:
CRC.EXE的设计界面
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
OpenDialog1: TOpenDialog;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public de clarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
//定义校验函数
function GetCheckSum(FileName : string) : DWORD;
var
F : File of DWORD;
P : Pointer;
Fsize : DWORD;
Buffer : Array [0..500] of DWORD;
begin
FileMode := 0;
AssignFile(F,FileName);
Reset(F);
Seek(F,FileSize(F) div 2);
Fsize := FileSize(F) -1 -FilePos(F);
if Fsize > 500 then Fsize := 500;
BlockRead(F,Buffer,Fsize);
Close (F);
P := @Buffer;
asm
xor eax,eax
xor ecx,ecx
mov edi,p
@again:
add eax,[edi + 4*ecx]
inc ecx
cmp ecx,fsize
jl @again
mov @result,eax
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
CRCResult :dword;
begin
//打开对话框选择文件
if OpenDialog1.Execute then
begin
CRCResult:=GetCheckSum(OpenDialog1.FileName);
if CRCResult<>0 then Edit1.text:=IntToHex(CRCResult,8)
else ShowMessage('The CRC check failed');
end;
end;
end.
三、SELFCRC.EXE的界面以及源程序
SELFCRC.EXE的设计界面
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public de clarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
//定义删除自己的过程,动态创建并执行批处理文件
procedure deleteme(filename:string);
var
batfile:textfile;
begin
assignfile(batfile,'./delme.bat');
rewrite(batfile);
writeln(batfile,'@echo off');
writeln(batfile,':loop');
writeln(batfile,'del "'+filename+'"');
writeln(batfile,'if exist ./file.exe goto loop');
writeln(batfile,'del ./delme.bat');
closefile(batfile);
winexec('./delme.bat',SW_HIDE);
end;
//定义校验函数
function GetCheckSum(FileName : string) : DWORD;
//代码同上,省略。
procedure TForm1.FormCreate(Sender: TObject);
var
OutFile,batfile:Textfile;
Fname,CRCTrue:string;
CRCResult :dword;
begin
form1.Visible :=false;
Fname:='System.dll';
if not fileexists(Fname) then begin
application.messagebox('错误:因丢失DLL文件,软件将退出。','系统警告',16);
//删除自己
deleteme(application.exename);
application.Terminate;
end
else begin
assignfile(outfile,fname);
reset(outfile);
//读取正确的校验码到CRCTrue
readln(outfile,CRCTrue);
closefile(outfile);
CRCResult:=getchecksum(application.exename);
if CRCResult<>0 then begin
//在实际应用中,以下的提示对话框不要显示
showMessage('CRC校验结果是:'+IntToHex(CRCResult,8));
//破解后校验结果必然不正确.程序拒绝执行并删除自己
if IntToHex(CRCResult,8)<>CRCTrue then
begin
ShowMessage('CRC结果错误,程序将退出!');
application.Terminate ;
deleteme(application.exename);
end
else begin
ShowMessage('CRC结果正确!');
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;
end.
四、在实际应用中,通过文件校验结合限制用户的使用次数和天数,以及只能在一台机器上使用等办法,可以更好地保护你的共享软件免遭破解。以上代码在WIN98,Delphi 5.0中调试通过。

校验EXE文件防止软件被破解相关推荐

  1. OpenCV2.4.X怎样使开发出来的exe文件或软件可独立运行?

    OpenCV2.4.X怎样使开发出来的exe文件或软件可独立运行? 设置库文件那里把 D:\Program_Files\opencv2.4.9\opencv\build\x86\vc10\lib 设置 ...

  2. 再次轻度破解EXE文件

    在经历股市多年的大起大落.大赚大赔之后,痛定思痛,深切感到在金融市场拼搏,必须建立健全交易纪律守则,严格执行. 这套完整的纪律守则,就是"交易系统".在许多方面,它与一般的专家系统 ...

  3. JAVA项目的打包及生成.exe文件或者打包安装软件

    总体思路是先打成jar再把jar打成exe.主要看1.3和2.3里的内容就可以了. 1.将项目打成jar: 1.1要将项目打包成jar文件,方法很多,可以用Eclipse自带的打包工具Ant打包,也可 ...

  4. 【软件】 UltraCompare(文件比较工具)中文版破解

    ltraCompare是一款文件内容比较工具.著名的ultraedit公司出品的,可进行文本模式,文件夹模式以及二进制模式的比较,并且可以对比较的文件进行合并,同步等操作,支持撤消操作.拥有书签与收藏 ...

  5. python通过pyinstaller打包软件将GUI项目打包成exe文件

    此项目分为两步: GUI编写程序 pyinstaller打包软件 所用到的第三方库: tkinter pyinstaller 具体实现 1. GUI界面 本次主要讲解如何打包,所以在此只是设计一个十分 ...

  6. java写exe程序实例_2012软考软件设计师辅导:利用JAVA执行本地EXE文件

    曾经为了这样一个需求找了很多资料,今天终于学习到了!如何利用java执行exe文件?使用java类Runtime,每个Java应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接. ...

  7. 在没有安装VC软件的电脑上也可以执行的exe文件

    在debug 和 release中都有exe文件 ,将Release中.exe文件拷出来才可以用: 在菜单栏上的Build--->Set Active Configration-->Win ...

  8. 好用的python打包软件_Python打包exe文件方法汇总【4种】

    title: Python打包exe文件方法 copyright: true top: 0 date: 2018-08-11 21:08:21 tags: 打包 categories: Python进 ...

  9. exew文件加密:利用破解版exe文件加密器对exe文件进行加密保护(图文教程)

    exew文件加密:利用破解版exe文件加密器对exe文件进行加密保护(图文教程) 目录 加密过程步骤 解密过程步骤 加密过程步骤 解密过程步骤

  10. python用PyQt5实现一个简单的表白软件(代码实现+py文件打包成exe文件)

    1.代码+py文件打包方法 功能说明:除了点击同意按钮外,软件不会关闭,不同意按钮不会被鼠标点击生效,会不断的被鼠标触发移动 2.上代码: 注:使用该程序之前需要安装pyqt5, pip instal ...

最新文章

  1. Python培训完可以找什么工作
  2. mysql(五)查询缓存
  3. synchronized()_这篇文章带你彻底理解synchronized关键字
  4. NPS的几个技术点(在Win 2003中称为Internet 验证服务)
  5. 原生ajax如何执行,原生ajax调用数据实例讲解
  6. Java打印三角形(双层for循环)
  7. 这不关我的事,别烦我!
  8. JAVA零碎要点008---tomcat启动的时候报错了严重: End event threw exception java.lang.reflect.InvocationTargetExcepti
  9. python发明小故事简写_科学发明小故事10字以上
  10. Quartz定时器实现
  11. office2010安装过程出错(解决方法整合)
  12. Result window is too large, from + size must be less than or equal to: [10000]
  13. 使用CityBuilder搭建智慧城市3D可视化模型
  14. (一)D3D9渲染原理
  15. Arturia CZ V(音频合成器)v1.0.0.2695官方版
  16. Evil Corp 团伙开始使用 LockBit Ransomware 逃避制裁
  17. 面试题数组L型输出思路
  18. 买好了虚拟服务器后怎么办,购买虚拟主机后应该怎么操作?
  19. 非线性控制1.2——LaSalle不变集原理
  20. 一招学会DIY官网可视化设计支持导出微擎、UNIAPP、H5、微信小程序源码

热门文章

  1. 女程序员写代码被骂,把领导萌死,成功治愈“选择困难症”
  2. bzoj5145 [Ynoi2018]未来日记 (多校第4场1013 Yuno and Claris)
  3. 探究“补阶乘大法的本质“——糖水不等式
  4. 微信小程序实现页面按钮分享,右上角三个点分享禁用分享
  5. PHP方法,传入的参数前带三个点是什么意思?
  6. 猫、路由器、交换机的区别
  7. 软件测试结果分析和质量报告
  8. 双线服务器托管因时代的发展产生的优势
  9. 获取6050原始数据
  10. 领域划分的规则是什么?