飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7737|回复: 12

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

  [复制链接]
  • TA的每日心情
    开心
    2025-1-4 10:11
  • 签到天数: 490 天

    [LV.9]以坛为家II

    发表于 2014-9-4 11:00:06 | 显示全部楼层 |阅读模式
    本帖最后由 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 [eax]
    0059CD0C  |.  FF16           call    dword ptr [esi]                  ;   [TIniFile] function ReadString(const Section, Ident, Default: string): string; override
    0059CD0E  |.  8B45 D4        mov     eax, dword ptr [ebp-0x2C]        ;  堆栈 ss:[0012F824]=00E7B70C, (ASCII "4B4E")
    0059CD11  |.  8D55 EC        lea     edx, dword ptr [ebp-0x14]
    0059CD14  |.  E8 8BC3E6FF    call    004090A4                         ;   function Trim(const S: string): string
    0059CD19  |.  8D45 D0        lea     eax, dword ptr [ebp-0x30]
    0059CD1C  |.  50             push    eax
    0059CD1D  |.  A1 DC566300    mov     eax, dword ptr [0x6356DC]
    0059CD22  |.  8B00           mov     eax, dword ptr [eax]
    0059CD24  |.  B9 FCCF5900    mov     ecx, 0059CFFC                    ;  乾兑离震巽坎艮坤
    0059CD29  |.  8B55 EC        mov     edx, dword ptr [ebp-0x14]
    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 [ebp-0x30]
    0059CD34  |.  8D55 E8        lea     edx, dword ptr [ebp-0x18]
    0059CD37  |.  E8 68C3E6FF    call    004090A4                         ;   function Trim(const S: string): string
    0059CD3C  |.  8B55 E8        mov     edx, dword ptr [ebp-0x18]        ;  处理结果转换成ASIIC数字,然后查表
    0059CD3F  |.  8BC3           mov     eax, ebx
    0059CD41  |.  E8 9A030000    call    0059D0E0
    0059CD46  |.  8D45 CC        lea     eax, dword ptr [ebp-0x34]
    0059CD49  |.  50             push    eax
    0059CD4A  |.  A1 DC566300    mov     eax, dword ptr [0x6356DC]
    0059CD4F  |.  8B00           mov     eax, dword ptr [eax]
    0059CD51  |.  B9 FCCF5900    mov     ecx, 0059CFFC                    ;  乾兑离震巽坎艮坤
    0059CD56  |.  8B93 28030000  mov     edx, dword ptr [ebx+0x328]       ;  查表结果(ASCII "A8A8CDB8AEA8ABC1CFC5B2BFA4CACDBA")
    0059CD5C  |.  E8 E78B0000    call    005A5948                         ;  处理查表结果和固定字符串倒序的XOR,然后再跟机器码第2部分XOR处理操作
    0059CD61  |.  8B45 CC        mov     eax, dword ptr [ebp-0x34]
    0059CD64  |.  8D55 E4        lea     edx, dword ptr [ebp-0x1C]
    0059CD67  |.  E8 38C3E6FF    call    004090A4
    0059CD6C  |.  E8 2BE9E6FF    call    0040B69C
    0059CD71  |.  83C4 F8        add     esp, -0x8                        ; /
    0059CD74  |.  DD1C24         fstp    qword ptr [esp]                  ; |Arg1 (8 字节)
    0059CD77  |.  9B             wait                                     ; |
    0059CD78  |.  8D55 F4        lea     edx, dword ptr [ebp-0xC]         ; |
    0059CD7B  |.  B8 18D05900    mov     eax, 0059D018                    ; |yyyymmdd
    0059CD80  |.  E8 E7F5E6FF    call    0040C36C                         ; \领航6教?0040C36C
    0059CD85  |.  8D45 F8        lea     eax, dword ptr [ebp-0x8]
    0059CD88  |.  50             push    eax
    0059CD89  |.  8D55 C8        lea     edx, dword ptr [ebp-0x38]
    0059CD8C  |.  8B83 20030000  mov     eax, dword ptr [ebx+0x320]
    0059CD92  |.  E8 9DDBECFF    call    0046A934
    0059CD97  |.  8B45 C8        mov     eax, dword ptr [ebp-0x38]
    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 [ebp-0x3C]
    0059CDA6  |.  8B83 20030000  mov     eax, dword ptr [ebx+0x320]
    0059CDAC  |.  E8 83DBECFF    call    0046A934
    0059CDB1  |.  8B45 C4        mov     eax, dword ptr [ebp-0x3C]
    0059CDB4  |.  BA 05000000    mov     edx, 0x5
    0059CDB9  |.  59             pop     ecx
    0059CDBA  |.  E8 AD7BE6FF    call    0040496C
    0059CDBF  |.  8D45 FC        lea     eax, dword ptr [ebp-0x4]
    0059CDC2  |.  50             push    eax
    0059CDC3  |.  A1 DC566300    mov     eax, dword ptr [0x6356DC]
    0059CDC8  |.  8B00           mov     eax, dword ptr [eax]
    0059CDCA  |.  8B4D E4        mov     ecx, dword ptr [ebp-0x1C]
    0059CDCD  |.  8B55 F8        mov     edx, dword ptr [ebp-0x8]
    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;

    评分

    参与人数 2威望 +20 飘云币 +48 收起 理由
    Rooking + 20 + 40 老师的逻辑思维着实强悍啊
    GGLHY + 8 很给力!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2015-8-14 00:08
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    发表于 2014-9-4 12:30:26 | 显示全部楼层
    看下能不能抢到沙发。。。。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-2 16:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-9-4 15:20:34 | 显示全部楼层
    可怕的算法大神VIP。。。

    点评

    同感~~~  详情 回复 发表于 2014-9-5 10:15
    PYG19周年生日快乐!
  • TA的每日心情

    2024-12-4 10:25
  • 签到天数: 465 天

    [LV.9]以坛为家II

    发表于 2014-9-4 16:06:17 | 显示全部楼层
    太牛了....两个VIP实在厉害
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    5 天前
  • 签到天数: 1693 天

    [LV.Master]伴坛终老

    发表于 2014-9-5 10:06:48 | 显示全部楼层
    大牛额,顶起来,学习了
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2014-9-5 10:15:54 | 显示全部楼层
    F8LEFT 发表于 2014-9-4 15:20
    可怕的算法大神VIP。。。

    同感~~~


    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-3-10 20:59
  • 签到天数: 243 天

    [LV.8]以坛为家I

    发表于 2014-9-5 12:23:09 | 显示全部楼层
    算法大神,膜拜学习了
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-12-19 13:58
  • 签到天数: 403 天

    [LV.9]以坛为家II

    发表于 2014-9-6 17:32:09 | 显示全部楼层
    只能拜膜,呵呵。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表