能力值:
( LV3,RANK:20 )
|
-
-
26 楼
现在已经出6.0 BETA了
注册码目前直接能用
没试那个算号器 :)
enterprise的应该是最强的
官方有个对照
|
能力值:
( LV9,RANK:170 )
|
-
-
27 楼
真棒,keygen算法
标 题: 【原创】SqlAssistant 5 注册过程分析 作 者: qazzaqqa 时 间: 2010-05-02,21:47:15 链 接: http://bbs.pediy.com/showthread.php?t=112231
111111111111 上传的附件 Sql Assistant 5.doc (743.5 KB, 138 次下载) [谁下载?]
|
能力值:
( LV3,RANK:20 )
|
-
-
28 楼
嘿嘿
等6.0 FINAL
然后最重要的是希望注册算法不用变 你们懂的
|
能力值:
( LV2,RANK:10 )
|
-
-
29 楼
谢谢,学习学习。
|
能力值:
( LV3,RANK:20 )
|
-
-
30 楼
HOHO, 不知是不是由于我以前在6.0 BETA的时候,5没卸载呢,还是注册信息没删掉
当时装6.0 BETA的时候没直接提示我注册码错误,我在上面就发了原注册码可用的回帖
后来我打开6.0 用的时候,确实是提示注册码失败了
现在FINAL了,我发现注册算法应该是变了一下,只不过变的非常的小,同样还是第1组码经过简单运算得到
我想想注册机源码能不能更简单点,或许用PYTHON写一下
|
能力值:
( LV3,RANK:20 )
|
-
-
31 楼
用才瞄了几眼的PYTHON写完了注册机,感觉代码优化的空间巨大
唯一变化的只有最关键的第一组注册码算法
#key1 由2,3与4,5拼起来的字符串,运算得到每组4个字符
def getKey1for6(str1,str2) :
return processKey1for6(str1)+processKey1for6(str2)
def processKey1for6(str) :
sum=0
for c in str:
if c!='-':
sum+=ord(c)
#print str(sum) +" "+str(hex(sum))
#print("%04X"%(1000*(sum%9)+sum))
return "%04X"%(1000*(sum%9)+sum)
==========
补充,还有另一处超搞笑的就是第2组前两位任意字符
|
能力值:
( LV9,RANK:170 )
|
-
-
32 楼
完整贴出来~~~~~~~~~~~~~
|
能力值:
( LV3,RANK:20 )
|
-
-
33 楼
这次用PYTHON写的是无比精简的KeyGen
直接取了其中一种能验证通过的代码
import random
import string
import sys
def getStrSum(str) :
sum=0
for c in str:
sum+=string.atoi(c)
return sum
def getKey1for6(str1,str2) :
return processKey1for6(str1)+processKey1for6(str2)
def processKey1for6(str) :
sum=0
for c in str:
sum+=ord(c)
return "%04X"%(1000*(sum%9)+sum)
def getKey3(num):
key=""
str = "123456789abcdefghikjlmnopqrstuv".upper();
base=1073741824
while base>0:
if num/base>0 :
i=num/base
num=num-i*base
base/=32
key+=str[i-1]
else :
base/=32
key+="0"
continue
return key
def genLicense() :
key2 = "%06d"%random.randint(0,999999)
licType="E"
strMOrL="M"
key4LastTwo=string.join(random.sample("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 2)).replace(" ","")
key4=licType+strMOrL+key4LastTwo
key5FirstTwo=getStrSum(key2)+22
bigStrVal=100000*key5FirstTwo+0x80000000-1+string.atoi(key2[-2:])
key5LastTwo=getStrSum(str(bigStrVal))+22
key5=str(key5FirstTwo)+str(key5LastTwo)
key3=getKey3(bigStrVal)
key1=getKey1for6(key2+key3,key4+key5)
print key1+"-DD"+key2+"-"+key3+"-"+key4+"-"+key5
genLicense()
python 源文件要注意缩进
我总觉得 getStrSum,getKey3 可以变的更精简
HAHA 我忘记说下了,这回,第2组注册码,由原来的6位变成8位
但第2组前两位可以是任意字符,注册算法同5.X第一轮判断第一组码是否正确
然后后面的算法和4.X一样,取的是第2组第3个字符开始,前面两位略掉了:)
楼下的HTM版,抄的好成功啊,同样加两个字符就OK了
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
原来在key2前还要加上"DD", 现在行了.
v6.0.70 安装包下载点:
http://good.gd/1578572.htm
v6.xx keygen 下载点:
http://good.gd/1578563.htm
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>SQL Assistant v5.xx Key Generator</title>
<style type="text/css">
</style>
<script language="javascript" type="text/javascript">
var toInt = function(x) { return Math.floor(x); }
var randInt = function () { return toInt(Math.random() * Math.pow(2, 32)); }
var licType,
strMOrL,
log = true,
bigNoFlag;
window.onload = function() {
licType = 'E';
document.getElementById("thekey").innerHTML = getLicense();
}
// "E" : Enterprise Edition
// "P" : Professional Edition
// "S" : Site Edition
// "1" : Standard Edition
function genkey(e)
{
// get either event (W3C) or
// window event object (MSIE)
e = e || window.event;
// get either target (W3C) or event source (MSIE)
var t = e.target || e.srcElement;
switch(t.value) {
case '1': case 'S': case 'P': case 'E':
licType = t.value;
document.getElementById("thekey").innerHTML = getLicense();
//alert("Sql Assistant 5 Key:\r\n" + getLicense());
break;
default:
}
}
function getLicense() {
// 注册码格式 key0 key1 key2 key3 key4 以 - 分隔
// xx-xx-xx-xx-xx
// Example:
// Standard 版
// 030401EE-902943-3W4LH6A-1MOL-4953
var key0 = '',
key1 = '',
key2 = '',
key3 = '',
key4 = '';
// step 1 生成000000-999999随机字符 xx(key1)
// step 2 将上一步6位数每位数值相加再+22,作最后一组(key4)前两位字符
// step 3 先获得注册类型xxxx 后的1位 值 是 x 或x,计算出一个值
// 如果是 x,要满足
// 1+值(2153483746)- 第2组最后两字符数值 99 +100000 * 第5组前两字符数值
// 或
// 1+值(3227225570)- 第2组最后两字符数值 99 +100000 * 第5组前两字符数值
// 如果是 xx ,要满足
// 16+值(2153483731)- 第2组最后两字符数值 99 +100000 * 第5组前两字符数值
// 或
// 16+值(3227225555)- 第2组最后两字符数值 99 +100000 * 第5组前两字符数值
// 根据step3 值,计算key4最后两字符
// 如果=2153483746,各位数值相加再+22 =65
// step 4 生成key2,满足
// 字符先反向,然后取每位在字符串xxxxxxxxxx中的索引值,再乘上以1为初值,32倍递增的基数
// 加起来=step3中的值
// step 5 key3的生成
// 第一位,注册类型, xxxxx
// 第二位,随机是 x 或 xxx
// 后两位随机生成
// step 6 key0
// 由key1,key2拼接与key3,key4拼接的字符串,每位ASCII数值相加,得到各4位一组,一共8位的16进制字符
if (randInt() % 2 > 0)
strMOrL = "M";
else
strMOrL = "L";
if (randInt() % 2 > 0)
bigNoFlag = 1;
else
bigNoFlag = 0;
key3 = licType + strMOrL + getRandomString2();
// 生成000000-999999随机字符
var ikey1 = randInt() % 999999 + 0;
key1 = padZero(ikey1, 6, 10);
// key4前两字符
var firstTwoLetterOfKey4 = getStrSum(key1, 0, 6) + 22;
// 此值为key3进行计算后乘出的值
var value = getValue(key1, firstTwoLetterOfKey4);
var lastTwoLetterOfKey4 = getLastTwoLetterOfKey4(value);
key4 = '' + firstTwoLetterOfKey4 + '' + lastTwoLetterOfKey4;
key2 = getKey2(value);
key0 = getKey0(key1 + key2, key3 + key4);
return key0 + "-DD" + key1 + "-" + key2 + "-" + key3 + "-" + key4;
}
function getStrSum(str, start, len) {
var result = 0;
for (var i = start; i < len; i++)
result += parseInt(str.charAt(i));
return result;
}
/*
function getFirstTwoLetterOfKey4()
{
return randInt() % 54 + 22;
}
*/
function getValue(key1, digits)
{
var lastTwoLetterOfKey1 = key1.substr(key1.length - 2);
var i3 = parseInt(lastTwoLetterOfKey1);
if(strMOrL == 'M') {
if(bigNoFlag == 0)
i3 += 2147483647 + 100000 * digits;
else
i3 += 3221225471 + 100000 * digits;
}
else {
if(bigNoFlag == 0)
i3 += 3221225456 + 100000 * digits;
else
i3 += 2147483632 + 100000 * digits;
}
return i3;
}
function getLastTwoLetterOfKey4(value) {
var s = value.toString(),
result = 0;
for (var i = 0; i < s.length; i++)
result += parseInt(s.charAt(i));
result += 22;
return result;
}
function getKey2(num)
{
var result = '',
str = '123456789ABCDEFGHIKJLMNOPQRSTUV',
base = 1073741824;
while (base > 0) {
if (toInt(num / base) > 0) {
var i = toInt(num / base);
// result += i;
num = num - i * base;
result += str.charAt(i - 1);
}
else {
// 取个不在字符串中的字符,最简单的是取0
result += getRandomString1();
// result += "0";
}
base = toInt(base / 32);
}
return result;
}
function getKey0(str1, str2)
{
var result = 0;
for (var i = 0; i < str1.length; i++)
result += str1.charCodeAt(i);
str1 = padZero((toInt(result % 9) * 1000 + result), 4, 16);
result = 0;
for (var i = 0; i < str2.length; i++)
result += str2.charCodeAt(i);
str2 = padZero((toInt(result % 9) * 1000 + result), 4, 16);
return str1 + str2;
}
function padZero(num, len, radix)
{
var zs = new Array(len + 1).join('0');
return (zs.substr(num.toString(radix).length) + num.toString(radix)).toUpperCase();
}
function getRandomString1()
{
var ri = randInt() % 5 + 87;
if(ri > 90)
ri = 48;
return String.fromCharCode(ri);
}
function getRandomString2()
{
var sb = '';
for (var i = 0; i < 2; i++) {
var ri = randInt() % 28 + 65;
if(ri > 90)
ri = randInt() % 10 + 48;
sb += String.fromCharCode(ri);
}
return sb;
}
</script>
</head>
<body width="50%">
<h1 align="center" class="regsel" lang="en">SQL Assistant v6.xx<br>Key Generator</h1>
<div align="center">
<table>
<tr><td align="left">
<input type=radio name="regtype" value="E" onclick="genkey(event);" checked>Enterprise Edition<br>
<input type=radio name="regtype" value="P" onclick="genkey(event);">Professional Edition<br>
<input type=radio name="regtype" value="S" onclick="genkey(event);">Site Edition<br>
<input type=radio name="regtype" value="1" onclick="genkey(event);">Standard Edition<br>
</td></tr>
</table>
<br>
<br>
<div id="thekey"></div>
</div>
<br>
</body>
</html>
|
能力值:
( LV3,RANK:20 )
|
-
-
35 楼
呀,我的昵称被暴露了
我觉得还需要为这个软件做两件事
1,汉化
2,字体变大,其实已经包含在了第一步中
我以前做过自己用了,现在直接用英文版了
最后要感谢这公司没将它加壳,混淆。。。。
IDA HEX-RAYS F5 直接得到了无比清晰的代码
|
能力值:
( LV9,RANK:170 )
|
-
-
36 楼
wonderful work
thanks
|
|
|