首页
社区
课程
招聘
[讨论]飞秋2013的授权码算法好复杂,能写注册机?
发表于: 2013-5-3 19:43 36434

[讨论]飞秋2013的授权码算法好复杂,能写注册机?

2013-5-3 19:43
36434
飞秋2013版在2013年4月15日正式发布,其授机码算法和以前版本不一样,看样飞秋成立公司后,算法加强了,如果将其用于注册的话,个人觉得很强了(个人能力不足吧)。内存中不会出现生成的授权码即明码。
近几天的分析如下:
1.授权码用到了随机数,这个随机数在计算和验证中扮演重要角色;
2.用到一个长12字节的表,计算函数返回值为表中的其中一位值时即可注册成功;
3.程序有60个子计算函数,由随机数MOD 61决定调用哪一个;

用代码说明授权成功的关键:
//生成随机数
myradomtemp = (double)BuildRandom();
//一些随机数处理
myradomtemp = myradomtemp/32767.0*1000.0;
//转换成INT类型
myradom = (int)myradomtemp;
//用到的表
BYTE        SQCheckSum[13] = {0x02,0x03,0x04,0x05,0x08,0x0c,0x0d,0x1c,0x43,0xbe,0xc4,0xc9};
        msg.Empty();
        for(int i=0;i<12;i++)
        {
                SQCheckSum[i] += 0x09;                //0x09假设是授权等级
       }
//取12的余数(因为计算机标识码长12位,可能授权码也是12位)
myradom %= 12;
if(myradom < 0 || myradom >=12)
        myradom = 0;
msg.Format("%f        %d        结果应该为:%02X",myradomtemp,myradom,SQCheckSum[myradom]);
        AfxMessageBox(msg);
//下面返回等于SQCheckSum[myradom]即授权成功
        sub_0086E1C0((int)myradomtemp);
/*
        //sub_0086E1C0授权比较,CS1:录入授权码,CS2:标识码,CS3:授权等级,CS4:随机数
       //有60个函数由参数四决定执行哪个
        //SQCheckSum[myradom]这个值可以提前计算出来
        if(SQCheckSum[myradom] = sub_0086E1C0(CS1, CS2, CS3, CS4))
                授权成功
*/
}
//产生随机数
DWORD CMyDlg::BuildRandom()
{
        DWORD        aa = ::GetTickCount();
//        aa = 0xBCEA0855;
        aa *= 0x343FD;
        aa += 0x269EC3;
        return (aa >> 0x10) & 0x7FFF;
}

