能力值:
( 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 ; 授权码正确
|
能力值:
( 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个字节是不变的,不知作者注意到没。
|