关于机器码生成注册码软件的注册码的问题

ASP.NET源码:C#获取CPU序列号机器码并生成注册码
【网络综合-ASP.NET源码:C#获取CPU序列号机器码并生成注册码】:
本例用C#获取CPU序列号生成机器码,最后生成注册码,在注册的时候经常用到,效率还算可以。
using System.M//需要在项目中添加System.Management引用
namespace ECBC_CDKEY{public class SoftReg{/// &summary&/// 取得设备硬盘的卷标号/// &/summary&/// &returns&&/returns&public string GetDiskVolumeSerialNumber(){ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"c:\"");disk.Get();return disk.GetPropertyValue("VolumeSerialNumber").ToString();}
/// &summary&/// 获得CPU的序列号/// &/summary&/// &returns&&/returns&public string getCpu(){string strCpu =ManagementClass myCpu = new ManagementClass("win32_Processor");ManagementObjectCollection myCpuConnection = myCpu.GetInstances();foreach (ManagementObject myObject in myCpuConnection){strCpu = myObject.Properties["Processorid"].Value.ToString();}return strC}/// &summary&/// 生成机器码/// &/summary&/// &returns&&/returns&public string getMNum(){string strNum = getCpu() + GetDiskVolumeSerialNumber();//获得24位Cpu和硬盘序列号string strMNum = strNum.Substring(0, 24);//从生成的字符串中取出前24个字符做为机器码return strMN}public int[] intCode = new int[127];//存储密钥public int[] intNumber = new int[25];//存机器码的Ascii值public char[] Charcode = new char[25];//存储机器码字public void setIntCode()//给数组赋值小于10的数{for (int i = 1; i & intCode.L i++){intCode[i] = i % 9;}}/// &summary&/// 生成注册码/// &/summary&/// &returns&&/returns&public string getRNum(){setIntCode();//初始化127位数组string MNum = this.getMNum();//获取注册码for (int i = 1; i & Charcode.L i++)//把机器码存入数组中{Charcode[i] = Convert.ToChar(MNum.Substring(i - 1, 1));}for (int j = 1; j & intNumber.L j++)//把字符的ASCII值存入一个整数组中。{intNumber[j] = intCode[Convert.ToInt32(Charcode[j])] + Convert.ToInt32(Charcode[j]);}string strAsciiName = "";//用于存储注册码for (int j = 1; j & intNumber.L j++){if (intNumber[j] &= 48 && intNumber[j] &= 57)//判断字符ASCII值是否0-9之间{strAsciiName += Convert.ToChar(intNumber[j]).ToString();}else if (intNumber[j] &= 65 && intNumber[j] &= 90)//判断字符ASCII值是否A-Z之间{strAsciiName += Convert.ToChar(intNumber[j]).ToString();}else if (intNumber[j] &= 97 && intNumber[j] &= 122)//判断字符ASCII值是否a-z之间{strAsciiName += Convert.ToChar(intNumber[j]).ToString();}else//判断字符ASCII值不在以上范围内{if (intNumber[j] & 122)//判断字符ASCII值是否大于z{strAsciiName += Convert.ToChar(intNumber[j] - 10).ToString();}else{strAsciiName += Convert.ToChar(intNumber[j] - 9).ToString();}}}return strAsciiN//返回注册码}}}12141人阅读
最近做一个Android应用时遇到这个问题,客户要求功能必须注册才能使用,而程序本身又不是联网在线使用的,这就要在程序中加入机器码注册码机制了。
众所皆知Android应用是基于Java开发,如不做处理的话,直接反编译APK就能看到源码算法,要破解就没什么难度了。
关于Android防破解,网上有价值的内容较少。我收集了一些零碎的资料,总结起来大概有以下几种防破解的思路方式:
1.代码混淆。2.3的Android SDK已经支持直接混淆生成APK。混淆能加大反编译破解的难度,但光混淆不能解决问题,对于有经验的人来说,在混淆代码中找到注册检查代码进行强行破解也不是难事。
2.签名比对。APK中可使用签名进行处理,不过APK的签名不能防止反编译,只是反编译后不能再使用同一个签名而已。虽然可在代码中进行比对签名,但比对代码本身也可能被修改掉。因此签名的作用不大。
3.联网注册。程序启动后自动连接到服务器进行注册验证,并把一部分核心功能放到服务端。这种方式是最安全,不过对于单机程序就不合适了,总不能在一个记事本程序中也要求用户登录服务器吧。
4.dex或class动态加载。这种方式理论不错,把一小部分核心算法做成dex或class文件,加密为资源文件,注册成功后才解密并加载到内存中。但这个方式实现起来难度很高,我似乎没有在网上找到实现的文章,实现后维护代码成本也高。另外,如果将程序完全反编译后进行调试,也仍然能下断点把解密的dex或class文件给导出来。
5.使用NDK(或JNI)本地C/C++动态库。对于单机应用程序来说,这个是比较好的解决办法了。NDK编译的原生C/C++程序调试破解的难度比较高,代码维护也方便。
要加大破解难度,还有其它一些要注意的:可对关键内容或算法进行加密;把检测算法分解成零碎片段多处调用;另外注册相关的敏感字符串(如“注册失败”之类的消息)一律不以明文出现,等等。
我最终选择的注册机制方案是:代码混淆+NDK库+内容加密。简单说明如下:
1.对所有JAVA代码进行混淆。我之前写的程序是Android2.2的,不支持直接混淆;后来我下载了最新的SDK,将程序的SDK版本号target设置为13,在default.properties中增加proguard.cfg,然后在工程中右键Tools导出签名的APK完成混淆打包过程。
2.用NDK C语言实现机器码的生成、注册码的检测和内容的解密。在JAVA界面中只做机器码的显示、注册码的输入和调用加解密接口,而核心的机器码注册码加解密全在C程序中完成。机器码要跟硬件ID之类的结合,稍为要注意下的是不能直接用WIFI的MAC地址,因为WIFI的MAC地址容易被修改;最好是用CPU序列号,如果没有的话可考虑用设备ID IMEI或USB的MAC码,但最好不要在JAVA代码中获取,而是要在JNI C代码里获取,以免被反编译后篡改。生成过程这里就不细述了,以后有时间再写一下。
3.对部分资源文件进行加解密处理。程序运行中要使用文件系统中的资源文件才能运行,因此我把这些文件事先在PC上加密,并把解密密钥放在注册码中。根据机器码生成注册码,生成器注册码时将解密密钥加入。由于解密的密钥包含在注册码中,破解者即使将注册检测绕过,也无法解密文件运行;只能获得一个注册码才能执行解密。由于注册码检测和解密过程在NDK程序中完成,因此即使有一个注册码,也难以获得解密的密钥和算法。
当然了,防止破解是相对的,没有完全绝对不能破解的程序,只是让破解的难度成本高到还不如直接注册就行了。反过来说,如果你的程序本身没什么价值或没多少人会用,那基本上防破解也没什么必要。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:435815次
积分:5284
积分:5284
排名:第2296名
原创:91篇
转载:15篇
评论:387条
(1)(1)(1)(1)(2)(1)(1)(2)(7)(1)(3)(1)(2)(3)(1)(2)(2)(1)(4)(3)(3)(2)(1)(3)(2)(1)(4)(9)(7)(8)(6)(9)(1)(1)(3)(2)(2)(1)(2)机器码与注册码的生成问题
[问题点数:30分,结帖人zjljyj]
机器码与注册码的生成问题
[问题点数:30分,结帖人zjljyj]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。西西软件下载最安全的下载网站、值得信赖的软件下载站!
您的位置:
→ 注册码生成工具CrackCode2000的使用教程
&以前我们写注册机时,一般都要了解程式的算法,之后用汇编语言或 C 语言来把算法还原,这样做一个注册机一般都有要花不少的时间,而且要对汇编语言和编程有比较高的要求,所以对于初学者来说,是一件很难的事情,对于不少的初学者 ,有时他们能在内存中找到注册码,但却没有能力写出注册机来,这大大削弱了他 们的破解积极性,但还有更可恶的事,就是目前有不少的程式,它的注册码都与硬 件有关,就是在每一台机上安装都有一个机身码,要把这个机身码 E-MAIL 给作者,作者把收到的机身码用注册程式算出注册码后再寄回给用户,这样做使得软件的防 复制方面加强了,但造成了不少用户的麻烦,因为只要用户一重装系统或升级主板 ,就要重新去注册了。对于这种程式,一般初学者只能在内存中找到自己机器的注 册码,但这种注册码到了其它的机器上又不能用了,而自己又没有办法写出注册机来,为了解决这方面的问题,我写了一个小软件,它可以从另一进程内存中取出注 册码来,显示出来,而不需要你去了解注册程式的算法,但它的应用面是很有限的, 只能对付符合以下条件的软件: 一、必须在内存中或在寄存器中可以找到正确的注册码; 二、被取注册码的软件不能反跟踪程式; 三、被取注册码的软件的比较部分程式是静态的存在的; 四、注册码比较程式只作比较注册码使用。 好了,讲了这么多,不如来个例子说明一下如何使用它吧!哦对了,大家还不知那 个东西是什么呢?它叫 CrackCode2000 啊! 以下是一个软件的注册码比较程式,大家不要问我怎么样得到了,大家只要听下去 就可以了。 015F: 8A06 MOV AL,[ESI] 这里放你的输入的注册码 015F: 84C0
AL,AL 015F: 740D JZ
015F: 8A11 MOV DL,[ECX] 这里放正确的注册码 015F:004149DA 41 INC ECX 015F:004149DB 46 INC ESI 015F:004149DC 3AC2 CMP AL,DL 015F:004149DE 751F JNZ 004149FF 015F: 803900 CMP BYTE PTR [ECX],00 015F: 75ED JNZ
015F: 803900 CMP BYTE PTR [ECX],00 015F: 7515 JNZ 004149FF 015F:004149EA 803E00 CMP BYTE PTR [ESI],00 015F:004149ED 7510 JNZ 004149FF 015F:004149EF B MOV EAX, 最后正确就把 EAX=1 015F: 5F POP EDI 015F: 5E POP ESI 015F: 5D POP EBP 015F: 5B POP EBX 015F: 81C ADD ESP, 015F:004149FE C3 RET 好了,大家在 Winsoftice 下以下的命令可以看到: :d esi F8 34 38 34 38 34 38 34 38-34 38 34 38 00 00 00 00 .... 8 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 8 04 0D 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 8 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 8 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 8 00 00 00 00 00 00 00 00-00 C0 00 00 0A 04 00 00 ................ 8 04 00 00 00 0A 00 00 00-01 00 00 00 90 03 CA 00 ................ 8 00 00 00 00 D0 03 CA 00-00 00 00 00 00 00 00 00 ................ :d ecx E4 58 51 4D 50 5A 43 57 58-54 45 52 53 00 01 08 00 XQMPZCWXTERS.... F4 9A EE 8B 17 E3 A4 00 00-10 00 E0 2C 00 00 00 01 ...........,.... 4 00 03 00 00 00 00 00 00-80 01 AB 01 8D 01 9C 01 ................ 4 00 00 AB 01 8D 01 00 00-80 01 9C 01 8C 01 A4 01 ................ 4 8D 01 9C 01 8C 01 A4 01-8D 01 04 00 00 00 B6 0C ................ 4 00 A9 52 FB 83 2A D1 78-21 88 73 DA A2 0B F0 59 ..R..*.x!.s....Y 4 65 CC 37 9E E6 4F B4 1D-44 ED 16 BF C7 6E 95 3C e.7..O..D....n.& 4 ED 44 BF 16 6E C7 3C 95-CC 65 9E 37 4F E6 1D B4 .D..n.&..e.7O... 见到了吧!那个 XQMPZCWXTERS 就是正确的注册码了,但如果我们用以前的方法来写注册机, 就要去分析前面的程式了,但我们今次不是用这种方法来制作,而是用 CRACKCODE 来做,这样大家可以见到用 CRACKCODE 来做注册机实在是太方便了,太简单了! 好,我们为 CRACKCODE 来写一个 INI 文件吧! 第一种写法(这是一种不提倡的写法!): 内存直接寻址的方法: [Options] CommandLine=Axplorer.exe 这是被取注册码的 EXE 文件名 Mode=0 采用模式 0 读取注册码 First_Break_Address=4149D2 程式的中断地址,它和 ICE 中见到的是一样的 First_Break_Address_Code=8A 中断程式的 1 Byte 代码,这个 8A 就是 015F: 的 8A First_Break_Address_Code_Lenth=2 中断行代码的长度(单位: byte ) Save_Code_Address=66F3E4 存放注册码的内存地址 第二种写法(这种值得推荐!) 寄存器间接寻址的方法: [Options] CommandLine=test.exe 这是被取注册码的 EXE 文件名(化名) Mode=0 取用模式 0 读取注册码 First_Break_Address=4149D2 程式的中断地址,它和 ICE 中见到的是一样的 First_Break_Address_Code=8A 中断程式的 1 Byte 代码,这个 8A 就是 015F: 的 8A First_Break_Address_Code_Lenth=2 中断行代码的长度(单位: byte ) Save_Code_Address=ECX 存放注册码的内存地址,这个 ECX 是从 015F: 来 的,大家见到了吧!这和上前的方法相差就只是这句, 当你使用了这句,就不怕软件是否被过了。 注意: 目前 CRACKCODE2000 对所中断地址的代码长度已经是无有要求的,只要把长度写进 INI 就可以了! 015F: 8A06 MOV AL,[ESI] 本行代码为 2 Bytes 015F:004149DA 41 INC ECX 本行代码为 1 Byte 015F: 803900 CMP BYTE PTR [ECX],00 本行代码为 3 Bytes 生成后保存为 CRACKCODE.INI 文件,把 CRACKCODE.EXE 和 CRACKCODE.INI 一起 copy 到被注册的 软件的安装目录下,运行 CRACKCODE.EXE 。哦!被取注册码的软件也运行了,到注册的窗口去,输入一个名字,随便输入注册码,按确定,哦!跳出一个显示窗来,里面出现了你想要的正确注册码了。是不是觉得很神奇呢!来试一试你就知道了! 好了,下面我再为大家显示 CrackCode2000 的另一种工作模式吧! 下面是 Decompile Winhelp 的注册机的写法,这个软件是加了壳的软件,我们来看一看加了壳 的软件对于 CrackCode2000 是否有影响 , 现在我把它注册码的部分那出来给大家看一看吧!而且它的注册码和硬件是有关系的,所以要想别人可以注册,就一定要写出注册机了! 下面就是它的比较程式了: 015f: 8d45c0 lea eax,[ebp-40] 015f:0040e4ac 8d55ac lea edx,[ebp-54] 015f:0040e4af 8a08 mov cl,[eax] ds:eax 放的是你输入的注册码 015f: 3a0a cmp cl,[edx] ds:edx 放的是正确的注册码 015f: 7516 jnz 0040e4cb 015f: 84c9 test cl,cl 015f: 746e jz
015f: 8a4801 mov cl,[eax+01] 015f:0040e4bc 3a4a01 cmp cl,[edx+01] 015f:0040e4bf 750a jnz 0040e4cb 015f: 83c002 add eax,02 015f: 83c202 add edx,02 015f: 84c9 test cl,cl 015f: 75e4 jnz 0040e4af 015f:0040e4cb 745a jz
在 winsoftice 里下以下命令可以见到: :d ds:eax C 34 34 34 34 34 34 34 34-34 34 34 34 34 34 00 00 44.. C 80 00 BC 58 C8 F3 6D 00-7E 51 46 00 8C 29 47 00 ...X..m.~QF..)G. C 1C F3 6D 00 14 00 00 00-00 00 78 83 F5 10 00 00 ..m.......x..... C 00 00 00 00 A0 0E 08 00-00 00 00 00 00 00 00 00 ................ :d ds:edx 8 32 39 34 46 41 41 38 36-33 30 44 30 35 39 00 58 294FAA.X 8 80 00 00 00 34 34 34 34-34 34 34 34 34 34 34 34 .... 8 34 34 00 00 80 00 BC 58-C8 F3 6D 00 7E 51 46 00 44.....X..m.~QF. 8 8C 29 47 00 1C F3 6D 00-14 00 00 00 00 00 78 83 .)G...m.......x. 好了,来段 INI 文件把帮它做一个注册机吧! [Options] CommandLine=Decompile Winhelp.exe 这是被取注册码的 EXE 文件名 Mode=0 采用模式 0 读取注册码 First_Break_Address=40E4AF 程式的中断地址,它和 ICE 中见到的是一样的 First_Break_Address_Code=8A 中断程式的 1 Byte 代码,这个 8A 就是 015f:0040e4af 的 8A First_Break_Address_Code_Lenth=2 中断行代码的长度(单位: byte ) Save_Code_Address=EDX 存放注册码的内存地址 生成后保存为 CRACKCODE.INI 文件,把 CRACKCODE.EXE 和 CRACKCODE.INI 一起 copy 到被注册的 软件的安装目录下,运行 CRACKCODE.EXE 。哦!被取注册码的软件也运行了,到注册的窗口去,随便输入足够数量的注册码,按确定,哦!跳出一个显示窗来,里面出现了你想要的正 确注册码了。是不是觉得很神奇呢!来试一试你就知道了!大家现在可以见到,用寄存器寻 址是多么好的一件事啊! 下面我们再来看一看 CrackCode2000 的另一个工作模式吧!以下是关于美萍网管大师 3.1 的注册 机的写法: 大家看一看这个软件的比较程式吧! 015f:bd8 mov ebx,eax 015f:0046075b b87c074600 mov eax,0046077c 015f:f000000 call
015f:bd8 cmp ebx,eax 这里的 ebx 就是放你台机器 015f:7 jnz
的正确的注册码了 015f:1000000 mov eax, 015f:b pop ebx 015f:0046076f c3 ret 好我们来写注册机了: [Options] CommandLine=scon.exe 这是被取注册码的 EXE 文件名 Mode=1 采用模式 1 读取注册码 First_Break_Address=460765 程式的中断地址,它和 ICE 中见到的是一样的 First_Break_Address_Code=3B 中断程式的 1 Byte 代码,这个 3B 就是 015f: 的 3B First_Break_Address_Code_Lenth=2 中断行代码的长度(单位: byte ) Save_Code_Address=EBX 存放注册码的内存地址 大家看到了吗?今次 CrackCode2000 使用了模式 1 来读取了,因为今次的注册码不是直接用 ASCII 的形式放在内存中的,而是用数值的形式放在寄存器处的,所以这时就要用模式 1 了。 生成后保存为 CRACKCODE.INI 文件,把 CRACKCODE.EXE 和 CRACKCODE.INI 一起 copy 到被注册的 软件的安装目录下,运行 CRACKCODE.EXE 。哦!被取注册码的软件也运行了,哦!软件一运行 注册码就出来了!哈哈。。。。。。 好了,我们再来进一步地研究 CrackCode 的加强模式吧!这是正式版本才具有的,二重断点读取注册码,这是 CrackCode 的增强模式,它可以使用二次重点的方法,来达到的目的,大 家可能还不了解为什么要这样做吧!好,让我们看一看下面这个软件,你就明白这是多么 的重要啊! 下面的实现例子是大家熟悉的 Winzip7.0 !好了开始吧!我们找到了它的比较程式了: 015f:a06 mov al,[esi] 输入的注册码 015f: inc esi 015f:a27 mov ah,[edi] 正确的注册码 015f: inc edi 015f:c4 cmp ah,al 015f:f2 jz 0045791c 015f:c41 sub al,41 015f:c1a cmp al,1a 015f:ac9 sbb cl,cl 015f:e120 and cl,20 015f:c1 add al,cl 015f:1 add al,41 015f:e0 xchg ah,al 015f:c41 sub al,41 015f:c1a cmp al,1a 015f:ac9 sbb cl,cl 015f:e120 and cl,20 015f:c1 add al,cl 015f:1 add al,41 015f:e0 cmp al,ah 015f:d2 jz 0045791c 我们在 winsoftice 中下以下的命令: :d ds:esi 8 34 38 34 38 34 38 34 38-34 38 00 00 00 00 00 00 ...... 8 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 8 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ :d ds:edi C 43 39 36 32 30 35 45 42-00 00 01 00 00 00 0A 00 C96205EB........ C D0 00 36 18 DA F4 0C 00-2C 20 0C 00 CE 1F 1A 84 ..6....., ...... C 3F 19 5C 84 97 0F 47 04-00 00 0A 00 00 00 0A 00 ?.\...G......... 看到了吗?那 ds:edi 放的就是你要的东西啊! 好了,我们先试一试用普通模式 0 来写注册机吧! [Options] CommandLine=winzip32.exe 这是被取注册码的 EXE 文件名 Mode=0 采用模式 1 读取注册码 First_Break_Address=457923 程式的中断地址,它和 ICE 中见到的是一样的 First_Break_Address_Code=8A 中断程式的 1 Byte 代码,这个 3B 就是 015f: 的 3B First_Break_Address_Code_Lenth=2 中断行代码的长度(单位: byte ) Save_Code_Address=EDI 存放注册码的内存地址 生成后保存为 CRACKCODE.INI 文件,把 CRACKCODE.EXE 和 CRACKCODE.INI 一起 copy 到被注册的 软件的安装目录下,运行 CRACKCODE.EXE 。哦! winzip 会说很多的 dll 找不到,不能正常运行。 哦!发生了什么事啊!好我们用 winsoftice 在那 cs:457923 下一个断点,重新运行 winzip , 哦!我们的 winsoftice 不断地中断,原来 winzip 的设计很特殊性,它会用比较注册码的程式来加载其它的 dll ,所以 CrackCode 的跟踪就不能正常地进行下去了。 好吧!我们再看一看程式吧!经过分析我们知道,上面的比较程式是由下面的程式调用去 做比较注册码的工作的。 015f: push eax 015f: push edi 015f:ab000000 call 00407cc6 带过这个 Call 在上面的 015f: pop ecx C 址中注册 015f:00407c1c be58d94700 mov esi, 码就出来了。 015f: pop ecx 015f:d85c0feffff lea eax,[ebp-0140] 015f: push esi 015f: push eax 015f:00407c2a e8d1fc0400 call
这个 Call 就是调用比较 015f:00407c2f f7d8 neg eax 注册码的 Call 了。 015f:bc0 sbb eax,eax 015f: pop ecx 015f: inc eax 015f: pop ecx 015f:cb04700 mov [0047b07c],eax 本来我们可以在上面出现了注册之后就找一个中断地址中断用模式 0 去取注册啊!但有一点你们切记,那是到了万不得意时才使用的,我们要尽可能地用寄存器寻址。所以我们使用增强模式来解决这个问题。好了,我们在出现了注册码和调用比较注册码程式的 Call 之间 找一个地址,但经过分析我选取 015f:00407c1c 这个地址,当然你也可以选择其它的。 下面大家看一看 INI 文件是如何写的: [Options] CommandLine=winzip32.exe 这是被取注册码的 EXE 文件名 Mode=2 采用增强模式 2 读取注册码 First_Break_Address=407C1C 程式的中断地址 1 ,它和 ICE 中见到的是一样的 First_Break_Address_Code=BE 中断程式的 1 Byte 代码,这个 3B 就是 015f:00407c1c 的 BE First_Break_Address_Code_Lenth=5 中断行代码的长度(单位: byte ) Second_Break_Address=457923 程式的中断地址 2 ,它和 ICE 中见到的是一样的 Second_Break_Address_Code_Lenth=2 中断行代码的长度(单位: byte ) Save_Code_Address=EDI 存放注册码的内存地址 生成后保存为 CRACKCODE.INI 文件,把 CRACKCODE.EXE 和 CRACKCODE.INI 一起 copy 到被注册的 软件的安装目录下,运行 CRACKCODE.EXE 。哦!被取注册码的软件也运行了,哦!软件一运行 注册码就出来了!哈哈。。。。。。
阅读本文后您有什么感想? 已有
人给出评价!
访问量多的

我要回帖

更多关于 机器码生成注册码 的文章

 

随机推荐