说实话,我用自写的调试器分析sub_0086E1C0这个函数发现执行了15万行代码,有N多调用头都大了。还有OD对MessageBoxW,MessageBoxA下断点,只能中断授权等级出错(即授权等为大于9的提示),其它中断不了,内存中查不到中文提示....
有时在想,这么复杂能分析出来?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 246
活跃值: (91)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
.text:007CEDB9                 call    sub_BD8269      ; 是否在允许的等级范围内
.text:007CEDBE                 test    eax, eax
.text:007CEDC0                 jnz     short loc_7CEDC7
.text:007CEDC2                 jmp     loc_7CF458
.text:007CEDC7 ; ---------------------------------------------------------------------------
.text:007CEDC7
.text:007CEDC7 loc_7CEDC7:                             ; CODE XREF: sub_7CED80+40j
.text:007CEDC7                 call    sub_D7A31F      ; 产生随机数
.text:007CEDCC                 mov     [ebp+var_134], eax
.text:007CEDD2                 fild    [ebp+var_134]
.text:007CEDD8                 fdiv    ds:dbl_F5A630
.text:007CEDDE                 fmul    ds:dbl_F5A4A0   ; (double)v3 / 32767.0 * 1000.0
.text:007CEDE4                 call    sub_D7A140      ; 将产生的随机数经过/32767.0*1000.0结果转换为整数
.text:007CEDE9                 mov     [ebp+var_10], eax
.text:007CEDEC                 mov     eax, [ebp+var_10]
.text:007CEDEF                 push    eax
.text:007CEDF0                 mov     ecx, [ebp+var_130]
.text:007CEDF6                 mov     edx, [ecx+0A0h]
.text:007CEDFC                 push    edx
.text:007CEDFD                 push    ecx
.text:007CEDFE                 mov     eax, esp
.text:007CEE00                 mov     [ebp+var_38], esp
.text:007CEE03                 mov     [ebp+var_70], eax
.text:007CEE06                 mov     ecx, [ebp+var_130]
.text:007CEE0C                 mov     edx, [ecx+98h]
.text:007CEE12                 sub     edx, 10h
.text:007CEE15                 mov     [ebp+var_58], edx
.text:007CEE18                 mov     eax, [ebp+var_58]
.text:007CEE1B                 push    eax
.text:007CEE1C                 call    sub_40D830
.text:007CEE21                 add     esp, 4
.text:007CEE24                 mov     [ebp+var_5C], eax
.text:007CEE27                 mov     ecx, [ebp+var_5C]
.text:007CEE2A                 add     ecx, 10h        ; 出现计算机标识码
.text:007CEE2D                 mov     edx, [ebp+var_70]
.text:007CEE30                 mov     [edx], ecx
.text:007CEE32                 mov     eax, [ebp+var_70]
.text:007CEE35                 mov     [ebp+var_138], eax
.text:007CEE3B                 mov     [ebp+var_4], 0
.text:007CEE42                 push    ecx
.text:007CEE43                 mov     ecx, esp
.text:007CEE45                 mov     [ebp+var_3C], esp
.text:007CEE48                 mov     [ebp+var_8C], ecx
.text:007CEE4E                 mov     edx, [ebp+var_130]
.text:007CEE54                 mov     eax, [edx+9Ch]
.text:007CEE5A                 sub     eax, 10h
.text:007CEE5D                 mov     [ebp+var_74], eax
.text:007CEE60                 mov     ecx, [ebp+var_74]
.text:007CEE63                 push    ecx
.text:007CEE64                 call    sub_40D830      ; 计算,CS1:返回地址,CS2:标识码,CS3:标识码,CS4:等级
.text:007CEE69                 add     esp, 4
.text:007CEE6C                 mov     [ebp+var_78], eax
.text:007CEE6F                 mov     edx, [ebp+var_78]
.text:007CEE72                 add     edx, 10h        ; 出现录入注册码
.text:007CEE75                 mov     eax, [ebp+var_8C]
.text:007CEE7B                 mov     [eax], edx
.text:007CEE7D                 mov     ecx, [ebp+var_8C]
.text:007CEE83                 mov     [ebp+var_13C], ecx
.text:007CEE89                 mov     [ebp+var_4], 0FFFFFFFFh
.text:007CEE90                 call    sub_86E1C0      ; 授权比较,CS1:录入授权码,CS2:标识码,CS3:授权等级,CS4:随机数结果
.text:007CEE95                 add     esp, 10h
.text:007CEE98                 mov     [ebp+var_140], eax ; 这个值很关键
.text:007CEE9E                 mov     edx, [ebp+var_140]
.text:007CEEA4                 mov     [ebp+var_14], edx
.text:007CEEA7                 cmp     [ebp+var_14], 0 ; 是否是成功比较,成功的结果为:
.text:007CEEA7                                         ; Sub_86E1C0返回的结果,要主表SQCheckSum[]中其中的一位,是哪一位呢?
.text:007CEEA7                                         ; 这个序数=上面产生随机数 MOD 12
.text:007CEEA7                                         ; 相同则成功
.text:007CEEAB                 jnz     short loc_7CEEE9 ; 成功跳走
.text:007CEEAD                 mov     eax, [ebp+var_130]
.text:007CEEB3                 mov     ecx, [eax+94h]
.text:007CEEB9                 mov     [ebp+var_90], ecx
.text:007CEEBF                 push    40h
.text:007CEEC1                 push    offset aCY      ; "衏:y"
.text:007CEEC6                 mov     edx, [ebp+var_90]
.text:007CEECC                 push    edx
.text:007CEECD                 mov     eax, [ebp+var_130]
.text:007CEED3                 mov     ecx, [eax+20h]
.text:007CEED6                 push    ecx
.text:007CEED7                 call    sub_539A70      ; 提示授权码不正确
.text:007CEEDC                 add     esp, 10h
.text:007CEEDF                 jmp     loc_7CF458
.text:007CEEE4 ; ---------------------------------------------------------------------------
.text:007CEEE4                 jmp     loc_7CF458
.text:007CEEE9 ; ---------------------------------------------------------------------------
.text:007CEEE9
.text:007CEEE9 loc_7CEEE9:                             ; CODE XREF: sub_7CED80+12Bj
.text:007CEEE9                 mov     [ebp+var_24], 2
.text:007CEEED                 mov     [ebp+var_23], 3
.text:007CEEF1                 mov     [ebp+var_22], 4
.text:007CEEF5                 mov     [ebp+var_21], 5
.text:007CEEF9                 mov     [ebp+var_20], 8
.text:007CEEFD                 mov     [ebp+var_1F], 0Ch
.text:007CEF01                 mov     [ebp+var_1E], 0Dh
.text:007CEF05                 mov     [ebp+var_1D], 1Ch
.text:007CEF09                 mov     [ebp+var_1C], 43h
.text:007CEF0D                 mov     [ebp+var_1B], 0BEh
.text:007CEF11                 mov     [ebp+var_1A], 0C4h
.text:007CEF15                 mov     [ebp+var_19], 0C9h
.text:007CEF19                 mov     [ebp+var_28], 0
.text:007CEF20                 jmp     short loc_7CEF2B
.text:007CEF22 ; ---------------------------------------------------------------------------
.text:007CEF22
.text:007CEF22 loc_7CEF22:                             ; CODE XREF: sub_7CED80+1CCj
.text:007CEF22                 mov     edx, [ebp+var_28]
.text:007CEF25                 add     edx, 1
.text:007CEF28                 mov     [ebp+var_28], edx
.text:007CEF2B
.text:007CEF2B loc_7CEF2B:                             ; CODE XREF: sub_7CED80+1A0j
.text:007CEF2B                 cmp     [ebp+var_28], 0Ch
.text:007CEF2F                 jge     short loc_7CEF4E
.text:007CEF31                 mov     eax, [ebp+var_28]
.text:007CEF34                 movzx   ecx, [ebp+eax+var_24]
.text:007CEF39                 mov     edx, [ebp+var_130]
.text:007CEF3F                 add     ecx, [edx+0A0h] ; 这个EDX+0A0]是授权等级
.text:007CEF45                 mov     eax, [ebp+var_28]
.text:007CEF48                 mov     [ebp+eax+var_24], cl
.text:007CEF4C                 jmp     short loc_7CEF22
.text:007CEF4E ; ---------------------------------------------------------------------------
.text:007CEF4E
.text:007CEF4E loc_7CEF4E:                             ; CODE XREF: sub_7CED80+1AFj
.text:007CEF4E                 mov     eax, [ebp+var_10]
.text:007CEF51                 cdq
.text:007CEF52                 mov     ecx, 0Ch
.text:007CEF57                 idiv    ecx
.text:007CEF59                 mov     [ebp+var_10], edx
.text:007CEF5C                 cmp     [ebp+var_10], 0
.text:007CEF60                 jl      short loc_7CEF68
.text:007CEF62                 cmp     [ebp+var_10], 0Ch
.text:007CEF66                 jl      short loc_7CEF6F
.text:007CEF68
.text:007CEF68 loc_7CEF68:                             ; CODE XREF: sub_7CED80+1E0j
.text:007CEF68                 mov     [ebp+var_10], 0
.text:007CEF6F
.text:007CEF6F loc_7CEF6F:                             ; CODE XREF: sub_7CED80+1E6j
.text:007CEF6F                 mov     edx, [ebp+var_10]
.text:007CEF72                 movzx   eax, [ebp+edx+var_24]
.text:007CEF77                 cmp     eax, [ebp+var_14] ; 授权码比较
.text:007CEF7A                 jl      loc_7CF419
.text:007CEF80                 mov     ecx, [ebp+var_10] ; 不成功跳
.text:007CEF83                 movzx   edx, [ebp+ecx+var_24]
.text:007CEF88                 cmp     edx, [ebp+var_14]
.text:007CEF8B                 jg      loc_7CF419
.text:007CEF91                 push    40h
.text:007CEF93                 push    offset unk_E9E110
.text:007CEF98                 push    offset unk_E9E100
.text:007CEF9D                 mov     eax, [ebp+var_130]
.text:007CEFA3                 mov     ecx, [eax+20h]
.text:007CEFA6                 push    ecx
.text:007CEFA7                 call    sub_539A70      ; 授权码正确
2013-5-3 19:45
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
飞秋不是免费的吗,局域网使用很方便
2013-5-3 20:45
0
雪    币: 10631
活跃值: (3549)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
为什么要注册吗?
直接跳转不好吗?
feiQ本来就免费,注册只是有几颗星。
2013-5-3 21:10
0
雪    币: 411
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看主页写的是共享版啊.
没有明码比较的,都不好弄.
2013-5-4 20:59
0
雪    币: 246
活跃值: (91)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
原先是对授权码计算正向分析,最近反向分析操作。
需要的准备:对标准BlowFish加/解密有了解,对CryptAPI操作有了解。
虽然囫囵吞枣的看过《应用密码学》,但对BlowFish具体怎样实现还没搞过,baidu出来的代码全都是收钱的(为啥要收钱钱?),没办法,于是自已动手将网上下的BlowFish工具反编译还原为C代码。
关于CryptAPI以前从来没接触过,在网上狠找,找来找去就是VC知识两篇要详细点,对照这两篇文章,再去下VC6的MSDN,结合作学习,终于可以操作对称/非对称加密了(签名嘛,暂时好像用不上),导出1024位RSA公/私钥和飞秋的对比....
说了一堆P话,最新情况如下(离注册机还早呢):

