分享
 
 
 

用C++ Builder的MD5控件实现软件防护

王朝delphi·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

一、共享==免费?

随着Internet大行其道,“共享+注册”模式日渐成为程序员发布自己软件的主要手段,但是随之而来的破解手段也越来越高明。如何保护自己的劳动成果不被暴力破解或修改?用MD5摘要值验证是一个很常用的方法。

MD5作为一个公开算法,实现的方法很多,比如开源软件、Windows自带的API等,C++ Builder和Delphi中集成的Indy里面也有现成的MD5控件。用API实现MD5虽然效率高,但是毕竟太繁琐,具体方法可以参阅MSDN上crypt开头的那几个函数说明。用C++ Builder的MD5控件虽然方便,但是速度较慢,而且只能处理以’\0’结尾的字符串,所以要用这个控件还需要我们对待验证数据做一些预处理。预处理的关键在于把较重要的内容挑出来计算,这样一方面可以去除’\0’,另一方面可以极大减少待验证内容的长度,只计算关键代码的摘要值。

二、源程序祥解

先要说明的是网上和Borland Help里面对Indy MD5控件介绍很少,这段程序基本上是我自己摸索的结果,在C++ Biulder 6.0和Indy 6.0下运行正常。

先在Indy misc中拖一个MD5控件,假设其name为cipher,程序如下:

/*

MD5计算函数 by DayDreamer 2004-04

功能:对文件名为fname的文件计算16个字节长的MD5值,放在result里面

输入:指向文件名的指针char *fname

输出:MD5值放在result指向的缓冲区里面

返回值:如果正确计算出MD5值则返回true,否则返回false

*/

bool MD5( char* fname, char *result)

{

unsigned int i=0; //用于记录读出文件的大小

bool flag=false; //正确计算md的话则置标记

static AnsiString ss; //用于临时存放得到的MD5值

char *buffer=new char[myFILE_SIZE]; //用于读取目标文件,文件大小不能超过myFILE_SIZE

TFileStream *tt=new TFileStream(fname,fmOpenRead); //用于读取目标文件的全部内容,使用此方法简单一点,也可以用标准的CreateFile()读取

i=tt->Read(buffer,myFILE_SIZE); //i中保存实际读取的字节数

if ((i)&&(i!=1)) //如果读出字节数不为0或1,则进行处理

{ i=i-1; //最后一个字节必须留出,供结束符使用

_asm{ //这一段汇编主要是用来对文件预处理

mov ecx,i; //置计数器

mov ebx,buffer; //源地址指针

mov edx,buffer; //目的地址指针

l1: mov al, [ebx]; //取一个字节,因为如果文件过大会极大降低速度,所以必须以较细粒度过滤源串

cmp al,0x70; //只对大于0x70和小于0x91的字节进行摘要

jb l2 ; //因为主要的转移指令(jz,jnz)、空操作指令(nop)等都大于0x70小于0x91

cmp al,0x91; //也可以换成更宽松的条件,但至少应该把0x00滤掉,因为它被视为结束符

jnb l2 ;

mov [edx],al ; //符合条件的字节保存起来等待验证

inc edx;

l2: inc ebx;

dec ecx;

jnz l1;

mov byte ptr [edx+1],0; //在最后置结束符’\0’

}

cipher->Reset(); //每次使用该控件之前应该重置其内部的一些参数

cipher->AutoCompleteInput=false; // 只有调用CompletedInput() 时才得到结果

cipher->CodeString(buffer); //输入预处理过的数据

ss=cipher->CompletedInput(); //输入完毕,得到摘要码

if(ss.Length()=MD5_LENGHTH) //如果摘要码正常(即为16位),则保存之

{ flag=true; //置正确标志

memcpy(result,ss.c_str(),16); //把结果放入result

} // end if

}// end if

delete tt;

delete[] buffer;

return flag;

}

调用的时候可以用Application->ExeName.c_str()当作fname传入,注意在C++ Biulder中直接run的话这会引起异常,这没关系,发布出来的程序不会有问题。此处为了简明,在汇编代码中没有保存和恢复寄存器,使用时可以加上,或者发布时把optionsèAdvanced Complier中的Register variables设为none即可。

Delphi中使用该控件的方法类似,就不再赘述了。

三、使用方法

利用MD5值来保护共享软件的方法有很多,最简单的比如先把正常的执行模块的MD5摘要值静态保存在外部文件中(比如包含在注册文件中),每次运行时计算自身的MD5并与之比较,从而判断是否被修改。高深一点的比如用正确的MD5来还原正确的入口地址,或者参与注册码/机器码计算。最好是加上自身MD5验证之后再用ASProtect或ASPack之类的压缩软件加上壳,这样一旦cracker用脱壳软件脱壳,软件将不会正常执行,对于很多crack newbie来说十有八九会怀疑脱壳失败,进而放弃。

其实软件保护与破解永远是魔道相长的一对矛盾,无论怎么严密的防范,肯定有人能破。我们要做的只是把大量的菜鸟cracker挡在门外,如果不幸被高手盯上,那么恭喜你:这说明你的软件真的很有价值。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有