XXX報表資料管理系統(行業軟體)

看雪資料發表於2015-11-15

這個程式是XXX報表資料管理系統(行業軟體),程式是Delphi編的,沒加殼。OK,用DEDE反編譯,找到SoftRegister.pas的檔案(這是個註冊窗體檔案),找到
* Possible String Reference to: '祝賀'
|
0065210B   B924246500             mov     ecx, $00652424

* Possible String Reference to: '您已經完成了XX報表的註冊,您可以....(不寫了)
00652110   BA2C246500             mov     edx, $0065242C

* Reference to TApplication instance
|
00652115   A1B8896D00             mov     eax, dword ptr [$006D89B8]
0065211A   8B00                   mov     eax, [eax]

* Reference to : TApplication._PROC_00457374()
|
0065211C   E85352E0FF             call    00457374
00652121   8B45FC                 mov     eax, [ebp-$04]

* Reference to field TSoftRegisterform.OFFS_0234
|
00652124   C7803402000001000000   mov     dword ptr [eax+$0234], $00000001
0065212E   EB29                   jmp     00652159
00652130   6A30                   push    $30  (查詢這一句是從哪裡跳來的,害我這麼苦)

* Possible String Reference to: '警告'
|
00652132   B9CC216500             mov     ecx, $006521CC

* Possible String Reference to: '軟體註冊碼錯誤!您可以...(不寫了)
00652137   BA60246500             mov     edx, $00652460

* Reference to TApplication instance
|
0065213C   A1B8896D00             mov     eax, dword ptr [$006D89B8]
00652141   8B00                   mov     eax, [eax]

* Reference to : TApplication._PROC_00457374()
|
00652143   E82C52E0FF             call    00457374


經查是從00651FDD跳來的,

00651FD5   5A                     pop     edx

* Reference to: Unit_00484DE4.Proc_00485348
|
00651FD6   E86D33E3FF             call    00485348
00651FDB   84C0                   test    al, al
00651FDD   0F844D010000           jz      00652130 
好了,讓我們開啟除錯軟體裝入(我用的是ollyDbg,我只會用捲軸拉動設斷點,哪位大俠有直接打入地址的方法請告訴我),在00651FD5處設斷
當按下注冊按紐時中斷,按F8跳過00651FD6這個call時al變成了0,哈哈就是這個call,重灌入,F7進入這個call,
00485348  /$  53            PUSH EBX
00485349  |.  56            PUSH ESI
0048534A  |.  57            PUSH EDI
0048534B  |.  8BF9          MOV EDI,ECX
0048534D  |.  8BF2          MOV ESI,EDX
0048534F  |.  8BD8          MOV EBX,EAX
00485351  |.  33C0          XOR EAX,EAX
00485353  |.  E8 20050000   CALL REPORT.00485878      算機器碼(每臺電腦都不同,演算法不研究,反正軟體裡有生成了)
00485358  |.  8BC8          MOV ECX,EAX
0048535A  |.  8BD6          MOV EDX,ESI
0048535C  |.  8BC3          MOV EAX,EBX
0048535E  |.  E8 19070000   CALL REPORT.00485A7C   關鍵call,演算法全靠它了,進去!
00485363  |.  3BF8          CMP EDI,EAX 算出來的註冊碼放在EAX,EDI放你輸進去的註冊碼
00485365  |.  0F94C0        SETE AL   不相等設0
00485368  |.  5F            POP EDI
00485369  |.  5E            POP ESI
0048536A  |.  5B            POP EBX
0048536B  \.  C3            RETN

