• 标 题:迷你梦幻日记本2003 (12千字)
  • 作 者:lq7972
  • 时 间:2003-09-06 21:26:37
  • 链 接:http://bbs.pediy.com


SoftWare:迷你梦幻日记本2003
         非常好用,但要注册。
http://dreamsoft.china.cx/
Tools:TRW2000、微软Win98
Cracker:lq7972[bruceyu13@sina.com]
Notes:学习~

TRW载入主程序,输入密码进入,打开注册窗,输入“7878787878”
Ctrl+N
bpx hmemcpy
g
点注册,拦住
bc *
pmodule
;。。。
;按F10一直到:
019F:00436BE6 FF1540424800     CALL     `KERNEL32!GetVolumeInformationA`
019F:00436BEC 8B442414         MOV      EAX,[ESP+14]
019F:00436BF0 6890294A00       PUSH     DWORD 004A2990
019F:00436BF5 3501313100       XOR      EAX,00313101
                               这里是软件给出的机器码~C1,敲“?eax”看它的10进制值
019F:00436BFA 8D4C2420         LEA      ECX,[ESP+20]
019F:00436BFE 89442418         MOV      [ESP+18],EAX
019F:00436C02 8BD8             MOV      EBX,EAX
019F:00436C04 E874410300       CALL     0046AD7D
019F:00436C09 A1A0544A00       MOV      EAX,[004A54A0]
019F:00436C0E 33C9             XOR      ECX,ECX                        清零
019F:00436C10 898C24BC000000   MOV      [ESP+BC],ECX
019F:00436C17 89442418         MOV      [ESP+18],EAX
019F:00436C1B 89442420         MOV      [ESP+20],EAX
019F:00436C1F 8B74241C         MOV      ESI,[ESP+1C]
                               这个是软件给出的固定值~C2,ESI="410704800313101lxl80"
019F:00436C23 C68424BC00000002 MOV      BYTE [ESP+BC],02
019F:00436C2B 8B56F8           MOV      EDX,[ESI-08]                   固定值~C2的长度
019F:00436C2E 3BD1             CMP      EDX,ECX
019F:00436C30 7E21             JNG      00436C53

;下面对机器码进行变换
019F:00436C32 8A0431           MOV      AL,[ECX+ESI]                   al=C2[i]
019F:00436C35 8B7C2414         MOV      EDI,[ESP+14]                   edi=C1
019F:00436C39 2C78             SUB      AL,78                          al=C2[i]-78H
019F:00436C3B 88442410         MOV      [ESP+10],AL
019F:00436C3F 8B442410         MOV      EAX,[ESP+10]
019F:00436C43 25FF000000       AND      EAX,FF
019F:00436C48 33F8             XOR      EDI,EAX
                                                        edi=C1 XOR eax,下面要用的值~C3
019F:00436C4A 41               INC      ECX
019F:00436C4B 3BCA             CMP      ECX,EDX
019F:00436C4D 897C2414         MOV      [ESP+14],EDI
019F:00436C51 7CDF             JL       00436C32

019F:00436C53 8B442414         MOV      EAX,[ESP+14]
019F:00436C57 8D4C2410         LEA      ECX,[ESP+10]
019F:00436C5B 99               CDQ     
019F:00436C5C 33C2             XOR      EAX,EDX
019F:00436C5E 2BC2             SUB      EAX,EDX
019F:00436C60 50               PUSH     EAX
019F:00436C61 51               PUSH     ECX
019F:00436C62 8BCD             MOV      ECX,EBP
019F:00436C64 E807020000       CALL     00436E70                       【跟进】,注册算法
019F:00436C69 50               PUSH     EAX
019F:00436C6A 8D4C241C         LEA      ECX,[ESP+1C]
019F:00436C6E C68424C000000003 MOV      BYTE [ESP+C0],03
019F:00436C76 E8CD410300       CALL     0046AE48
019F:00436C7B 8D4C2410         LEA      ECX,[ESP+10]
019F:00436C7F C68424BC00000002 MOV      BYTE [ESP+BC],02
019F:00436C87 E883400300       CALL     0046AD0F
019F:00436C8C 8B542418         MOV      EDX,[ESP+18]                   正确的注册码
019F:00436C90 8B455C           MOV      EAX,[EBP+5C]                   输入的注册码
019F:00436C93 52               PUSH     EDX
019F:00436C94 50               PUSH     EAX
019F:00436C95 E8DCD00100       CALL     00453D76                       比较
019F:00436C9A 83C408           ADD      ESP,BYTE +08
019F:00436C9D 85C0             TEST     EAX,EAX
019F:00436C9F 0F8576010000     JNZ      NEAR 00436E1B
;eax=ffffffff,完;否则就在注册表
HKEY_CURRENT_USER\Software\Microsoft\Dreamcn.Net\DreamDiary\6.0\
项写入注册信息。
;。。。。。。

