首页
社区
课程
招聘
[转帖]SoftTree SQL Assistant v5.1.7.0 (x86/x64) [full]
发表于: 2010-8-30 08:11 12810

[转帖]SoftTree SQL Assistant v5.1.7.0 (x86/x64) [full]

2010-8-30 08:11
12810
收藏
免费 1
支持
分享
最新回复 (35)
雪    币: 149
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
26
现在已经出6.0 BETA了
注册码目前直接能用

没试那个算号器 :)
enterprise的应该是最强的
官方有个对照
2011-8-12 16:15
0
雪    币: 370
活跃值: (15)
能力值: ( 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 次下载) [谁下载?]
2011-8-13 09:37
0
雪    币: 149
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
28
嘿嘿
等6.0 FINAL
然后最重要的是希望注册算法不用变 你们懂的
2011-8-13 15:48
0
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
谢谢,学习学习。
2011-8-31 17:51
0
雪    币: 149
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
30
HOHO, 不知是不是由于我以前在6.0 BETA的时候,5没卸载呢,还是注册信息没删掉
当时装6.0 BETA的时候没直接提示我注册码错误,我在上面就发了原注册码可用的回帖

后来我打开6.0 用的时候,确实是提示注册码失败了
现在FINAL了,我发现注册算法应该是变了一下,只不过变的非常的小,同样还是第1组码经过简单运算得到
我想想注册机源码能不能更简单点,或许用PYTHON写一下
2011-9-6 11:27
0
雪    币: 149
活跃值: (41)
能力值: ( 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组前两位任意字符
2011-9-7 11:32
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
32
完整贴出来~~~~~~~~~~~~~
2011-9-7 11:39
0
雪    币: 149
活跃值: (41)
能力值: ( 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了
2011-9-7 13:25
0
雪    币: 84
活跃值: (90)
能力值: ( 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>
2011-9-7 13:26
0
雪    币: 149
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
35
呀,我的昵称被暴露了
我觉得还需要为这个软件做两件事
1,汉化
2,字体变大,其实已经包含在了第一步中

我以前做过自己用了,现在直接用英文版了

最后要感谢这公司没将它加壳,混淆。。。。
IDA HEX-RAYS F5 直接得到了无比清晰的代码
2011-9-7 13:55
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
36
wonderful work
thanks
2011-9-8 14:30
0
游客
登录 | 注册 方可回帖
返回
//