進入
00485A7C
.
.
.
.
(上面都是判斷輸入內容的格試對錯,不理它,看下面的演算法
00485AF0  |.  BB 01000000   MOV EBX,1                                ;  放入計算姓名初始長度
00485AF5  |>  8B45 FC       /MOV EAX,DWORD PTR SS:[EBP-4]            ;  得到使用者的姓名
00485AF8  |.  33C9          |XOR ECX,ECX                             ;  清零
00485AFA  |.  8A4C18 FF     |MOV CL,BYTE PTR DS:[EAX+EBX-1]          ;  放入姓名的迴圈位元組到cl(第一個位元組,第二個位元組,迴圈..)
00485AFE  |.  83E1 07       |AND ECX,7                               ;  和7作與運算後的值(以下簡稱X)
00485B01  |.  8B45 FC       |MOV EAX,DWORD PTR SS:[EBP-4]            ;  得到使用者的姓名
00485B04  |.  0FB64418 FF   |MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]       ;  放入姓名的迴圈位元組到EAX
00485B09  |.  50            |PUSH EAX
00485B0A  |.  8B45 F4       |MOV EAX,DWORD PTR SS:[EBP-C]            ;  EAX得到機器碼DWORD
00485B0D  |.  5A            |POP EDX                                 ;  位元組放回到EDX
00485B0E  |.  51            |PUSH ECX                                ;  X放入堆疊ECX
00485B0F  |.  8BCA          |MOV ECX,EDX
00485B11  |.  99            |CDQ                                     ;  機器碼擴充套件放入EDX:EAX
00485B12  |.  F7F9          |IDIV ECX                                ;  機器碼除以迴圈位元組
00485B14  |.  59            |POP ECX                                 ;  把和7作與運算的後的位元組放ECX
00485B15  |.  D3E2          |SHL EDX,CL                              ;  餘數向左移動X,CL
00485B17  |.  03FA          |ADD EDI,EDX                             ;  EDI加上EDXED
00485B19  |.  43            |INC EBX
00485B1A  |.  4E            |DEC ESI
00485B1B  |.^ 75 D8         \JNZ SHORT REPORT.00485AF5
00485B1D  |>  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]             ;  單位名稱
00485B20  |.  E8 ABE7F7FF   CALL REPORT.004042D0                   ;  得到單位名稱的長度
00485B25  |.  8BF0          MOV ESI,EAX
00485B27  |.  85F6          TEST ESI,ESI
00485B29  |.  7E 21         JLE SHORT REPORT.00485B4C
00485B2B  |.  BB 01000000   MOV EBX,1
00485B30  |>  8B45 F8       /MOV EAX,DWORD PTR SS:[EBP-8]            ;  單位名稱放入EAX,DWO
00485B33  |.  0FB64418 FF   |MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]       ;  迴圈位元組X
00485B38  |.  8BD0          |MOV EDX,EAX
00485B3A  |.  83CA FF       |OR EDX,FFFFFFFF                         ;  or EDX
00485B3D  |.  2355 F4       |AND EDX,DWORD PTR SS:[EBP-C]            ;  與機器碼作與運算
00485B40  |.  8B4D F8       |MOV ECX,DWORD PTR SS:[EBP-8]            ;  單位名稱放入ECX
00485B43  |.  0FAFD0        |IMUL EDX,EAX
00485B46  |.  03FA          |ADD EDI,EDX
00485B48  |.  43            |INC EBX
00485B49  |.  4E            |DEC ESI
00485B4A  |.^ 75 E4         \JNZ SHORT REPORT.00485B30
00485B4C  |>  8BC7          MOV EAX,EDI
00485B4E  |.  E8 AD2BF8FF   CALL REPORT.00408700                   ;  得到EAX的前四位
00485B53  |.  8BD8          MOV EBX,EAX
00485B55  |.  66:0FAF5D F4  IMUL BX,WORD PTR SS:[EBP-C]              ;  前四位乘以後機器碼四位
00485B5A  |.  0FB7DB        MOVZX EBX,BX
00485B5D  |.  03DF          ADD EBX,EDI
00485B5F  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]             ;  機器碼放入EAX
00485B62  |.  E8 992BF8FF   CALL REPORT.00408700    機器碼前四位放入EAX
00485B67  |.  66:F7EF       IMUL DI                                  ;  AX*DI
00485B6A  |.  0FB7C0        MOVZX EAX,AX
00485B6D  |.  03D8          ADD EBX,EAX
00485B6F  |.  8BFB          MOV EDI,EBX (EDI數值就是註冊碼,此進算完成)
00485B71  |.  33C0          XOR EAX,EAX
00485B73  |.  5A            POP EDX
00485B74  |.  59            POP ECX
00485B75  |.  59            POP ECX
00485B76  |.  64:8910       MOV DWORD PTR FS:[EAX],EDX
00485B79  |.  68 A05B4800   PUSH REPORT.00485BA0
00485B7E  |>  8D45 EC       LEA EAX,DWORD PTR SS:[EBP-14]
00485B81  |.  BA 02000000   MOV EDX,2
00485B86  |.  E8 E9E4F7FF   CALL REPORT.00404074
00485B8B  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
00485B8E  |.  BA 02000000   MOV EDX,2
00485B93  |.  E8 DCE4F7FF   CALL REPORT.00404074
00485B98  \.  C3            RETN

看出來演算法,怎樣把它編出來呢,我不會asm,會用delphi,好吧,就用delphi。

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, forms,
 Dialogs, StdCtrls;

type
 Tform1 = class(Tform)
   Edit1: TEdit;
   Label1: TLabel;
   Label2: TLabel;
   Edit2: TEdit;
   Button1: TButton;
   Label3: TLabel;
   Edit3: TEdit;
   Edit4: TEdit;
   Label4: TLabel;
   Label5: TLabel;

   procedure Button1Click(Sender: TObject);
 private

   { Private declarations }
 public
   { Public declarations }
 end;
 function strto16(achar:char):integer;
 function strto16h(astr:string):integer;
var
 form1: Tform1;

implementation

{$R *.dfm}
function Add1(i, j: Integer): Integer;
var
 Temp: Integer;
 k: Integer;
begin
 Temp := 0;
 for k := 1 to j do
   Inc(Temp, i);
 Result := Temp;
end;

function Add2(i, j: Integer): Integer;
var
 temp: Integer;
 k: Integer;