;【跟进】
019F:00436E70 6AFF             PUSH     BYTE -01
;。。。。。。
019F:00436EAB 8B442440         MOV      EAX,[ESP+40]                   eax=C3
019F:00436EAF C644243403       MOV      BYTE [ESP+34],03
019F:00436EB4 0FAFC0           IMUL     EAX,EAX                        eax=eax*eax
019F:00436EB7 69C00DEFBAA9     IMUL     EAX,EAX,A9BAEF0D               eax=eax*A9BAEF0Dh
                               把它设为Temp
019F:00436EBD 50               PUSH     EAX
019F:00436EBE 8D442414         LEA      EAX,[ESP+14]
019F:00436EC2 68E8294A00       PUSH     DWORD 004A29E8
019F:00436EC7 50               PUSH     EAX
019F:00436EC8 E811C50200       CALL     004633DE
                               这个CALL把Temp换成10进制形式并求出其长度~l
019F:00436ECD 8B44241C         MOV      EAX,[ESP+1C]                   Temp的Dec值
019F:00436ED1 8B3DE4434800     MOV      EDI,[004843E4]
019F:00436ED7 83C40C           ADD      ESP,BYTE +0C
019F:00436EDA 3970F8           CMP      [EAX-08],ESI
019F:00436EDD 7E77             JNG      00436F56

;下面是核心部分
019F:00436EDF 8A0C06           MOV      CL,[ESI+EAX]                   Temp[i]
019F:00436EE2 6A01             PUSH     BYTE +01
019F:00436EE4 884C2444         MOV      [ESP+44],CL
019F:00436EE8 8B542444         MOV      EDX,[ESP+44]
019F:00436EEC 52               PUSH     EDX
019F:00436EED 8D4C2424         LEA      ECX,[ESP+24]
019F:00436EF1 E810BF0200       CALL     00462E06
019F:00436EF6 8B00             MOV      EAX,[EAX]
019F:00436EF8 50               PUSH     EAX
019F:00436EF9 FFD7             CALL     EDI                            StrToInt
                               把从Temp中取出的字符转为数值形式
019F:00436EFB 8D4C241C         LEA      ECX,[ESP+1C]
019F:00436EFF 8BE8             MOV      EBP,EAX                        ebp=Temp[i]
019F:00436F01 E8093E0300       CALL     0046AD0F
019F:00436F06 8B4C2410         MOV      ECX,[ESP+10]                   ecx=Temp
019F:00436F0A 6A01             PUSH     BYTE +01
019F:00436F0C 8B41F8           MOV      EAX,[ECX-08]                   eax=l,长度
019F:00436F0F 2BC6             SUB      EAX,ESI                        eax=eax-esi
                               esi是计数器,从0开始
019F:00436F11 8A4408FF         MOV      AL,[EAX+ECX-01]                al=Temp[l-i+1]
019F:00436F15 88442424         MOV      [ESP+24],AL
019F:00436F19 8B4C2424         MOV      ECX,[ESP+24]
019F:00436F1D 51               PUSH     ECX
019F:00436F1E 8D4C242C         LEA      ECX,[ESP+2C]
019F:00436F22 E8DFBE0200       CALL     00462E06
019F:00436F27 8B00             MOV      EAX,[EAX]                      eax=Temp[l-i+1]
019F:00436F29 50               PUSH     EAX
019F:00436F2A FFD7             CALL     EDI                            StrToInt
019F:00436F2C 8D4C2424         LEA      ECX,[ESP+24]                   ecx=Temp
019F:00436F30 8BD8             MOV      EBX,EAX                        ebx=Temp[l-i+1]
019F:00436F32 E8D83D0300       CALL     0046AD0F
019F:00436F37 8D54AD00         LEA      EDX,[EBP+EBP*4+00]             edx=ebp+ebp*4
019F:00436F3B 8D4C2414         LEA      ECX,[ESP+14]
019F:00436F3F 8A8453AC484A00   MOV      AL,[EBX+EDX*2+004A48AC]
                               al=ebx+edx*2+4A48AC即注册码的的第i位;这里有一个表见【表】
