简单分析QQ聊天记录查看器5.3版。
附注册机源码:
为了找到自已的QQ密码,网上狂搜,的确没有有效的软件。Download这个东东,还要注册。无聊看了一下。贴给别人看。
呵无密码查看聊天记录,还真的有效。

0046EF2F  |.  E8 2096FCFF   call    00438554                         ;  取得输入的假注册码1234567890123456,返回它的长度0x10
0046EF34  |.  8B55 F4       mov     edx, dword ptr [ebp-C]
0046EF37  |.  B8 E89C4800   mov     eax, 00489CE8                    ;  ASCII "(n?
0046EF3C  |.  E8 8F53F9FF   call    004042D0
0046EF41  |.  A1 E89C4800   mov     eax, dword ptr [489CE8]
0046EF46  |.  E8 19FDFFFF   call    0046EC64                         ;  对输入的注册码进行简的Xor运算,并对比真假
0046EF4B  |.  A3 EC9C4800   mov     dword ptr [489CEC], eax
0046EF50  |.  833D EC9C4800>cmp     dword ptr [489CEC], 0
0046EF57  |.  74 34         je      short 0046EF8D
0046EF59  |.  6A 00         push    0
0046EF5B  |.  A1 E89C4800   mov     eax, dword ptr [489CE8]
0046EF60  |.  E8 C757F9FF   call    0040472C
0046EF65  |.  50            push    eax
0046EF66  |.  68 D0EF4600   push    0046EFD0                         ;  注册成功
0046EF6B  |.  8B45 FC       mov     eax, dword ptr [ebp-4]

=====================================================================================

