vipcrack 发表于 2014-9-4 11:00:06

领航教育6算法分析与注册机核心代码

本帖最后由 vipcrack 于 2014-9-4 11:03 编辑

涉及到商业版权,注册机源码和分析里省略掉N个码表的信息。


印象中是第2次见到利用汉字字符串作为加密算法取值的软件了,以高中版程序为例:

固定字符串为:

C7 AC B6 D2 C0 EB D5 F0 D9 E3 BF B2 F4 DE C0 A4乾兑离震巽坎艮坤

而小学的是:

87 55 8E 7E C9 EE 83 CC 8B 9B C5 DC            嘦巭深兲嫑跑....

下面以高中程序进行调试,简单记录算法过程

0059CCFD|.50             push    eax
0059CCFE|.B9 D4CF5900    mov   ecx, 0059CFD4                  ;字符串
0059CD03|.BA E4CF5900    mov   edx, 0059CFE4                  ;系统本地信息
0059CD08|.8BC6         mov   eax, esi
0059CD0A|.8B30         mov   esi, dword ptr
0059CD0C|.FF16         call    dword ptr                   ;    function ReadString(const Section, Ident, Default: string): string; override
0059CD0E|.8B45 D4      mov   eax, dword ptr       ;堆栈 ss:=00E7B70C, (ASCII "4B4E")
0059CD11|.8D55 EC      lea   edx, dword ptr
0059CD14|.E8 8BC3E6FF    call    004090A4                         ;   function Trim(const S: string): string
0059CD19|.8D45 D0      lea   eax, dword ptr
0059CD1C|.50             push    eax
0059CD1D|.A1 DC566300    mov   eax, dword ptr
0059CD22|.8B00         mov   eax, dword ptr
0059CD24|.B9 FCCF5900    mov   ecx, 0059CFFC                  ;乾兑离震巽坎艮坤
0059CD29|.8B55 EC      mov   edx, dword ptr
0059CD2C|.E8 178C0000    call    005A5948                         ;机器码前4个字母4B4E跟字串C7 AC B6 D2 C0 EB D5 F0 D9 E3 BF B2 F4 DE C0 A4处理
0059CD31|.8B45 D0      mov   eax, dword ptr
0059CD34|.8D55 E8      lea   edx, dword ptr
0059CD37|.E8 68C3E6FF    call    004090A4                         ;   function Trim(const S: string): string
0059CD3C|.8B55 E8      mov   edx, dword ptr       ;处理结果转换成ASIIC数字,然后查表
0059CD3F|.8BC3         mov   eax, ebx
0059CD41|.E8 9A030000    call    0059D0E0
0059CD46|.8D45 CC      lea   eax, dword ptr
0059CD49|.50             push    eax
0059CD4A|.A1 DC566300    mov   eax, dword ptr
0059CD4F|.8B00         mov   eax, dword ptr
0059CD51|.B9 FCCF5900    mov   ecx, 0059CFFC                  ;乾兑离震巽坎艮坤
0059CD56|.8B93 28030000mov   edx, dword ptr        ;查表结果(ASCII "A8A8CDB8AEA8ABC1CFC5B2BFA4CACDBA")
0059CD5C|.E8 E78B0000    call    005A5948                         ;处理查表结果和固定字符串倒序的XOR,然后再跟机器码第2部分XOR处理操作
0059CD61|.8B45 CC      mov   eax, dword ptr
0059CD64|.8D55 E4      lea   edx, dword ptr
0059CD67|.E8 38C3E6FF    call    004090A4
0059CD6C|.E8 2BE9E6FF    call    0040B69C
0059CD71|.83C4 F8      add   esp, -0x8                        ; /
0059CD74|.DD1C24         fstp    qword ptr                   ; |Arg1 (8 字节)
0059CD77|.9B             wait                                     ; |
0059CD78|.8D55 F4      lea   edx, dword ptr          ; |
0059CD7B|.B8 18D05900    mov   eax, 0059D018                  ; |yyyymmdd
0059CD80|.E8 E7F5E6FF    call    0040C36C                         ; \领航6教?0040C36C
0059CD85|.8D45 F8      lea   eax, dword ptr
0059CD88|.50             push    eax
0059CD89|.8D55 C8      lea   edx, dword ptr
0059CD8C|.8B83 20030000mov   eax, dword ptr
0059CD92|.E8 9DDBECFF    call    0046A934
0059CD97|.8B45 C8      mov   eax, dword ptr
0059CD9A|.E8 6D79E6FF    call    0040470C                         ;   function _LStrLen(const s: AnsiString): Longint
0059CD9F|.83E8 04      sub   eax, 0x4
0059CDA2|.50             push    eax
0059CDA3|.8D55 C4      lea   edx, dword ptr
0059CDA6|.8B83 20030000mov   eax, dword ptr
0059CDAC|.E8 83DBECFF    call    0046A934
0059CDB1|.8B45 C4      mov   eax, dword ptr
0059CDB4|.BA 05000000    mov   edx, 0x5
0059CDB9|.59             pop   ecx
0059CDBA|.E8 AD7BE6FF    call    0040496C
0059CDBF|.8D45 FC      lea   eax, dword ptr
0059CDC2|.50             push    eax
0059CDC3|.A1 DC566300    mov   eax, dword ptr
0059CDC8|.8B00         mov   eax, dword ptr
0059CDCA|.8B4D E4      mov   ecx, dword ptr
0059CDCD|.8B55 F8      mov   edx, dword ptr
0059CDD0|.E8 BB8D0000    call    005A5B90                         ;机器码第2部分HEX每位跟查表结果循环每位正序XOR处理

