欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

共享软件双重验证的编程实现

程序员文章站 2022-03-12 15:55:58
文/ SuperVirus介于初次投稿的内容趋向于共享软件,并且投稿以后又看了下文章,感觉所阐述的都是一些理论方面的内容,且有些使用方式已经在长久的骇客攻击*享软件作者已经不再运用,因此经过...

文/ SuperVirus
介于初次投稿的内容趋向于共享软件,并且投稿以后又看了下文章,感觉所阐述的都是一些理论方面的内容,且有些使用方式已经在长久的骇客攻击*享软件作者已经不再运用,因此经过思考,决定今后详细的介绍共享软件的实现和强壳的一些破解方式探讨。路要一步步走,饭要一口口吃,来的太急,不光对首次学习的朋友不利于迅速入门共享软件破解,还会让人感觉是在打游击战——流水账。但是大家也都清楚,网上关于脱壳及共享破解的文章是满世界飞,所以本文在经过新奇素材的挑选基础上,加上个人的一些见解和自己的代码,来让大家实现系统的入门。
 
前奏
在共享软件的编制过程中,我想最重要的就是这两个了:使用时间和次数限制。共享软件嘛,肯定要有这两方面的限制的。记得在国内加解密刚开始发展的时候,就有加壳软件可以达到这个限制效果,所以介于这两种限制方式的绝对辐射覆盖率,我们就先来C++编程将其实现。
至于限制方式,本文的实现主要是采取注册表和伪系统文件同时进行双重结合认证方式,个人感觉运行起来防破解效果还不错。
 
运作流程
我们采用已写入注册表和伪系统文件的使用记录数据来结合验证,对于抵御破解方面,80%的新手基本可以阻挡在外了。注册表键值方面这样做安排:采用GUID(全局唯一标识符,编程时候可用CoCreateGuid函数获得)类型字串或酷似一些bootvid.dll等类似系统文件的伪系统文件名命名;还有就是针对在使用限制达到后,即时修改系统时间的考虑,编程中将当前系统时间和之前存入注册表内的数据进行比较,大于的话存入注册表,小于的话说明被用户修改了时间,就拒绝运行(前提是ANTI一些注册表或文件监视工具,这里不做细致介绍)。
 
代码实现
我们先定义软件的限制类型,变量声明如下,然后设计类成员变量和功能实现函数。
 
#define Run_number 1    //运行的次数
#define Run_time   2    //运行的时间
 
1)类函数初始化
SoftwareShow:: SoftwareShow (
Const char * Cracker, //注册表中的项名称
Const char * SuperVirus, //注册表中的键名称和伪系统文件名称
UNIT nSome, //使用时间和次数的常量
UNIT nCeackerType //类型)
 
2)编写类函数的内部代码
 
//得到系统文件目录,赋值给c_systemfolder
UNIT nRuncount;
GetSystemDirectory(c_System,MAX_PATH);
Strcpy(c_systemfolder, c_System);
If (
c_systemfolder[strlen(c_systemfolder)-1]!=’\’)
strcat (c_systemfolder, ’\’);
//系统目录里面生成注册文件名,以DLL作扩展名迷惑用户
Strcat(c_systemfolder, SuperVirus);
Strcat(c_systemfolder,”.dll”);

3)用户使用记录信息的保存
这段代码主要实现对使用记录信息做随机处理。
 
BOOL SoftwareShow::Obfuscate(UINT number,char *str)
{char tmpstr[128];
//取一个基准时间
Srand((unsigned int)time(NULL));
UINT base1,base2,base3;
Base1 = rand();
Base2 = rand();
Base3 = abs(base1 – base2);
Sprintf(tmpstr,”%d.%d.%d”,base1,number + base3,base2);
Strcpy(str,tmpstr);
Return FALSE;}
 
将上面得到的字符串传递给STR参数就完成了子键的创立。
 
RegSetValueEx(crackerhkey,” windll”,0,REG_SZ,(byte *)str,size);
 
4)键值和伪系统文件的创建
这里也是为了解密的难度而设的,信息保存在注册表多处,并同时创建类似系统文件名的bootvid.dll来记录使用信息,达到双重验证并隐藏的目的。实现代码如下。
 
Char * SomeKey = new char [strlen(Cracker)+strlen(SuperVirus)+300];
Strcpy(SomeKey,”CLSID\”);
Strcat(SomeKey,Cracker);
Strcat(SomeKey,”\”);
Strcat(SomeKey,SuperVirus);
HKEY nkey;
DWORD dwDisposition;
LONG ret = RegCreatKeyEx(HKEY_CLASSES_ROOT,
SomeKey ,0,””,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hkey,&dwDisposition);
Crackerhkey = hkey;
Delete Subkey;

5)继续创建伪系统文件
 
Char buff[32];
Buff[31]=0;
FILE * cracking=fopen(c_systemfolder,”w”);
fprintf(cracking,buff);
fclose(cracking);
 
6)读取使用记录信息并显示出来
我们稍微考虑一下就可以知道,它其实就是上步实现代码的反过程,从注册表读取上次运行的信息进行判断。
 
Char data[128];
DWORD size = sizeof data;
LONG ret = RegQueryValueEx(Crackerhkey,”windll”,0,NULL,(BYTE *)data,&size );
If(
ret == ERROR_SUCCESS)
{
DeObfuscate(data,nCount); //恢复随机处理的信息函数
Return False;
}

7)重用类的编程实现
打开Visual C++,一切按照默认选项,点击MFC AppWizand建立一个单文档工程:SoftwareShow,在项目中加入可重用类的头文件等文件。打开SostShow.cpp,在BOOL SoftwareShowAPP::InitInstance()函数库头部分加入以下的代码:
 
CString str = _T(“”);
SostwareShow show(”SoftwareShower”,”show1”,30, Run_number);
If(show.IsHaveshow())
{
Str = _T(“本软件已过期,快快寄票子给偶,哈哈!”);
::MessageBox(NULL,str,”过期啦”,MB_ICONERROR | MB_OK);
 
至于窗口显示部分,大家可以随意修改,这里只是给出一个具体的实现流程而已。
 
 
总结
至此,本文就算完结了,技术上可以说没有什么新奇之处,但个人觉得实现方法上还是可以的,当然,这里只是起到一个抛砖引玉的作用,大家如果以后拿破解工具来玩还是蛮好玩的。本文虽然给出了一个注册表和文件的双重认证的实现方法,但如果你在系统上面还知道什么更好的隐藏方式也可以加进来,进一步加强软件的破解周期。不过这里我不得不说一下前提,对于时下流行的动态跟踪软件,用上本文的技术之前最好做一些Anti Debugger的代码保护。