0046EC64  /$  55            push    ebp
0046EC65  |.  8BEC          mov     ebp, esp
0046EC67  |.  83C4 C8       add     esp, -38
0046EC6A  |.  8945 FC       mov     dword ptr [ebp-4], eax           ;  假注册码1234567890123456
0046EC6D  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
0046EC70  |.  E8 A75AF9FF   call    0040471C
0046EC75  |.  33C0          xor     eax, eax
0046EC77  |.  55            push    ebp
0046EC78  |.  68 A3ED4600   push    0046EDA3
0046EC7D  |.  64:FF30       push    dword ptr fs:[eax]
0046EC80  |.  64:8920       mov     dword ptr fs:[eax], esp
0046EC83  |.  33C0          xor     eax, eax
0046EC85  |.  8945 F8       mov     dword ptr [ebp-8], eax
0046EC88  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
0046EC8B  |.  E8 A458F9FF   call    00404534
0046EC90  |.  83F8 10       cmp     eax, 10                          ;  注册码长度为0x10位
0046EC93  |.  0F8C F4000000 jl      0046ED8D
0046EC99  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
0046EC9C  |.  E8 9358F9FF   call    00404534
0046ECA1  |.  83F8 10       cmp     eax, 10
0046ECA4  |.  0F8F E3000000 jg      0046ED8D
0046ECAA  |.  8B45 FC       mov     eax, dword ptr [ebp-4]           ;  假注册码
0046ECAD  |.  BA BCED4600   mov     edx, 0046EDBC                    ;  1163659294813585
0046ECB2  |.  E8 C159F9FF   call    00404678
0046ECB7  |.  0F84 D0000000 je      0046ED8D
0046ECBD  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
0046ECC0  |.  BA D8ED4600   mov     edx, 0046EDD8                    ;  0386848021608060
0046ECC5  |.  E8 AE59F9FF   call    00404678
0046ECCA  |.  0F84 BD000000 je      0046ED8D
0046ECD0  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
0046ECD3  |.  BA F4ED4600   mov     edx, 0046EDF4                    ;  8319e4005f00pyg0  //呵呵,这可是PYG的标记?
0046ECD8  |.  E8 9B59F9FF   call    00404678
0046ECDD  |.  0F84 AA000000 je      0046ED8D
0046ECE3  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
0046ECE6  |.  BA 10EE4600   mov     edx, 0046EE10                    ;  0566838690673180
0046ECEB  |.  E8 8859F9FF   call    00404678
0046ECF0  |.  0F84 97000000 je      0046ED8D                         ;  以上都是黑名单
0046ECF6  |.  33C0          xor     eax, eax
0046ECF8  |.  8945 DC       mov     dword ptr [ebp-24], eax
0046ECFB  |>  8B45 FC       /mov     eax, dword ptr [ebp-4]          ;  假注册码
0046ECFE  |.  8B55 DC       |mov     edx, dword ptr [ebp-24]
0046ED01  |.  8A0410        |mov     al, byte ptr [eax+edx]
0046ED04  |.  E8 13FFFFFF   |call    0046EC1C
0046ED09  |.  8B55 DC       |mov     edx, dword ptr [ebp-24]
0046ED0C  |.  884415 CB     |mov     byte ptr [ebp+edx-35], al
0046ED10  |.  FF45 DC       |inc     dword ptr [ebp-24]
0046ED13  |.  837D DC 10    |cmp     dword ptr [ebp-24], 10
0046ED17  |.^ 75 E2         \jnz     short 0046ECFB                  ;  0012F2CB    01 02 03 04 05 06 07 08 09 00 01 02 03 04 05 06   ..
//------------------------------------------------------------------------
0046EC1C  /$  55            push    ebp
0046EC1D  |.  8BEC          mov     ebp, esp
0046EC1F  |.  51            push    ecx
0046EC20  |.  8845 FF       mov     byte ptr [ebp-1], al
0046EC23  |.  807D FF 30    cmp     byte ptr [ebp-1], 30
0046EC27  |.  72 10         jb      short 0046EC39
0046EC29  |.  807D FF 39    cmp     byte ptr [ebp-1], 39
0046EC2D  |.  77 0A         ja      short 0046EC39
0046EC2F  |.  8A45 FF       mov     al, byte ptr [ebp-1]
0046EC32  |.  2C 30         sub     al, 30
0046EC34  |.  8845 FD       mov     byte ptr [ebp-3], al
0046EC37  |.  EB 1C         jmp     short 0046EC55
0046EC39  |>  807D FF 41    cmp     byte ptr [ebp-1], 41
0046EC3D  |.  72 12         jb      short 0046EC51
0046EC3F  |.  807D FF 46    cmp     byte ptr [ebp-1], 46
0046EC43  |.  77 0C         ja      short 0046EC51
0046EC45  |.  8A45 FF       mov     al, byte ptr [ebp-1]
0046EC48  |.  2C 41         sub     al, 41
0046EC4A  |.  04 0A         add     al, 0A
0046EC4C  |.  8845 FD       mov     byte ptr [ebp-3], al
0046EC4F  |.  EB 04         jmp     short 0046EC55
0046EC51  |>  C645 FD FF    mov     byte ptr [ebp-3], 0FF    ;如果是小写字母,则以FF代替,否则原样输出
0046EC55  |>  8A45 FD       mov     al, byte ptr [ebp-3]
0046EC58  |.  8845 FE       mov     byte ptr [ebp-2], al
0046EC5B  |.  8A45 FE       mov     al, byte ptr [ebp-2]
0046EC5E  |.  59            pop     ecx
0046EC5F  |.  5D            pop     ebp
0046EC60  \.  C3            retn
//---------------------------------------------------------------------------------
0046ED19  |.  33C0          xor     eax, eax
0046ED1B  |.  8945 E0       mov     dword ptr [ebp-20], eax
0046ED1E  |>  8B45 E0       /mov     eax, dword ptr [ebp-20]      ;假注册码,两两组合成一个新的Byte
0046ED21  |.  03C0          |add     eax, eax
0046ED23  |.  8A4405 CC     |mov     al, byte ptr [ebp+eax-34]
0046ED27  |.  C1E0 04       |shl     eax, 4
0046ED2A  |.  8B55 E0       |mov     edx, dword ptr [ebp-20]
0046ED2D  |.  03D2          |add     edx, edx
0046ED2F  |.  024415 CB     |add     al, byte ptr [ebp+edx-35]
0046ED33  |.  8B55 E0       |mov     edx, dword ptr [ebp-20]
0046ED36  |.  884415 EF     |mov     byte ptr [ebp+edx-11], al
0046ED3A  |.  FF45 E0       |inc     dword ptr [ebp-20]
0046ED3D  |.  837D E0 09    |cmp     dword ptr [ebp-20], 9
0046ED41  |.^ 75 DB         \jnz     short 0046ED1E                ;  0012F2EF  21 43 65 87 09 21 43 65 就称为N1..N8吧 
0046ED43  |.  8A45 F2       mov     al, byte ptr [ebp-E]           ;现在捉对厮杀
0046ED46  |.  3245 EF       xor     al, byte ptr [ebp-11]          ;N1 xor N4
0046ED49  |.  8845 E6       mov     byte ptr [ebp-1A], al
0046ED4C  |.  8A45 F0       mov     al, byte ptr [ebp-10]
0046ED4F  |.  3245 F6       xor     al, byte ptr [ebp-A]           ;N2 xor N8
0046ED52  |.  8845 E7       mov     byte ptr [ebp-19], al
0046ED55  |.  8A45 F1       mov     al, byte ptr [ebp-F]
0046ED58  |.  3245 F4       xor     al, byte ptr [ebp-C]           ;N3 xor N6
0046ED5B  |.  8845 E8       mov     byte ptr [ebp-18], al
0046ED5E  |.  8A45 F5       mov     al, byte ptr [ebp-B]
0046ED61  |.  3245 F3       xor     al, byte ptr [ebp-D]           ;N5 xor N7
0046ED64  |.  8845 E9       mov     byte ptr [ebp-17], al         ;以上是逐对进行Xor,生成另一组Byte
0046ED67  |.  807D E6 38    cmp     byte ptr [ebp-1A], 38         ;结果与常数比对,第一个Byte
0046ED6B  |.  75 1B         jnz     short 0046ED88
0046ED6D  |.  807D E7 6E    cmp     byte ptr [ebp-19], 6E          ;第二个Byte
0046ED71  |.  75 15         jnz     short 0046ED88
0046ED73  |.  807D E8 4E    cmp     byte ptr [ebp-18], 4E          ;第三个Byte
0046ED77  |.  75 0F         jnz     short 0046ED88
0046ED79  |.  807D E9 1A    cmp     byte ptr [ebp-17], 1A          ;第四个Byte
0046ED7D  |.  75 09         jnz     short 0046ED88
0046ED7F  |.  C745 F8 FFFFF>mov     dword ptr [ebp-8], -1          ;  注册标志赋值
0046ED86  |.  EB 05         jmp     short 0046ED8D
0046ED88  |>  33C0          xor     eax, eax
0046ED8A  |.  8945 F8       mov     dword ptr [ebp-8], eax         ;  注册标志得到0,注册失败
0046ED8D  |>  33C0          xor     eax, eax
0046ED8F  |.  5A            pop     edx
0046ED90  |.  59            pop     ecx
0046ED91  |.  59            pop     ecx
0046ED92  |.  64:8910       mov     dword ptr fs:[eax], edx
0046ED95  |.  68 AAED4600   push    0046EDAA
0046ED9A  |>  8D45 FC       lea     eax, dword ptr [ebp-4]
0046ED9D  |.  E8 DA54F9FF   call    0040427C
0046EDA2  \.  C3            retn

