XXX報表資料管理系統(行業軟體)
這個程式是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,菜鳥一隻,希望共同進步!
相關文章
- 客戶管理系統SAAS應用行業軟體系統進銷存CRM管理系統2021-07-17行業
- 系統管理體系——軟體包管理2024-11-13
- 學生就業管理服務系統人員求職管理軟體2022-05-31就業求職
- 軟體作業系統2024-05-02作業系統
- 企業為什麼要上管理系統軟體2020-09-16
- RedHat Linux作業系統軟體包的管理2008-06-12RedhatLinux作業系統
- RedHat Linux作業系統軟體包的管理(轉)2007-08-12RedhatLinux作業系統
- 人力資源管理系統中如何應用報表分析2018-08-16
- 順通線上智慧報修管理系統檢修軟體2022-10-26
- pms酒店管理系統功能,酒店管理系統軟體開發2019-08-28
- iOS系統資料恢復軟體PhoneRescue2022-06-24iOS資料恢復
- 能源管理系統軟體功能2019-03-16
- 統信作業系統下資料庫管理利器2024-02-20作業系統資料庫
- 軟體管理報告:安全勢在必行2019-09-15
- XXX管理平臺系統——會議管理2009-08-23
- 金融行業BI視覺化報表,直觀體驗資料的價值2021-09-29行業視覺化
- 軟體工程作業--ATM自助銀行服務系統2020-11-16軟體工程
- 智慧園區管理系統,園區管理軟體2019-03-15
- 皕傑報表軟體的設計器資料庫部署2009-08-28資料庫
- CRM軟體系統如何做資料分析2023-09-20
- 作業系統-記憶體管理2020-07-26作業系統記憶體
- 作業系統——記憶體管理2020-10-12作業系統記憶體
- 軟體系統功能測試報告2021-10-08測試報告
- CRM系統如何進行另類資料管理?2023-10-25
- 大資料行業常用的軟體工具有哪些?2019-03-04大資料行業
- Debian軟體包管理系統(轉)2007-08-15
- 企業管理系統庫存管理軟體進銷存系統協同辦公系統二次開發2021-06-24
- 順通訊息資源庫存管理系統檔案管理軟體2022-06-30
- 報表系統應該如何設計?--開源軟體誕生152020-09-25
- 簡述linux系統中軟體包管理系統2022-11-24Linux
- XXX管理平臺系統——架構2017-11-02架構
- 明明是企業管理軟體,CRM系統為何被牴觸?2021-06-25
- 創業版上市與SAP管理軟體系統的關係薦2009-05-25創業
- 工程管理系統原始碼-物料管理-工程專案管理系統-建築施工管理軟體2023-03-09原始碼專案管理
- HEC更新資料分析系統改善企業管理效率2018-05-17
- XPanel管理系統軟體說明書(二)之伺服器資源管理2022-04-07伺服器
- MES系統軟體企業如何操作?2021-10-22
- 晶片行業管理系統功能介紹2023-12-08晶片行業