没装程序,这个CALL的代码我省略掉了。

机器码格式494ELHCZDJB-CZSXRJXKB-Z2A8248X其中前4位是随机数得到,每次启动程序都不同,应该跟系统时间有关
机器码处理分为两部分——494E和   LHCZDJB-CZSXRJXKB-Z2A8248X(根据硬盘信息获取处理后的)

处理过程:
1、首先C7 AC B6 D2 C0 EB D5 F0 D9 E3 BF B2 F4 DE C0 A4乾兑离震巽坎艮坤 是固定字符串,与第一部分进行数据XOR处理,处理方式:
   倒序上面的字符串得到新字符串 A4 C0 DE F4 B2 BF E3 D9 F0 D5 EB C0 D2 B6 AC C7
   49 4E的计算步骤:
   49 4E分别跟   A4进行XOR得到新字符串:   49 XOR A4 和 4E XOR A4 得到新字符串:ED EA
   ED EA分别跟   C0进行XOR得到新字符串:2D 2A

   2D 2A分别跟   DE进行XOR得到新字符串:
   一直处理完成得到新字符串xx xx,XX组成的ASCII数字,就是查表的数值,比如得到数据位3130,则查表位是10,对应的码表假设是: CFC5B6C3CED3BCB7AEA8B68FC9C9
2、和上面4位字符处理一样,用CF C5 B6 C3 CE D3 BC B7 AE A8 B6 8F C9 C9的每2位跟字符串 A4 C0 DE F4 B2 BF E3 D9 F0 D5 EB C0 D2 B6 AC C7的每一位XOR
   CF C5 B6 C3 CE D3 BC B7 AE A8 B6 8F C9 C9分别XOR A4,得到新字符串,新字符串每位继续XOR C0,一直到结束,得到新字符串。

1,2步的循环可以简化:C7 AC B6 D2 C0 EB D5 F0 D9 E3 BF B2 F4 DE C0 A4 先每位XOR,得到的结果是0x78,直接用前4位每2位XOR,得到新字符串查表。
                     查表的结果再和0x78处理得到新字符串,新字符串自己XOR,得到一个数值,这个数值和机器码第2部分的HEX字符串处理即可。

3、把机器码第2部分字符的HEX进行连接组成新字符串:LHCZDJB-CZSXRJXKB-Z2A8248X转换为:"4C48435A444A422D435A5358524A584B422D5A32413832343858"
   用"4C48435A444A422D435A5358524A584B422D5A32413832343858" 的每位XOR 第2步得到的新字符串的每位,类似处理得到最终结果为注册码
//////////////////////////////////////////////////////////////////////////////////////////

