【破文标题】Just Checking V3.12算法分析
【破文作者】tianxj
【作者邮箱】tianxj_2007@126.com
【作者主页】WwW.ChiNaPYG.CoM
【破解工具】PEiD,OD
【破解平台】Windows XP
【软件名称】Just Checking V3.12
【更新时间】February 27 2008
【原版下载】http://www.justapps.com/download/justchecking_setup.exe
【保护方式】注册码
【软件简介】一款帮助你控制支票支出平衡的财务软件。
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------
【破解内容】
--------------------------------------------------------------
**************************************************************
一、运行程序,进行注册,输入错误的注册信息进行检测,有提示信息
**************************************************************
二、用PEiD对justchecking.exe查壳,为 Borland Delphi 6.0 - 7.0
**************************************************************
三、用PE Explorer和DeDe查得按钮事件
运行OD,justchecking.exe,来到
007912F4 /. 55 PUSH EBP 007912F5 |. 8BEC MOV EBP,ESP 007912F7 |. 81C4 ECFEFFFF ADD ESP,-114 007912FD |. 53 PUSH EBX 007912FE |. 33C9 XOR ECX,ECX 00791300 |. 898D ECFEFFFF MOV DWORD PTR SS:[EBP-114],ECX 00791306 |. 898D F4FEFFFF MOV DWORD PTR SS:[EBP-10C],ECX 0079130C |. 898D F0FEFFFF MOV DWORD PTR SS:[EBP-110],ECX 00791312 |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX 00791315 |. 894D F8 MOV DWORD PTR SS:[EBP-8],ECX 00791318 |. 8BD8 MOV EBX,EAX 0079131A |. 33C0 XOR EAX,EAX 0079131C |. 55 PUSH EBP 0079131D |. 68 30147900 PUSH justchec.00791430 00791322 |. 64:FF30 PUSH DWORD PTR FS:[EAX] 00791325 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP 00791328 |. 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8] 0079132B |. 8B83 00030000 MOV EAX,DWORD PTR DS:[EBX+300] 00791331 |. E8 46CCFCFF CALL justchec.0075DF7C 00791336 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; //用户名 00791339 |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4] 0079133C |. E8 BB96C7FF CALL justchec.0040A9FC ; //去掉用户名前面的空格 00791341 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] ; //用户名 00791344 |. A1 081C8700 MOV EAX,DWORD PTR DS:[871C08] 00791349 |. E8 5241C7FF CALL justchec.004054A0 0079134E |. 8D95 F0FEFFFF LEA EDX,DWORD PTR SS:[EBP-110] 00791354 |. 8B83 04030000 MOV EAX,DWORD PTR DS:[EBX+304] 0079135A |. E8 1DCCFCFF CALL justchec.0075DF7C 0079135F |. 8B85 F0FEFFFF MOV EAX,DWORD PTR SS:[EBP-110] ; //试练码 00791365 |. 8D95 F4FEFFFF LEA EDX,DWORD PTR SS:[EBP-10C] 0079136B |. E8 8C96C7FF CALL justchec.0040A9FC ; //去掉试练码前面的空格 00791370 |. 8B95 F4FEFFFF MOV EDX,DWORD PTR SS:[EBP-10C] ; //试练码 00791376 |. 8D85 F8FEFFFF LEA EAX,DWORD PTR SS:[EBP-108] 0079137C |. B9 FF000000 MOV ECX,0FF 00791381 |. E8 7E43C7FF CALL justchec.00405704 ; //保存试练码长度和试练码,若长度大于FFh,则保存FFh位 00791386 |. 8D95 F8FEFFFF LEA EDX,DWORD PTR SS:[EBP-108] ; //试练码 0079138C |. A1 5C198700 MOV EAX,DWORD PTR DS:[87195C] 00791391 |. B1 1E MOV CL,1E 00791393 |. E8 9024C7FF CALL justchec.00403828 ; //保存试练码长度和试练码,若长度大于1Eh,则保存1Eh位 00791398 |. 68 29030000 PUSH 329 ; //329入栈 0079139D |. 8D85 ECFEFFFF LEA EAX,DWORD PTR SS:[EBP-114] 007913A3 |. 8B15 5C198700 MOV EDX,DWORD PTR DS:[87195C] ; justchec.00875D48 007913A9 |. E8 0243C7FF CALL justchec.004056B0 007913AE |. 8B8D ECFEFFFF MOV ECX,DWORD PTR SS:[EBP-114] ; //试练码 007913B4 |. 8B15 081C8700 MOV EDX,DWORD PTR DS:[871C08] ; justchec.00875D38 007913BA |. 8B12 MOV EDX,DWORD PTR DS:[EDX] ; //用户名 007913BC |. A1 B41C8700 MOV EAX,DWORD PTR DS:[871CB4] 007913C1 |. 8B00 MOV EAX,DWORD PTR DS:[EAX] 007913C3 |. 8B80 FC020000 MOV EAX,DWORD PTR DS:[EAX+2FC] 007913C9 |. E8 6664D5FF CALL justchec.004E7834 ; //关键CALL 007913CE |. 84C0 TEST AL,AL 007913D0 |. 75 29 JNZ SHORT justchec.007913FB ; //关键跳转 007913D2 |. 6A 00 PUSH 0 ; /Arg1 = 00000000 007913D4 |. 66:8B0D 3C147>MOV CX,WORD PTR DS:[79143C] ; | 007913DB |. B2 01 MOV DL,1 ; | 007913DD |. B8 48147900 MOV EAX,justchec.00791448 ; |ASCII "The Registration Number that you provided does not match the Name entered." 007913E2 |. E8 ED7FCBFF CALL justchec.004493D4 ; \justchec.004493D4 007913E7 |. 48 DEC EAX 007913E8 |. 75 1B JNZ SHORT justchec.00791405 007913EA |. A1 C8608700 MOV EAX,DWORD PTR DS:[8760C8] 007913EF |. C780 4C020000>MOV DWORD PTR DS:[EAX+24C],1 007913F9 |. EB 0A JMP SHORT justchec.00791405 007913FB |> C783 4C020000>MOV DWORD PTR DS:[EBX+24C],1 00791405 |> 33C0 XOR EAX,EAX 00791407 |. 5A POP EDX 00791408 |. 59 POP ECX 00791409 |. 59 POP ECX 0079140A |. 64:8910 MOV DWORD PTR FS:[EAX],EDX 0079140D |. 68 37147900 PUSH justchec.00791437 00791412 |> 8D85 ECFEFFFF LEA EAX,DWORD PTR SS:[EBP-114] 00791418 |. BA 03000000 MOV EDX,3 0079141D |. E8 4E40C7FF CALL justchec.00405470 00791422 |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] 00791425 |. BA 02000000 MOV EDX,2 0079142A |. E8 4140C7FF CALL justchec.00405470 0079142F \. C3 RETN 00791430 .^ E9 3339C7FF JMP justchec.00404D68 00791435 .^ EB DB JMP SHORT justchec.00791412 00791437 . 5B POP EBX 00791438 . 8BE5 MOV ESP,EBP 0079143A . 5D POP EBP 0079143B . C3 RETN ============================================================== 004E7834 /$ 55 PUSH EBP 004E7835 |. 8BEC MOV EBP,ESP 004E7837 |. 83C4 F4 ADD ESP,-0C 004E783A |. 53 PUSH EBX 004E783B |. 56 PUSH ESI 004E783C |. 57 PUSH EDI 004E783D |. 33DB XOR EBX,EBX 004E783F |. 895D F4 MOV DWORD PTR SS:[EBP-C],EBX 004E7842 |. 894D F8 MOV DWORD PTR SS:[EBP-8],ECX 004E7845 |. 8955 FC MOV DWORD PTR SS:[EBP-4],EDX 004E7848 |. 8BF8 MOV EDI,EAX 004E784A |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8] ; //ESI=[EBP+8]=329h 004E784D |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; //用户名 004E7850 |. E8 C3E0F1FF CALL justchec.00405918 004E7855 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; //试练码 004E7858 |. E8 BBE0F1FF CALL justchec.00405918 004E785D |. 33C0 XOR EAX,EAX 004E785F |. 55 PUSH EBP 004E7860 |. 68 B3784E00 PUSH justchec.004E78B3 004E7865 |. 64:FF30 PUSH DWORD PTR FS:[EAX] 004E7868 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP 004E786B |. 33DB XOR EBX,EBX 004E786D |. 837D FC 00 CMP DWORD PTR SS:[EBP-4],0 004E7871 |. 74 25 JE SHORT justchec.004E7898 ; //用户名为空则跳 004E7873 |. 85F6 TEST ESI,ESI 004E7875 |. 74 21 JE SHORT justchec.004E7898 ; //ESI为空则跳 004E7877 |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C] 004E787A |. 50 PUSH EAX 004E787B |. 8BCE MOV ECX,ESI ; //ECX=ESI=329h 004E787D |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] ; //用户名 004E7880 |. 8BC7 MOV EAX,EDI 004E7882 |. E8 8DFEFFFF CALL justchec.004E7714 ; //算法CALL 004E7887 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; //真码 004E788A |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8] ; //试练码 004E788D |. E8 9EF1FFFF CALL justchec.004E6A30 ; //比较CALL 004E7892 |. 84C0 TEST AL,AL 004E7894 |. 74 02 JE SHORT justchec.004E7898 ; //关键跳转 004E7896 |. B3 01 MOV BL,1 ; //BL=1 004E7898 |> 33C0 XOR EAX,EAX ; //EAX=0 004E789A |. 5A POP EDX 004E789B |. 59 POP ECX 004E789C |. 59 POP ECX 004E789D |. 64:8910 MOV DWORD PTR FS:[EAX],EDX 004E78A0 |. 68 BA784E00 PUSH justchec.004E78BA 004E78A5 |> 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C] 004E78A8 |. BA 03000000 MOV EDX,3 004E78AD |. E8 BEDBF1FF CALL justchec.00405470 004E78B2 \. C3 RETN 004E78B3 .^ E9 B0D4F1FF JMP justchec.00404D68 004E78B8 .^ EB EB JMP SHORT justchec.004E78A5 004E78BA . 8BC3 MOV EAX,EBX ; //EAX=EBX 004E78BC . 5F POP EDI 004E78BD . 5E POP ESI 004E78BE . 5B POP EBX 004E78BF . 8BE5 MOV ESP,EBP 004E78C1 . 5D POP EBP 004E78C2 . C2 0400 RETN 4 ============================================================== 004E7714 /$ 55 PUSH EBP 004E7715 |. 8BEC MOV EBP,ESP 004E7717 |. 6A 00 PUSH 0 004E7719 |. 6A 00 PUSH 0 004E771B |. 6A 00 PUSH 0 004E771D |. 6A 00 PUSH 0 004E771F |. 6A 00 PUSH 0 004E7721 |. 53 PUSH EBX 004E7722 |. 56 PUSH ESI 004E7723 |. 57 PUSH EDI 004E7724 |. 8BF1 MOV ESI,ECX 004E7726 |. 8955 FC MOV DWORD PTR SS:[EBP-4],EDX 004E7729 |. 8B7D 08 MOV EDI,DWORD PTR SS:[EBP+8] 004E772C |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; //用户名 004E772F |. E8 E4E1F1FF CALL justchec.00405918 004E7734 |. 33C0 XOR EAX,EAX 004E7736 |. 55 PUSH EBP 004E7737 |. 68 17784E00 PUSH justchec.004E7817 004E773C |. 64:FF30 PUSH DWORD PTR FS:[EAX] 004E773F |. 64:8920 MOV DWORD PTR FS:[EAX],ESP 004E7742 |. 837D FC 00 CMP DWORD PTR SS:[EBP-4],0 004E7746 |. 74 04 JE SHORT justchec.004E774C ; //用户名为空则跳 004E7748 |. 85F6 TEST ESI,ESI 004E774A |. 75 0C JNZ SHORT justchec.004E7758 ; //ESI为空则跳 004E774C |> 8BC7 MOV EAX,EDI 004E774E |. E8 F9DCF1FF CALL justchec.0040544C 004E7753 |. E9 A4000000 JMP justchec.004E77FC 004E7758 |> 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] 004E775B |. E8 ECDCF1FF CALL justchec.0040544C 004E7760 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; //用户名 004E7763 |. E8 C0DFF1FF CALL justchec.00405728 ; //取用户名长度 004E7768 |. 8BD8 MOV EBX,EAX ; //EBX=EAX=用户名长度 004E776A |. 0FAFDE IMUL EBX,ESI ; //EBX=EBX*ESI 004E776D |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; //用户名 004E7770 |. 0FB600 MOVZX EAX,BYTE PTR DS:[EAX] ; //取用户名第1位ASC值 004E7773 |. 69C0 842F0100 IMUL EAX,EAX,12F84 ; //EAX=EAX*12F84 004E7779 |. 03D8 ADD EBX,EAX ; //EBX=EBX+EAX 004E777B |. 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C] 004E777E |. 8BC3 MOV EAX,EBX ; //EAX=EBX 004E7780 |. E8 4339F2FF CALL justchec.0040B0C8 ; //EAX转10进制字符形式 004E7785 |. 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C] ; //EAX的10进制字符形式,设为字符串1 004E7788 |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] 004E778B |. B9 30784E00 MOV ECX,justchec.004E7830 ; - 004E7790 |. E8 DFDFF1FF CALL justchec.00405774 004E7795 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; //用户名 004E7798 |. 0FB600 MOVZX EAX,BYTE PTR DS:[EAX] ; //取用户名第1位ASC值 004E779B |. F7EE IMUL ESI ; //EAX=EAX*ESI 004E779D |. 69D8 C8010000 IMUL EBX,EAX,1C8 ; //EBX=EAX*1C8 004E77A3 |. FF75 F8 PUSH DWORD PTR SS:[EBP-8] 004E77A6 |. 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10] 004E77A9 |. 8BC3 MOV EAX,EBX ; //EAX=EBX 004E77AB |. E8 1839F2FF CALL justchec.0040B0C8 ; //EAX转10进制字符形式 004E77B0 |. FF75 F0 PUSH DWORD PTR SS:[EBP-10] ; //EAX的10进制字符形式,设为字符串2 004E77B3 |. 68 30784E00 PUSH justchec.004E7830 ; - 004E77B8 |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] 004E77BB |. BA 03000000 MOV EDX,3 004E77C0 |. E8 23E0F1FF CALL justchec.004057E8 004E77C5 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; //用户名 004E77C8 |. E8 5BDFF1FF CALL justchec.00405728 ; //取用户名长度 004E77CD |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] ; //用户名 004E77D0 |. 0FB612 MOVZX EDX,BYTE PTR DS:[EDX] ; //取用户名第1位ASC值 004E77D3 |. F7EA IMUL EDX ; //EAX=EAX*EDX 004E77D5 |. 69D8 2E160000 IMUL EBX,EAX,162E ; //EBX=EAX*162E 004E77DB |. 03DE ADD EBX,ESI ; //EBX=EBX+ESI 004E77DD |. 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14] 004E77E0 |. 8BC3 MOV EAX,EBX ; //EAX=EBX 004E77E2 |. E8 E138F2FF CALL justchec.0040B0C8 ; //EAX转10进制字符形式 004E77E7 |. 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14] ; //EAX的10进制字符形式,设为字符串3 004E77EA |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] 004E77ED |. E8 3EDFF1FF CALL justchec.00405730 004E77F2 |. 8BC7 MOV EAX,EDI 004E77F4 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8] ; //相连字符串,形式为"字符串1-字符串2-字符串3" 004E77F7 |. E8 A4DCF1FF CALL justchec.004054A0 004E77FC |> 33C0 XOR EAX,EAX 004E77FE |. 5A POP EDX 004E77FF |. 59 POP ECX 004E7800 |. 59 POP ECX 004E7801 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX 004E7804 |. 68 1E784E00 PUSH justchec.004E781E 004E7809 |> 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14] 004E780C |. BA 05000000 MOV EDX,5 004E7811 |. E8 5ADCF1FF CALL justchec.00405470 004E7816 \. C3 RETN 004E7817 .^ E9 4CD5F1FF JMP justchec.00404D68 004E781C .^ EB EB JMP SHORT justchec.004E7809 004E781E . 5F POP EDI 004E781F . 5E POP ESI 004E7820 . 5B POP EBX 004E7821 . 8BE5 MOV ESP,EBP 004E7823 . 5D POP EBP 004E7824 . C2 0400 RETN 4
【破解总结】
--------------------------------------------------------------
【算法总结】
注册码和用户名长度和第1位的ASC值有关
--------------------------------------------------------------
【算法注册机】
〖VB代码〗
Private Sub Command1_Click()
If Len(Text1.Text) = 0 Then
Text2.Text = "请输入用户名!"
Else
N = LTrim(Text1.Text)
NL = Len(N)
N1 = Asc(Mid(N, 1, 1))
A = &H329 * NL + N1 * &H12F84
B = N1 * &H329 * &H1C8
C = (NL * N1) * &H162E + &H329
Text2.Text = A & "-" & B & "-" & C
End If
End Sub
〖Delphi代码〗
procedure TForm1.Button1Click(Sender: TObject);
var
NL,N1:integer;
N,A,B,C:string;
begin
if Length(Edit1.Text)=0 then
begin
ShowMessage('请输入用户名');
exit;
end;
N := Trim(Edit1.Text);
NL:= Length(N);
N1:= Ord(N[1]);
A:= InttoStr($329*NL+N1*$12F84);
B:=InttoStr( N1*$329*$1C8);
C:=InttoStr((NL*N1)*$162E+$329);
Edit2.Text :=A +'-'+ B +'-'+ C;
end;
〖易语言代码〗
.版本 2
.子程序 _按钮1_被单击
.局部变量 N, 文本型, , , 变量
.局部变量 NL, 整数型
.局部变量 N1, 整数型
.局部变量 A, 文本型
.局部变量 B, 文本型
.局部变量 C, 文本型
.判断开始 (编辑框1.内容 = “”)
编辑框2.内容 = “输入有误,请重新输入。”
.默认
N = 删首空 (编辑框1.内容)
NL = 取文本长度 (N)
N1 = 取代码 (N, 1)
A = 到文本 (十六进制到十进制 (“329”) × NL + N1 × 十六进制到十进制 (“12F84”))
B = 到文本 (N1 × 十六进制到十进制 (“329”) × 十六进制到十进制 (“1C8”))
C = 到文本 (NL × N1 × 十六进制到十进制 (“162E”) + 十六进制到十进制 (“329”))
编辑框2.内容 = A + “-” + B + “-” + C
.判断结束
.子程序 十六进制到十进制, 整数型
.参数 十六进制文本, 文本型
.局部变量 文本, 文本型
.局部变量 最终值, 整数型
.局部变量 i, 整数型, , , 中间循环变量
.局部变量 临时数值, 文本型, , , 每一位上的值
文本 = 到小写 (十六进制文本)
.变量循环首 (1, 取文本长度 (文本), 1, i)
临时数值 = 取文本中间 (文本, i, 1)
.如果 (取代码 (临时数值, ) ≥ 取代码 (“a”, ) 且 取代码 (临时数值, ) ≤ 取代码 (“f”, ))
最终值 = 最终值 + (取代码 (临时数值, ) - 取代码 (“a”, ) + 10) × 求次方 (16, 取文本长度 (文本) - i)
.否则
最终值 = 最终值 + 到数值 (临时数值) × 求次方 (16, 取文本长度 (文本) - i)
.如果结束
.变量循环尾 ()
返回 (最终值)
--------------------------------------------------------------
【内存注册机】
中断地址 004E788D
中断次数 1
第一字节 E8
指令长度 5
内存方式-寄存器-EAX
--------------------------------------------------------------
【注册信息】
保存在安装目录下data文件夹file.dat里
--------------------------------------------------------------
感谢飘云老大、猫老大、Nisy老大以及很多前辈们的学习教程以及所有帮助过我的论坛兄弟姐妹们!谢谢
--------------------------------------------------------------
【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!