【文章标题】: 英汉互译王V2007 算法分析之“联想分析法”
【文章作者】: KuNgBiM
【作者邮箱】: kungbim@163.com
【作者主页】: http://www.crkcn.com
【软件名称】: 英汉互译王V2007
【软件大小】: 743KB
【下载地址】: 自己搜索下载
【加壳方式】: N/A
【保护方式】: 延时NAG + 序列号
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: OD
【操作平台】: 盗版XPsp2
【软件介绍】: 一款快速高效的英汉翻译软件,不仅可以实现英汉互译,还可实现繁简互译。并伴有语音朗读功能。您在平时学习英语的过程中、上网浏览英文站点时、看英文原版书籍时、或是在做翻译工作时。你需要一个工具帮助您,从而使语言不再成为你前进的障碍,体验异彩纷呈的精神文明和文化世界,我们推荐您使用《英汉互译王》。她将是您工作、学习、网上生活的理想小伴侣。娃娃软件,科技开创美丽生活,祝您使用愉快。
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  今天大觉醒来,向往日一样到论坛灌灌水,来到『软件调试论坛』看见一朋友写的《菜鸟破文之英汉互译王V2007注册爆破简单分析》,
  发现该程序为明码比较,看来算法也挺简单,于是乎分析之。
  
  不过今天这个算法也不能完全叫算法,只能用“联想分析法”这个词比较准确。为什么叫“联想分析法”呢?下面可以完全描述之。
  
  准备工作就不再详述,通过yumikeyabc朋友分析的虚拟地址来现成的!
  
  来到004B1FF9设断!F9运行,填写注册信息:
  
  机器码:BFED57300014782D24F5
  注册码:99999999999999999999
  
  004B1FF9  |.  55               push    ebp
  004B1FFA  |.  68 C2214B00      push    004B21C2
  004B1FFF  |.  64:FF30          push    dword ptr fs:[eax]
  004B2002  |.  64:8920          mov     dword ptr fs:[eax], esp
  004B2005  |.  8D55 F4          lea     edx, dword ptr [ebp-C]
  004B2008  |.  8B86 00030000    mov     eax, dword ptr [esi+300]
  004B200E  |.  E8 8998F9FF      call    0044B89C                      ;  取试炼注册码
  004B2013  |.  8B45 F4          mov     eax, dword ptr [ebp-C]        ;  ASCII "99999999999999999999"
  004B2016  |.  8D55 F8          lea     edx, dword ptr [ebp-8]
  004B2019  |.  E8 FA64F5FF      call    00408518                      ;  注册码格式检查
  004B201E  |.  8B45 F8          mov     eax, dword ptr [ebp-8]
  004B2021  |.  50               push    eax
  004B2022  |.  8D55 EC          lea     edx, dword ptr [ebp-14]
  004B2025  |.  8B86 0C030000    mov     eax, dword ptr [esi+30C]
  004B202B  |.  E8 6C98F9FF      call    0044B89C                      ;  ★取机器码,研究之★
  004B2030  |.  8B45 EC          mov     eax, dword ptr [ebp-14]       ;  ASCII "BFED57300014782D24F5"
                                                                       ;  第二次加载运行后来到此处,看堆栈,并修改之
  004B2033  |.  8D4D F0          lea     ecx, dword ptr [ebp-10]
  004B2036  |.  BA D8214B00      mov     edx, 004B21D8                 ;  t674
  004B203B  |.  E8 88FAFFFF      call    004B1AC8                      ;  算法CALL,不跟进
  004B2040  |.  8B55 F0          mov     edx, dword ptr [ebp-10]       ;  ★得到正确注册码★
                                                                       ;  ASCII "0307040574767271717170757679730573750774"
  004B2043  |.  58               pop     eax                           ;  试炼码,ASCII "99999999999999999999"
  004B2044  |.  E8 4B24F5FF      call    00404494                      ;  经典比较CALL
  004B2049  |.  0F85 E2000000    jnz     004B2131                      ;  跳则GAME OVER
  
  我们得到的注册码感觉很可疑(机器码中的000所对应的注册码为717171,难道有规律?)
  
  Ctrl+F2重新装载,在取机器码004B2030处设断,运行。中断后查看堆栈,并修改:
  ===========================================================================
  数据窗口中跟随数值:
  
  00E7EE30  42 46 45 44 35 37 33 30 30 30 31 34 37 38 32 44  BFED57300014782D
  00E7EE40  32 34 46 35 00 00 E7 00 0C F6 4B 00 0C F6 4B 00  24F5..?.鏊..鏊.
  00E7EE50  B4 11 00 00 00 00 00 00 EC 78 42 00 F0 ED E7 00  ?......禅B.痦?
  00E7EE60  C8 78 42 00 F0 ED E7 00 00 00 00 00 00 00 00 00  萨B.痦?........
  
  修改为:
  
  00E7EE30  31 32 33 34 35 36 37 38 39 30 41 42 43 44 45 46  1234567890ABCDEF
  00E7EE40  47 48 49 4A 00 00 E7 00 0C F6 4B 00 0C F6 4B 00  GHIJ..?.鏊..鏊.
  00E7EE50  B4 11 00 00 00 00 00 00 EC 78 42 00 F0 ED E7 00  ?......禅B.痦?
  00E7EE60  C8 78 42 00 F0 ED E7 00 00 00 00 00 00 00 00 00  萨B.痦?........
  ===========================================================================
  继续运行!
  
  修改后变为:
  
  004B202B  |.  E8 6C98F9FF      call    0044B89C                      ;  取机器码
  004B2030  |.  8B45 EC          mov     eax, dword ptr [ebp-14]       ;  ASCII "1234567890ABCDEFGHIJ"
  004B2033  |.  8D4D F0          lea     ecx, dword ptr [ebp-10]
  004B2036  |.  BA D8214B00      mov     edx, 004B21D8                 ;  t674
  004B203B  |.  E8 88FAFFFF      call    004B1AC8
  004B2040  |.  8B55 F0          mov     edx, dword ptr [ebp-10]       ;  ★得到正确注册码★
                                                                       ;  ASCII "707372757477767978710003020504070609080B"
  004B2043  |.  58               pop     eax                           
  
  难道“1234567890ABCDEFGHIJ”所对应的注册码值为“707372757477767978710003020504070609080B”
  
  根据推断,随后我整理了一张包含字母及数字有规律的密码表,如下:
  
  0 --> 71
  1 --> 70
  2 --> 73
  3 --> 72
  4 --> 75
  5 --> 74
  6 --> 77
  7 --> 76
  8 --> 79
  9 --> 78
  A --> 00
  B --> 03
  C --> 02
  D --> 05
  E --> 04
  F --> 07
  G --> 06
  H --> 09
  I --> 08
  J --> 0B
  K --> 0A
  L --> 0D
  M --> 0C
  N --> 0F
  O --> 0E
  P --> 11
  Q --> 10
  R --> 13
  S --> 12
  T --> 15
  U --> 14
  V --> 17
  W --> 16
  X --> 19
  Y --> 18
  Z --> 1B
  
  为了证实这个“联想分析法”得出的算法可行,写一个注册机来验证。
  
  ============ 以下程序在盗版XPsp2、VB6.0下编译测试通过 ============
  
  Private Sub Text1_Change()
  'Keygen by KuNgBiM
      Dim MachineCode As String
      Dim n, m, i As Byte
      Dim Sn, tmp  As String
      Dim Char As String
      Dim Table As String
      '字符串
      Char = "0123456789" & "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      '字符串对应密码表
      Table = "717073727574777679780003020504070609080B0A0D0C0F0E111013121514171619181B"
      '输入机器码
      MachineCode = Text1.Text
      '计算注册码
      If Len(MachineCode) > 20 Then MachineCode = Mid(MachineCode, 1, 20)
      n = Len(MachineCode)
      For i = 1 To n
          tmp = Mid(MachineCode, i, 1)
          m = InStr(1, Char, tmp)
          Sn = Sn & Mid(Table, 2 * m - 1, 2)
      Next
      '输出注册码
      Text2.Text = Sn
  End Sub

  ============ 以下程序在盗版XPsp2、VC++6.0下编译测试通过 ============  

  void Ckeygen::OnChangeText1()
  {
  // TODO: Add your control notification handler code here
  // Keygen by KuNgBiM
   CString MachineCode;
   CComVariant n, m; BYTE i;
   CComVariant Sn; CString tmp;
   CString Char;
   CString Table;
  // 字符串
  Char = CString("0123456789")+"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  // 字符串对应密码表
  Table = "717073727574777679780003020504070609080B0A0D0C0F0E111013121514171619181B";
  // 输入机器码
  MachineCode = Text(m_Text1);
  // 计算注册码
  if ( MachineCode.GetLength()>20) { MachineCode =  MachineCode.Mid(1-1, 20); }
  n =  MachineCode.GetLength();
  for(i=1; i<=n; i++) {
    tmp =  MachineCode.Mid(i-1, 1);
    m =  (1+Char.Find(tmp, 1-1));
    Sn = Sn+ Table.Mid(2*m-1-1, 2);
    }
  // 输出注册码
  m_Text2.SetWindowText(Sn);
  }

  ============ 以下程序在盗版XPsp2、Delphi 6.0下编译测试通过 ============  

  procedure Tkeygen.Text1Change(Sender: TObject);
  var
    MachineCode, tmp, Char, Table : AnsiString;
    n, m, Sn : Variant;
    i : Char;
  begin
    // Keygen by KuNgBiM

    // 字符串
    Char := '0123456789'+'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    // 字符串对应密码表
    Table := '717073727574777679780003020504070609080B0A0D0C0F0E111013121514171619181B';
    // 输入机器码
    MachineCode := Text1.Text;
    // 计算注册码
    if  Length(MachineCode)>20 then begin MachineCode :=  Copy(MachineCode, 1, 20); end;
    n :=  Length(MachineCode);
    for i:=1 to n do begin
      tmp :=  Copy(MachineCode, i, 1);
      m :=  (1+Pos(tmp, PChar(Char)+1));
      Sn := Sn+ Copy(Table, 2*m-1, 2);
    end;
    // 输出注册码
    Text2.Text := Sn;
  end;

  end.
--------------------------------------------------------------------------------
【经验总结】
  没什么好总结的,自创的“联想分析法”真好用!呵呵~
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年02月16日 PM 02:33:00