Software:XDos v1.1
http://www.MoreQuick.com/
Dos的外壳程序,可以运行大多数Dos命令,也可以运行一些Windows程序,它是一个多窗口的程序,可以在XDos中使用复制,粘贴等命令
Tools:TRW 2000
Cracker:lq7972[bruceyu13@sina.com]
Notes:学习ing~
这是个典型的注册码比较程序,跟踪不难;很适合我等生手练习
用TRW载入后,断点“bpx hmemcpy”,再“pmodule”转到程序领空(要记得“bc”清除断点);大约按15次F15,按F10返回,来到
0167:00401B10 E8B08F0100 CALL 0041AAC5 用户名
0167:00401B15 8B4C2408 MOV ECX,[ESP+08]
0167:00401B19 8379F801 CMP DWORD [ECX-08],BYTE +01
0167:00401B1D 7D0E JNL 00401B2D
0167:00401B1F 6AFF PUSH BYTE -01
0167:00401B21 6A00 PUSH BYTE +00
0167:00401B23 680BF00000 PUSH DWORD F00B
0167:00401B28 E996000000 JMP 00401BC3
0167:00401B2D 8D542404 LEA EDX,[ESP+04]
0167:00401B31 8D4E5C LEA ECX,[ESI+5C]
0167:00401B34 52 PUSH EDX
0167:00401B35 E88B8F0100 CALL 0041AAC5 输入的注册码
0167:00401B3A 8B442404 MOV EAX,[ESP+04]
0167:00401B3E 8378F801 CMP DWORD [EAX-08],BYTE +01
0167:00401B42 7E76 JNG 00401BBA
0167:00401B44 51 PUSH ECX
0167:00401B45 8D542408 LEA EDX,[ESP+08]
0167:00401B49 8BCC MOV ECX,ESP
0167:00401B4B 89642410 MOV [ESP+10],ESP
0167:00401B4F 52 PUSH EDX
0167:00401B50 E8C1D00100 CALL 0041EC16
0167:00401B55 E856FDFFFF CALL 004018B0 这里是关键,【跟进】
0167:00401B5A 83C404 ADD ESP,BYTE +04
0167:00401B5D 85C0 TEST EAX,EAX
0167:00401B5F 744E JZ 00401BAF
;【跟进】
0167:004018B0 6AFF PUSH BYTE -01
0167:004018B2 6858A44300 PUSH DWORD 0043A458
0167:004018B7 64A100000000 MOV EAX,[FS:00]
0167:004018BD 50 PUSH EAX
0167:004018BE 64892500000000 MOV [FS:00],ESP
0167:004018C5 83EC38 SUB ESP,BYTE +38
0167:004018C8 53 PUSH EBX
0167:004018C9 56 PUSH ESI
0167:004018CA 33F6 XOR ESI,ESI esi清零
0167:004018CC 8D4C2450 LEA ECX,[ESP+50]
0167:004018D0 89742448 MOV [ESP+48],ESI
0167:004018D4 E804620100 CALL 00417ADD
0167:004018D9 8D4C2450 LEA ECX,[ESP+50]
0167:004018DD E8AF610100 CALL 00417A91 这个Call检查输入的注册码全部是数字吗?
0167:004018E2 8B442450 MOV EAX,[ESP+50] 输入注册码
0167:004018E6 8B40F8 MOV EAX,[EAX-08] 的长度
0167:004018E9 83F80A CMP EAX,BYTE +0A 等于10D吗?
0167:004018EC 7424 JZ 00401912 是,一定要跳
0167:004018EE 8D4C2450 LEA ECX,[ESP+50]
0167:004018F2 C7442448FFFFFFFF MOV DWORD [ESP+48],FFFFFFFF
0167:004018FA E8A2D50100 CALL 0041EEA1
0167:004018FF 5E POP ESI
0167:00401900 33C0 XOR EAX,EAX
0167:00401902 5B POP EBX
0167:00401903 8B4C2438 MOV ECX,[ESP+38]
0167:00401907 64890D00000000 MOV [FS:00],ECX
0167:0040190E 83C444 ADD ESP,BYTE +44
0167:00401911 C3 RET
0167:00401912 A11CD64400 MOV EAX,[0044D61C] 跳转到了这里
0167:00401917 57 PUSH EDI
0167:00401918 8944240C MOV [ESP+0C],EAX
0167:0040191C 89442410 MOV [ESP+10],EAX
0167:00401920 8D4C2414 LEA ECX,[ESP+14]
0167:00401924 6A05 PUSH BYTE +05
0167:00401926 BB02000000 MOV EBX,02 ebx=2,下面用
0167:0040192B 51 PUSH ECX
0167:0040192C 8D4C245C LEA ECX,[ESP+5C]
0167:00401930 885C2454 MOV [ESP+54],BL
0167:00401934 E8C55D0100 CALL 004176FE
这个Call是把输入的注册码拦腰截断,并且翻转第一部分得Num1,Num2
0167:00401939 50 PUSH EAX
0167:0040193A 8D4C2410 LEA ECX,[ESP+10]
0167:0040193E C644245003 MOV BYTE [ESP+50],03
0167:00401943 E892D60100 CALL 0041EFDA
0167:00401948 8D4C2414 LEA ECX,[ESP+14]
0167:0040194C 885C244C MOV [ESP+4C],BL
0167:00401950 E84CD50100 CALL 0041EEA1
0167:00401955 8D542418 LEA EDX,[ESP+18]
0167:00401959 6A05 PUSH BYTE +05
0167:0040195B 52 PUSH EDX
0167:0040195C 8D4C245C LEA ECX,[ESP+5C]
0167:00401960 E81D5D0100 CALL 00417682
0167:00401965 50 PUSH EAX
0167:00401966 8D4C2414 LEA ECX,[ESP+14]
0167:0040196A C644245004 MOV BYTE [ESP+50],04
0167:0040196F E866D60100 CALL 0041EFDA
0167:00401974 8D4C2418 LEA ECX,[ESP+18]
0167:00401978 885C244C MOV [ESP+4C],BL
0167:0040197C E820D50100 CALL 0041EEA1
0167:00401981 8D4C240C LEA ECX,[ESP+0C]
;************************************************************************把你的眼球转到这里来
0167:00401985 E8D7D90100 CALL 0041F361
0167:0040198A 895C241C MOV [ESP+1C],EBX ebx=2,还记得吗?
0167:0040198E 83CBFF OR EBX,BYTE -01
0167:00401991 33C0 XOR EAX,EAX
0167:00401993 C744242006000000 MOV DWORD [ESP+20],06
0167:0040199B 89442434 MOV [ESP+34],EAX
0167:0040199F C7442424F9FFFFFF MOV DWORD [ESP+24],FFFFFFF9
0167:004019A7 89442438 MOV [ESP+38],EAX
0167:004019AB C744242804000000 MOV DWORD [ESP+28],04
0167:004019B3 8944243C MOV [ESP+3C],EAX
0167:004019B7 895C242C MOV [ESP+2C],EBX
0167:004019BB C744243008000000 MOV DWORD [ESP+30],08
0167:004019C3 89442440 MOV [ESP+40],EAX
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++最后定位在这里
0167:004019C7 8D7C241C LEA EDI,[ESP+1C] [edi]=2
;-----------------------------------------------------------------------
0167:004019CB 8B4C240C MOV ECX,[ESP+0C] Num1
0167:004019CF 8A17 MOV DL,[EDI] [edi]送dl
0167:004019D1 8A040E MOV AL,[ESI+ECX] Num1第i位,(i从0到4)
0167:004019D4 02C2 ADD AL,DL al+dl
0167:004019D6 3C30 CMP AL,30 大于/等于30h吗?
0167:004019D8 88442414 MOV [ESP+14],AL (结果存放)
0167:004019DC 7D06 JNL 004019E4 是,跳~
0167:004019DE 040A ADD AL,0A 否,加0Ah
0167:004019E0 88442414 MOV [ESP+14],AL
0167:004019E4 3C39 CMP AL,39 小于/等于39h吗?
0167:004019E6 7E06 JNG 004019EE 是,跳~
0167:004019E8 04F6 ADD AL,F6 否,加6Fh
0167:004019EA 88442414 MOV [ESP+14],AL
0167:004019EE 8B542414 MOV EDX,[ESP+14] 计算结果
0167:004019F2 8D4C240C LEA ECX,[ESP+0C] Num1
0167:004019F6 52 PUSH EDX
0167:004019F7 56 PUSH ESI
0167:004019F8 E876D90100 CALL 0041F373 这个Call是用结果置换Num1的第i位
0167:004019FD 46 INC ESI esi+1
0167:004019FE 83C704 ADD EDI,BYTE +04 edi+4,【注意】见后
0167:00401A01 83FE05 CMP ESI,BYTE +05 esi小于5吗?
0167:00401A04 7CC5 JL 004019CB 是,跳~
;-----------------------------------------------------------------------
0167:00401A06 8D4C240C LEA ECX,[ESP+0C]
;【注意】edi每次移动4位,移5次,其值分别是:02、06、F9h、04、FFh、08h
【总结】
通过上面的分析,聪明的你一定想到了软件的注册算法--对,它就是:
注册码前半截 ① ② ③ ④ ⑤
↓-1 ↓+4 ↓+3 ↓+6 ↓+2
注册码后半截 ⑥ ⑦ ⑧ ⑨ ⑩
如果相加/减超出范围[0,9],不计进位和借位,再求绝对值。而用户名不过是摆设
【注册机】
用MASM32的话,把004019CB~00401A04复制下来(可以利用UltraEdit的列编辑功能),稍加修改即可。这里我们使用Delphi 6编译
/////////////////////////////////////////////////////////////////////
// The KeyGen by lq7972,with Delphi 6
// E-Mail:bruceyu13@sina.com
// XDos v1.1 KeyGen
////////////////////////////////////////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
Code1,Code2:String;
Temp1,Temp2,Temp3,Temp4,Temp5:Char;
begin Code1:=IntToStr(Random(9))+IntToStr(Random(9))+IntToStr(Random(9))+IntToStr(Random(9))+IntToStr(Random(9));
for i:=1 to 5 do
case i of
1:
begin
Temp1:=Char(Ord(Code1[1])-1);
if Ord(Temp1) < $30 then
Temp1:=Char(Ord(Temp1)+$A);
end;
2:
begin
Temp2:=Char(Ord(Code1[2])+4);
if Ord(Temp2) > $39 then
Temp2:=Char(Ord(Temp2)-$A);
end;
3:
begin
Temp3:=Char(Ord(Code1[3])+3);
if Ord(Temp3) > $39 then
Temp3:=Char(Ord(Temp3)-$A);
end;
4:
begin
Temp4:=Char(Ord(Code1[4])+6);
if Ord(Temp4) > $39 then
Temp4:=Char(Ord(Temp4)-$A);
end;
5:
begin
Temp5:=Char(Ord(Code1[5])+2);
if Ord(Temp5) > $39 then
Temp5:=Char(Ord(Temp5)-$A);
end;
end;
Code2:=Temp1+Temp2+Temp3+Temp4+Temp5;
Edit2.Text:=Code1+Code2;
end;