【破文标题】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老大以及很多前辈们的学习教程以及所有帮助过我的论坛兄弟姐妹们!谢谢
--------------------------------------------------------------
【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!