授权计算时,我先假设用了BlowFish算法,先对BlowFish的Pbox盒下内存访问断点,看是否有执行这个算法,结果还真有(原来我跟踪到这段代码的,只是不知道是BlowFish,飞秋将F盒函数功能放在加密函数内部,一大段代码,也没执行循环,代码N长,所以要搞懂算法呀)。程序用密钥在初始化Pbox和Sbox盒,执行的是解密操作(这里说明下,如果启动时对初始化下断点,你会看到用不同的密钥加/解密多次公/私钥),解密的东东以及解密出来的东东,一点和标识码与录入授权码没关系样,完全不懂。

于是我再假设待解密的内容是标识码或录入授权码操作的结果,或者解密的密钥是这类情况,对标识码、录入授权码下内存断点,没想到又蒙到了,于是搞明白了录入授权码、密钥、待解密内容的关系。

密钥:
在前面帖子我提到了一个表,这个表是密钥(与授权等级有关):
//这个key是等级为9级时用的,如为8级,则每位减0x01,依次类推,如8级\x0a\x0b\x0c\x0d\x10.......
        char        testkey[]="\x0B\x0C\x0D\x0E\x11\x15\x16\x25\x4C\xC7\xCD\xD2";

待解密内容:
这个有些复杂,假设录入的授权码:unsigned char        FeiqSq[]="EFGHIJKLMNOP";//飞秋录入的授权码
经过移位变换变成:10 51 87 20 92 8b 30 d3 8f 00 00 00
解密:
填充成长度MOD 8的整倍数,执行解密(每次解8个字节,执行两次)
第二次解密结果的两个DWOR值与原文前两个DWORD值XOR后,为最终解密结果

