当前位置:天才代写 > tutorial > C语言/C++ 教程 > 用C++ Builder的MD5控件实现软件防护

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

2017-11-04 08:00 星期六 所属: C语言/C++ 教程 浏览:482

一、共享==免费?

跟着Internet大行其道,“共享+注册”模式日渐成为措施员宣布本身软件的主要手段,可是随之而来的破解手段也越来越高超。如何掩护本身的劳动成就不被暴力破解或修改?用MD5摘要值验证是一个很常用的要领。

MD5作为一个果真算法,实现的要领许多,好比开源软件、Windows自带的API等,C++ Builder和Delphi中集成的Indy内里也有现成的MD5控件。用API实现MD5固然效率高,可是究竟太繁琐,详细要领可以参阅MSDN上crypt开头的那几个函数说明。用C++ Builder的MD5控件固然利便,可是速度较慢,并且只能处理惩罚以‘’末了的字符串,所以要用这个控件还需要我们看待验证数据做一些预处理惩罚。预处理惩罚的要害在于把较重要的内容挑出来计较,这样一方面可以去除‘’,另一方面可以极大淘汰待验证内容的长度,只计较要害代码的摘要值。

二、源措施祥解

先要说明的是网上和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; //在最后置竣事符‘’

}

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即可。

三、利用要领

操作MD5值来掩护共享软件的要领有许多,最简朴的好比先把正常的执行模块的MD5摘要值静态生存在外部文件中(好比包括在注册文件中),每次运行时计较自身的MD5并与之较量,从而判定是否被修改。高妙一点的好比用正确的MD5来还原正确的进口地点,可能参加注册码/呆板码计较。最好是加上自身MD5验证之后再用ASProtect或ASPack之类的压缩软件加上壳,这样一旦cracker用脱壳软件脱壳,软件将不会正常执行,对付许多crack newbie来说十有八九会猜疑脱壳失败,进而放弃。

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

 

    关键字:

天才代写-代写联系方式