019F:00436F46 50               PUSH     EAX
019F:00436F47 E8C6410300       CALL     0046B112
019F:00436F4C 8B442410         MOV      EAX,[ESP+10]
019F:00436F50 46               INC      ESI
019F:00436F51 3B70F8           CMP      ESI,[EAX-08]                   esi是否等于l?
019F:00436F54 7C89             JL       00436EDF                       循环
;上面完成了注册码的前10位,其计算过程是对Temp分别从首至尾和从尾至首取字符,转为数值后通过一些计算来确定从【表】中取何值。
;后10位的计算一模一样,不过从表的不同位置取值而已;如下。不赘述
019F:00436F56 8B48F8           MOV      ECX,[EAX-08]
019F:00436F59 33F6             XOR      ESI,ESI
019F:00436F5B 85C9             TEST     ECX,ECX
019F:00436F5D 7E77             JNG      00436FD6

019F:00436F5F 8A0C06           MOV      CL,[ESI+EAX]
019F:00436F62 6A01             PUSH     BYTE +01
019F:00436F64 884C2444         MOV      [ESP+44],CL
019F:00436F68 8B542444         MOV      EDX,[ESP+44]
019F:00436F6C 52               PUSH     EDX
019F:00436F6D 8D4C242C         LEA      ECX,[ESP+2C]
019F:00436F71 E890BE0200       CALL     00462E06
019F:00436F76 8B00             MOV      EAX,[EAX]
019F:00436F78 50               PUSH     EAX
019F:00436F79 FFD7             CALL     EDI
019F:00436F7B 8D4C2424         LEA      ECX,[ESP+24]
019F:00436F7F 8BE8             MOV      EBP,EAX
019F:00436F81 E8893D0300       CALL     0046AD0F
019F:00436F86 8B4C2410         MOV      ECX,[ESP+10]
019F:00436F8A 6A01             PUSH     BYTE +01
019F:00436F8C 8B41F8           MOV      EAX,[ECX-08]
019F:00436F8F 2BC6             SUB      EAX,ESI
019F:00436F91 8A4408FF         MOV      AL,[EAX+ECX-01]
019F:00436F95 88442424         MOV      [ESP+24],AL
019F:00436F99 8B4C2424         MOV      ECX,[ESP+24]
019F:00436F9D 51               PUSH     ECX
019F:00436F9E 8D4C2424         LEA      ECX,[ESP+24]
019F:00436FA2 E85FBE0200       CALL     00462E06
019F:00436FA7 8B00             MOV      EAX,[EAX]
019F:00436FA9 50               PUSH     EAX
019F:00436FAA FFD7             CALL     EDI
019F:00436FAC 8D4C241C         LEA      ECX,[ESP+1C]
019F:00436FB0 8BD8             MOV      EBX,EAX
019F:00436FB2 E8583D0300       CALL     0046AD0F
019F:00436FB7 8D54AD00         LEA      EDX,[EBP+EBP*4+00]
019F:00436FBB 8D4C2418         LEA      ECX,[ESP+18]
019F:00436FBF 8A845310494A00   MOV      AL,[EBX+EDX*2+004A4910]

;。。。。。。
019F:00436FE5 E8BA3F0300       CALL     0046AFA4                       在前10位后添"-"
019F:00436FEA 8D4C2418         LEA      ECX,[ESP+18]
019F:00436FEE 8D542440         LEA      EDX,[ESP+40]
019F:00436FF2 51               PUSH     ECX
019F:00436FF3 B304             MOV      BL,04
019F:00436FF5 50               PUSH     EAX
019F:00436FF6 52               PUSH     EDX
019F:00436FF7 885C2440         MOV      [ESP+40],BL
019F:00436FFB E83E3F0300       CALL     0046AF3E                       连成完整的注册码
;。。。。。。