1,2步的循环可以简化:C7 AC B6 D2 C0 EB D5 F0 D9 E3 BF B2 F4 DE C0 A4 先每位XOR,得到的结果是0x78,直接用前4位每2位XOR,得到新字符串查表。
                     查表的结果再和0x78处理得到新字符串,新字符串自己XOR,得到一个数值,这个数值和机器码第2部分的HEX字符串处理即可。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

码表:
1    BFD4B8DCB5B5BBB1A890B3B7B2DE
//
//
//
//
//
//
//
//为了版权问题,此处省略N个码表内容
//
//
//
//
//
//
//
DELPHI算法核心代码:
procedure TForm1.Button1Click(Sender: TObject);
var
   a,b,c,d,i,l:integer;
   s,s1,s2,s4,sn1,sn2,mb,sn3:String;
begin
   s:=Edit1.Text;
   if s='' then exit;
   s1:=copy(s,1,2);
   s2:=copy(s,3,2);
   a:=strtoint('$'+s1);
   b:=strtoint('$'+s2);
   c:=a xor $43;
   d:=b xor $43;
   //sn:=inttohex(c,2)+inttohex(d,2);计算结果
   sn1:=hextostr(inttohex(c,2))+hextostr(inttohex(d,2));   //计算出来的是查表的16进制的索引值
                                                                                  //根据索引值的16进制取码表字符串,然后再跟$78进行XOR运算,得到新字符串
   //************************************************************************************************************//
   //处理码表数据

if sn1='01' then mb:='B6A0B5F7C5B1C5EFDDA5DCD8C0E4';
//
//
//
//
//
//
//
//为了版权问题,此处省略N个码表内容
//
//
//
//
//
//
//



   l:=length(mb);
   for i:=1 to l div 2 do
   begin
   s1:=copy(mb,2*i-1,2);
   sn2:=sn2+inttohex((strtoint('$'+s1) xor $43),2);   //C8CBD0D4C9C6B6F1E5EBB3DFD6AEBCE4
   end;
   //*************************************************************************************************************//
   //码表处理后的新字符串自身XOR结果计算
    mb:=sn2;   //C8 CB D0 D4 C9 C6 B6 F1 E5 EB B3 DF D6 AE BC E4
    sn2:='0';
    for i:=1 to length(mb) div 2 do
    begin
       s4:=copy(mb,2*i-1,2);
       sn2:=inttohex((strtoint('$'+sn2) xor strtoint('$'+s4)),2);      //0D
    end;
    //************************************************************************************************************//
    //处理机器码第2部分
s:=copy(s,5,length(s)-16);//小学和高中,去掉前面4位和后面12位字符,初中只去掉前4位
   sn3:='';
   for i:=1 to length(s) do
   begin
       sn3:=sn3+inttohex(ord(s),2);   // //取字母的HEX
   end;
   s:=sn3;
   sn3:='';
   for i:=1 to length(s) div 2 do
   begin
   s4:=copy(s,2*i-1,2);
   sn3:=sn3+inttohex((strtoint('$'+s4) xor strtoint('$'+sn2)),2);//循环处理
   end;
   Edit2.Text:=sn3 ;
end;

crackvip 发表于 2014-9-4 12:30:26

看下能不能抢到沙发。。。。

F8LEFT 发表于 2014-9-4 15:20:34

可怕的算法大神VIP。。。

heizihui 发表于 2014-9-4 16:06:17

太牛了....两个VIP实在厉害

cfc1680 发表于 2014-9-5 10:06:48

大牛额,顶起来,学习了

GGLHY 发表于 2014-9-5 10:15:54

F8LEFT 发表于 2014-9-4 15:20
可怕的算法大神VIP。。。

同感~~~


开心啦 发表于 2014-9-5 12:23:09

算法大神,膜拜学习了

lhl8730 发表于 2014-9-6 14:23:30

分析不错.....

清泉飞扬 发表于 2014-9-6 17:32:09

只能拜膜,呵呵。

风雪淘宝贝 发表于 2014-9-6 22:06:54

牛人呀。
页: [1] 2
查看完整版本: 领航教育6算法分析与注册机核心代码