begin
if j=0 then
begin
 result:=1;
 exit;
end;
 temp := 1;
 for k := 1 to j do
   temp := Add1(temp, i);
 Result := temp;
end;

function strto16(achar:char):integer;
begin
case achar of
'0': result:=0;
'1':result:=1;
'2':result:=2;
'3':result:=3;
'4':result:=4;
'5':result:=5;
'6':result:=6;
'7':result:=7;
'8':result:=8;
'9':result:=9;
'A':result:=10;
'B':result:=11;
'C':result:=12;
'D':result:=13;
'E':result:=14;
'F':result:=15;
end;
end;

function strto16h(astr:string):integer;
var heji,i:integer;
begin
heji:=0;
for i:=length(astr)downto 1 do
begin
heji:=heji+strto16(astr[i])*add2(16,length(astr)-i);
end;
result:=heji;
end;

//上面主要是編一個strto16的函式,把十六進位制轉成10進位制,不知道有沒有現成的。

procedure Tform1.Button1Click(Sender: TObject);
var len1,len2,i,cx1,cx2,cx3,cx4:integer;
sumsum1,sumsum:integer;
temp1,namestr,danweistr,serialstr:string;
begin
namestr:=edit1.text; //姓名字串

len1:=length(namestr); //姓名長度

danweistr:=edit2.text;  //單位字串

len2:=length(danweistr); //單位長度

serialstr:=edit3.text;  //機器碼字串
cx2:=strto16h(edit3.Text);//把字元機器碼轉成10進位制的形式,如機器碼是'A012BC01'十進位制就是2685582337。

asm
xor edi,edi
xor edx,edx
xor eax,eax
xor ebx,ebx
MOV ESI,len1
MOV EBX,1          //                      ;  放入計算姓名初始長度
@sub1:
MOV EAX,namestr       //       ;  得到使用者的姓名
XOR ECX,ECX                     //        ;  清零
MOV CL,BYTE PTR DS:[EAX+EBX-1]   //       ;  放入姓名的迴圈位元組到CL
AND ECX,7          //                     ;  和7作與運算後的值(以下簡稱X)
MOV EAX,namestr    //        ;  得到使用者的姓名
MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]     //  ;  放入姓名的迴圈位元組到EAX
PUSH EAX      //
MOV EAX,cx2   //         ;  EAX得到機器碼DWORD
POP EDX    //                             ;  位元組放回到EDX
PUSH ECX   //                             ;  X放入堆疊ECX
MOV ECX,EDX  //
CDQ       //                              ;  機器碼擴充套件放入EDX:EAX
IDIV ECX  //                              ;  機器碼除以迴圈位元組
POP ECX       //                          ;  把和7作與運算的後的位元組放ECX
SHL EDX,CL       //                       ;  餘數向左移動X,CL
ADD EDI,EDX    //                         ;  EDI加上EDX
INC EBX
DEC ESI
JNZ @sub1                 //
MOV EAX,danweistr //
//00485B20  |.  E8 ABE7F7FF   CALL REPORT.004042D0        
MOV ESI,len2  //直接使用長單位長度
TEST ESI,ESI
JLE @sub3
MOV EBX,1
@sub2:
MOV EAX,danweistr   //   單位放入EAX
MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]    //   迴圈位元組X
MOV EDX,EAX
OR EDX,$FFFFFFFF //       or EDX
AND EDX,cx2  //     與機器碼作與運算DWORD
MOV ECX,danweistr  // 單位放入ECX,DWO
IMUL EDX,EAX
ADD EDI,EDX
INC EBX
DEC ESI
JNZ @sub2
@sub3:
MOV EAX,EDI
//CALL REPORT.00408700  這句用下面句代替
SHR  EAX ,16   //
MOV  EBX,EAX //
 IMUL BX,WORD PTR cx2 //                前四位乘以後機器碼四位
 MOVZX EBX,BX
 ADD EBX,EDI
 MOV EAX,cx2          //    機器碼EAX
 SHR EAX,16
//CALL REPORT.00408700
 IMUL DI            //   低字AXD
 MOVZX EAX,AX        
 ADD EBX,EAX        
 MOV EDI,EBX

 MOV EAX,EDI
 shr eax,16    
 MOV &sumsum,EAX (放前四位到變數sumsum)
 shl edi,16
 shr edi,16
 mov &sumsum1,edi(放後四位到變數sumsum1)
 end;
//為什麼要分開,因為數值變數放不下
 showmessage('你要的註冊碼是:'+IntToHex(sumsum,4)+'-'+IntToHex(sumsum1,4));
//intohex函式是把十進位制轉成十六進位制字元  
end;
//好了,就這樣,執行你打入姓名,單位,機器碼,就會彈出註冊碼!
//但為什麼sumsum,sumsum1變數不能進行賦值操作,象Edit4.text:=sumsum+sumsum1就出錯,我就弄不懂了,哪位能教我?
end.

初學crack,菜鳥一隻,希望共同進步!

相關文章