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;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<