===============================================================================
假设输入假注册码:
1234567890123456
简单处理之,如果是小写字母则以FF代替,否则原样输出:
即:
01 02 03 04 05 06 07 08 09 00 01 02 03 04 05 06
简单处理成:
21 43 65 87 09 21 43 65
我且依序取名为:
N1 N2 N3 N4 N5 N6 N7 N8
简单的Xor运算:
N1 xor N4==A6  结果如果是38则通过
N2 xor N8==26  结果如果是6E则通过
N3 xor N6==44  结果如果是4E则通过
N5 xor N7==4A  结果如果是1A则通过

判断:
A6==38
26==6E
44==4E
4A==1A

//=============================================================================
于是有简单的注册机:
procedure TForm1.Button2Click(Sender: TObject);
begin
  showmessage('Code by wofan[OCN]'+#13+'QQ:339171218'+#13+'2007-3-27');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  SN:array[0..15] of byte;
  t:array[0..3] of byte;
  i:integer;
  str:string;
begin
  Randomize;
{
  SN_str:='';
  fillchar(sn,sizeof(sn),0);
  fillchar(t,sizeof(t),0);
}
  SN[0]:=random(10);   //随机生成第某些位置的注册码字符
  SN[1]:=random(10);   //Random(x)将生成一个0<=num<x的数

  SN[2]:=random(10);
  SN[3]:=random(10);

  SN[4]:=random(10);
  SN[5]:=random(10);

  SN[8]:=random(10);
  SN[9]:=random(10);

  t[0]:=(SN[1] shl 4+SN[0]) xor $38;  //捉对厮杀
  t[1]:=(SN[3] shl 4+SN[2]) xor $6E;
  t[2]:=(SN[5] shl 4+SN[4]) xor $4E;
  t[3]:=(SN[9] shl 4+SN[8]) xor $1A;

  SN[7]:=t[0] shr 4;         //从结果中提取出注册字符
  SN[6]:=t[0] and $F;
  SN[15]:=t[1] shr 4;
  SN[14]:=t[1] and $F;
  SN[11]:=t[2] shr 4;
  SN[10]:=t[2] and $F;
  SN[13]:=t[3] shr 4;
  SN[12]:=t[3] and $F;

  for i:=0 to 15 do
    SN_str:=SN_str+inttohex(SN[i],1);
  edit1.Text:=SN_str;      //输出注册码
end;
这应该算是一个灰色软件。
用Baidu一搜,居然有很多爆破版,晕死!这个简单的东西怎么要用爆破。软件作者还在里面记录了黑名单!现在好了,用注册机生成无限个注册码,不知这个记录会有多长。