【表】
敲“d 004A48AC,004A497C >c:\Tab.txt”得到:
0030:004A48AC 30 31 32 33 34 35 36 37-38 39 64 72 65 61 6D 73 0123456789dreams 
0030:004A48BC 6F 66 74 73 72 74 79 6A-71 70 36 30 71 6E 65 65 oftsrtyjqp60qnee 
0030:004A48CC 72 66 73 62 4A 6B 6C 6D-61 66 68 6A 6E 66 68 6A rfsbJklmafhjnfhj 
0030:004A48DC 6B 6E 6D 67 63 67 72 6B-74 62 6F 6F 6C 68 68 69 knmgcgrktboolhhi 
0030:004A48EC 76 6A 67 74 63 70 78 69-6D 6A 75 74 72 76 78 66 vjgtcpximjutrvxf 
0030:004A48FC 6C 64 79 77 65 6C 77 62-7A 6B 6D 37 35 34 33 32 ldywelwbzkm75432 
0030:004A490C 31 30 68 65 23 40 25 5B-5E 5D 7B 7D 21 78 7E 21 10he#@%[^]{}!x~! 
0030:004A491C 7E 61 68 73 3C 3E 3F 7C-73 40 23 6E 62 76 63 78 ~ahs<>?|s@#nbvcx 
0030:004A492C 7A 65 23 2D 2B 21 2B 35-21 23 7C 3D 3D 24 2F 40 ze#-+!+5!#|==$/@ 
0030:004A493C 21 2F 39 35 33 36 39 40-37 32 7C 23 2D 2A 40 34 !/95369@72|#-*@4 
0030:004A494C 31 2D 34 3D 35 36 2A 2F-24 2B 40 30 30 34 2A 2D 1-4=56*/$+@004*- 
0030:004A495C 24 21 2F 33 33 3D 23 39-7C 32 3D 35 40 30 2A 24 $!/33=#9|2=5@0*$ 
0030:004A496C 7C 33 67 6B 31 23 37 2B-B8 D0 D0 BB C4 E3 B5 C4 |3gk1#7+感谢你的 

【总结】
为了节省篇幅,略掉了很多行;这个软件在路上搞了N多call,如果见CALL就跟进,那真的会精神崩溃。。。看雪老大指出过:
    如何有效地进行动态跟踪分析呢?一般来说有如下几点:
    1、对软件进行粗跟踪
       所谓粗跟踪,即在跟踪时要大块大块地跟踪,也就是说每次遇到调用CALL指令、重复操作指令
   REP、循环操作LOOP指令以及中断调用INT指令等,一般不要跟踪进去,而是根据执行结果分析该段
   程序的功能。
    2、对关键部分进行细跟踪
       对软件进行了一定程度的粗跟踪之后,便可以获取软件中我们所关心的模块或程序段,这样就
   可以针对性地对该模块进行具体而详细地跟踪分析。一般情况下,对关键代码的跟踪可能要反复进
   行若干次才能读懂该程序,每次要把比较关键的中间结果或指令地址记录下来,这样会对下一次分
   析有很大的帮助。(看雪教程·基础知识之分析技术)

【注册机】
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//迷你梦幻日记本2003注册机 bY lq7972,with Delphi 6
//bruceyu13@sina.com

procedure TForm1.Button1Click(Sender: TObject);
var
  i,l:integer;
  C1,C2:Cardinal;
  C3:String;
  C4,C5:Integer;
  T1,T2:String;
const
  C:String='410704800313101lxl80';
  A:String='0123456789dreamsoftsrtyjqp60qneerfsbJklmafhjnfhjknmgcgrktboolhhivjgtcpximjutrvxfldywelwbzkm7543210he#@%[^]{}!x~!~ahs<>?|s@#nbvcxze#-+!+5!#|==$/@!/95369@72|#-*@41-4=56*/$+@004*-$!/33=#9|2=5@0*$|3gk1#7+';

begin
  C1:=StrToInt(Edit1.Text);
  for i:=1 to length(C) do
  begin
    C1:=C1 Xor ((Ord(C[i])-$78) And $FF);
  end;

  C2:=Sqr(C1)*$a9baef0d;

  C3:=IntToStr(C2);
  l:=Length(C3);
  for i:=1 to l do
  begin
    C4:=(StrToInt(Char(C3[i]))*5)*2+StrToInt(Char(C3[l-i+1]))+1;
    C5:=(StrToInt(Char(C3[i]))*5)*2+StrToInt(Char(C3[l-i+1]))+101;
    T1:=T1+A[C4];
    T2:=T2+A[C5];
  end;
  Edit2.text:=T1+'-'+T2;
end;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<