关键来了,取解密结果最后一个字节减1,大于等于7失败,取解密结果的第N位,N=解密长度-最后一个字节,如果第N位=最后一位,将第N位置0,然后返回N(必须返回非0值,才有可能授权成功)。

目前撑握的情况只有穷举法实现授权计算...
再下来,后面还有N多代码,慢慢来....
我在想,飞秋如果用非对称加密方式进行授权码注册方式,也有可能写出注册机,因为程序有导出私钥和公钥...只是有可能。
还有跟踪到聊天时消息的加密通讯,有可能做出嗅探器还原加密消息,原因为飞秋加密通迅时,只用了公钥的前16个字节,在多台机器上实验,发现公钥前16个字节是不变的,不知作者注意到没。
2013-5-16 23:44
0
雪    币: 114
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
很好呀,进来向楼主学习了.
2013-5-17 00:06
0
雪    币: 510
活跃值: (433)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
8
这游戏好玩,加油加油
2013-5-17 20:35
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
今天我走的是小清新路线,所以,我只是轻轻地
2013-5-17 22:15
0
雪    币: 67
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我也分析过,头都大的!追半天没结果..
2013-7-25 21:19
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我还是用的最早的版本,不带网络验证什么的
局域网使用非常方便
2013-8-11 16:12
0
雪    币: 807
活跃值: (2248)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
捷径是爆破,60个子计算函数逐个关照。
2013-8-11 21:36
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
13
不错喔兄弟,feiq复活了吗?
2013-8-12 14:20
0
游客
登录 | 注册 方可回帖
返回
//