史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 程式 & 網頁設計技術文件
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2004-01-10, 10:47 PM   #1 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 表單的不同專案的功能互換

雖然我是個門外漢,我也要學一學pe diy 。
我用DaFixer的文章中談到的同一表單中的不同按鈕的功能互換的方法嘗試了一個DE太太HI
軟體,真的很棒!另外,我又試了表單的不同專案的功能互換,也成功了。
下面是一個改動播放MP3的小程序的程序:

1、主表單:文件
表單專案:開啟、播放、重播、暫停、退出

2、
Delphi來源碼(摘自《時尚編程百例會》
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, MPlayer, jpeg, Menus;

type
TForm1 = class(TForm)
MediaPlayer1: TMediaPlayer;
OpenDialog1: TOpenDialog;
Timer1: TTimer;
Label1: TLabel;
MainMenu1: TMainMenu;{主表單,下面是各個專案}
N1: TMenuItem;{文件}
N2: TMenuItem;{開啟}
N3: TMenuItem;{播放}
N4: TMenuItem;{重播}
N5: TMenuItem;{暫停}
N6: TMenuItem;{退出}
procedure Timer1Timer(Sender: TObject);
procedure N2Click(Sender: TObject);{開啟}
procedure N3Click(Sender: TObject);{播放}
procedure N4Click(Sender: TObject);{重播}
procedure N5Click(Sender: TObject);{暫停}
procedure N6Click(Sender: TObject);{退出}
private
{ Private declarations }
public

{ Public declarations }
end;

var
Form1: TForm1;
endposition:integer;

implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if mediaplayer1.position=endposition then
begin
mediaplayer1.rewind;
mediaplayer1.play;
end;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
opendialog1.FileName:='*.mp3';
if opendialog1.Execute then
begin
mediaplayer1.Close;
mediaplayer1.filename:=opendialog1.filename;
label1.caption:='當前播放文件:'+Extractfilename(opendialog1.filename);
mediaplayer1.open;
mediaplayer1.next;
endposition:=mediaplayer1.position;
mediaplayer1.rewind;
N3.enabled:=true;
N4.enabled:=false;
N6.enabled:=false;
end;
end;

procedure TForm1.N3Click(Sender: TObject);
begin
if mediaplayer1.mode=mppaused then
begin
mediaplayer1.Resume;
end
else
begin
mediaplayer1.play;
end;
N6.Enabled:=true;
N4.enabled:=true;
timer1.Enabled:=true;
end;

procedure TForm1.N4Click(Sender: TObject);
begin
mediaplayer1.Rewind;
mediaplayer1.Play;
end;

procedure TForm1.N5Click(Sender: TObject);
begin
mediaplayer1.Pause;
N4.Enabled:=false;
N6.enabled:=false;
end;

procedure TForm1.N6Click(Sender: TObject);
begin
mediaplayer1.close;
close;
end;

end.

3、下面是在WinHex9.92中複製下來的相關資訊:
(複製的方法是選區域後,點EDIT--COPY BLOCK--EDITOR DISPLAY ,再貼上到所需處.)

Offset 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

00418672 54 46 6F 72 6D 31 05 46 6F 72 6D 31 04 4C 65 TForm1.Form1.Le
00418688 66 74 03 0E 01 03 54 6F 70 03 31 01 05 57 69 64 ft....Top.1..Wid
00418704 74 68 03 61 01 06 48 65 69 67 68 74 03 99 00 07 th.a..Height.?.
00418720 43 61 70 74 69 6F 6E 06 09 4D 50 33 B2 A5 B7 A2 Caption..MP3播放
00418736 C6 F7 05 43 6F 6C 6F 72 07 09 63 6C 42 74 6E 46 器.Color..clBtnF
00418752 61 63 65 0C 46 6F 6E 74 2E 43 68 61 72 73 65 74 ace.Font.Charset
00418768 07 0F 44 45 46 41 55 4C 54 5F 43 48 41 52 53 45 ..DEFAULT_CHARSE
00418784 54 0A 46 6F 6E 74 2E 43 6F 6C 6F 72 07 0C 63 6C T.Font.Color..cl
00418800 57 69 6E 64 6F 77 54 65 78 74 0B 46 6F 6E 74 2E WindowText.Font.
00418816 48 65 69 67 68 74 02 F5 09 46 6F 6E 74 2E 4E 61 Height.?Font.Na
00418832 6D 65 06 0D 4D 53 20 53 61 6E 73 20 53 65 72 69 me..MS Sans Seri
00418848 66 0A 46 6F 6E 74 2E 53 74 79 6C 65 0B 00 04 4D f.Font.Style...M
00418864 65 6E 75 07 09 4D 61 69 6E 4D 65 6E 75 31 0E 4F enu..MainMenu1.O
00418880 6C 64 43 72 65 61 74 65 4F 72 64 65 72 08 0D 50 ldCreateOrder..P
00418896 69 78 65 6C 73 50 65 72 49 6E 63 68 02 60 0A 54 ixelsPerInch.`.T
00418912 65 78 74 48 65 69 67 68 74 02 0D 00 06 54 4C 61 extHeight....TLa
00418928 62 65 6C 06 4C 61 62 65 6C 31 04 4C 65 66 74 02 bel.Label1.Left.
00418944 18 03 54 6F 70 02 10 05 57 69 64 74 68 02 03 06 ..Top...Width...
00418960 48 65 69 67 68 74 02 0D 00 00 0C 54 4D 65 64 69 Height.....TMedi
00418976 61 50 6C 61 79 65 72 0C 4D 65 64 69 61 50 6C 61 aPlayer.MediaPla
00418992 79 65 72 31 04 4C 65 66 74 02 40 03 54 6F 70 02 yer1.Left.@.Top.
00419008 20 05 57 69 64 74 68 03 FD 00 06 48 65 69 67 68 .Width.?.Heigh
00419024 74 02 1E 08 54 61 62 4F 72 64 65 72 02 00 00 00 t...TabOrder....
00419040 0B 54 4F 70 65 6E 44 69 61 6C 6F 67 0B 4F 70 65 .TOpenDialog.Ope
00419056 6E 44 69 61 6C 6F 67 31 04 4C 65 66 74 03 98 00 nDialog1.Left.?
00419072 03 54 6F 70 02 38 00 00 06 54 54 69 6D 65 72 06 .Top.8...TTimer.
00419088 54 69 6D 65 72 31 07 4F 6E 54 69 6D 65 72 07 0B Timer1.OnTimer..
00419104 54 69 6D 65 72 31 54 69 6D 65 72 04 4C 65 66 74 Timer1Timer.Left
00419120 03 B8 00 03 54 6F 70 02 38 00 00 09 54 4D 61 69 .?.Top.8...TMai
00419136 6E 4D 65 6E 75 09 4D 61 69 6E 4D 65 6E 75 31 04 nMenu.MainMenu1.
00419152 4C 65 66 74 02 78 03 54 6F 70 02 38 00 09 54 4D Left.x.Top.8..TM
00419168 65 6E 75 49 74 65 6D 02 4E 31 07 43 61 70 74 69 enuItem.N1.Capti
00419184 6F 6E 06 04 CE C4 BC FE 08 53 68 6F 72 74 43 75 on..文件.ShortCu
00419200 74 03 46 40 00 09 54 4D 65 6E 75 49 74 65 6D 02 t.F@..TMenuItem.
00419216 4E 32 07 43 61 70 74 69 6F 6E 06 04 B4 F2 BF AA N2.Caption..開啟
00419232 08 53 68 6F 72 74 43 75 74 03 4F 40 07 4F 6E 43 .ShortCut.O@.OnC
00419248 6C 69 63 6B 07 07 4E 32 43 6C 69 63 6B 00 00 09 lick..N2Click...---A
00419264 54 4D 65 6E 75 49 74 65 6D 02 4E 33 07 43 61 70 TMenuItem.N3.Cap
00419280 74 69 6F 6E 06 04 B2 A5 B7 C5 08 53 68 6F 72 74 tion..播放.Short
00419296 43 75 74 03 50 40 07 4F 6E 43 6C 69 63 6B 07 07 Cut.P@.OnClick..
00419312 4E 33 43 6C 69 63 6B 00 00 09 54 4D 65 6E 75 49 N3Click...TMenuI--B
00419328 74 65 6D 02 4E 34 07 43 61 70 74 69 6F 6E 06 04 tem.N4.Caption..
00419344 D6 D8 B2 A5 08 53 68 6F 72 74 43 75 74 03 52 40 重播.ShortCut.R@
00419360 07 4F 6E 43 6C 69 63 6B 07 07 4E 34 43 6C 69 63 .OnClick..N4Clic-C
00419376 6B 00 00 09 54 4D 65 6E 75 49 74 65 6D 02 4E 35 k...TMenuItem.N5
00419392 07 43 61 70 74 69 6F 6E 06 04 D4 DD CD A3 08 53 .Caption..暫停.S
00419408 68 6F 72 74 43 75 74 03 50 40 07 4F 6E 43 6C 69 hortCut.P@.OnCli
00419424 63 6B 07 07 4E 35 43 6C 69 63 6B 00 00 09 54 4D ck..N5Click...TM--D
00419440 65 6E 75 49 74 65 6D 02 4E 36 07 43 61 70 74 69 enuItem.N6.Capti
00419456 6F 6E 06 04 CD CB B3 F6 08 53 68 6F 72 74 43 75 on..退出.ShortCu
00419472 74 03 45 40 07 4F 6E 43 6C 69 63 6B 07 07 4E 36 t.E@.OnClick..N6--E
00419488 43 6C 69 63 6B 00 00 00 00 00 00 00 00 00 02 00 Click...........

4、
只要在上面A、B、C、D、E五處分別把N2Click、N3Click、N4Click、N5Click、N6Click中的
2、3、4、5、6幾個數字交叉改動一下,就實現了表單的不同專案的功能互換。


但是如何加上原軟體中沒有的功能(如:把「關於」表單的功能改為播放一首MP3)該怎麼辦,請大家告訴我。


+DaFixer誰呢,用過DeDe的人應該瞭解的!這裡只是一部分,餘下的我還沒有找到,還請小樓指點:
--------------------------------------
本文告訴你如何改變Delphi程序的事件處理,如何用HEX編輯方式增加自己的功能。閱讀本文之前需要有一些Delphi的編程經驗。
----------------

Delphi逆向工程
--------給Delphi程序增加自己的功能
原著:+DaFixer
位址:http://www.balbaro.com/dafixer/D1.html
翻譯:upfeed
----------------

介紹:
------
這是我的第一篇關於Delphi逆向工程的文章,主要是講解如何加入自己的功能,並且能直接使用到VCL庫(控件)。這裡會給出一些Delphi可

執行文件格式、類信息以及DFM資源。目的不是為了加什麼程式碼或者破解什麼程序,僅僅是給出Delphi事件處理的原理,我們能夠以哪些方式修

改程序。希望你能夠喜歡它。

需要的工具:
------------
HEX編輯器,別無它物。

目標:
------
沒有特別的目標,你可以使用任何一個Delphi程序作為練習對像(但是它們可不能被加殼)。然而文中還是要用一些程序作為例子,這裡

(http://www.balbaro.com/dafixer/files/test1.zip)有一個我自己寫的,你可以下載。

正文:
------

第一部分:

* Delphi可執行程序、類信息和DFM資源。
* 事件處理程序。
* 修改DFM資源和類信息來重定位事件處理程序。

在開始之前,我先解釋Delphi可執行程序的內部結構。由Delphi3,4,5編譯的可執行程序有以下幾個節:CODE,DATA,BSS,.idata,tls

,.rdata,.rsrc。根據我們的需要,CODE和.rsrc節比較重要。

.rsrc節:
---------
這裡除了一般的資源以外,還有工程信息和DFM資源信息,這一節開始部分是一般的資源表,接著是工程信息,最後就是DFM資源了。DFM資

源包括了所有控件的描述,控件(不論是不是可視)published的內容的初始設定。不同Form的資源在不同的區段裡(就像小節一樣),每個都是以

#54,#50,#46,#30(TPF0)開始,緊跟其後的就是Form的名字,以pascal串形式存放(第一個字元是長度)。每一個DFM小節都是在連接的時候,由

編譯器直接從原始的.dfm文件中考過來的。注意DFM資源也稱為RCDATA類型的資源,在.rsrc節的資源表中也有描述,所以可以用資源編輯軟體

來編輯,效果就像Borland自己的資源編輯環境一樣。更有趣的是在DFM資源中到底包含一些什麼,答案就是你在Delphi中用對像察看器(左邊的

浮動視窗)看到的所有東西。這就是說我們可以僅僅編輯DFM資源資料,來讓控件的任何published內容改變。其中就包括了重定位對象的事件處

理程序。

另外,Delphi中的VCL控件有一些程序可以允許你讀取RCDATA資源,也可以把它們轉存成TXT格式。在classes.pas文件中定義了以下程序:

ObjectBinaryToText()
ObjectResourceToText()
ObjectTextToBinary()
ObjectTextToResource()

用它們可以簡單把2進制的DFM RCDATA資源轉換成其它的表示形式。一種一般的Form描述如下所顯示,它其實就是我寫的程序中的Form1:

object Form1: TForm1
Left = 192
Top = 105
Width = 215
Height = 109
Caption = 'Test Project 1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 8
Top = 16
Width = 75
Height = 25
Caption = 'Show Form2'
TabOrder = 0
OnClick = Button1Click
end
end

當你在設計Form的時候,Delphi程序本身就在頻繁的使用這幾個程序。如果不相信,可以在Form中選項某些控件,然後Ctrl+C複製,如果

你在Form中Ctrl+V貼上可以得到一份複製的,如果在文本界面中貼上的話,Delphi就會使用ObjectBinaryToText(),貼上的效果就是控件的文

本表現方式。

接下來舉一個小例子:我編譯了一個簡單的小程序,有2個Forms,Form1有2個按鈕,按鈕1會顯示Form2,按鈕2出現一個提示框;Form2只

有一個按鈕,也是出現一個提示框。下面通過改變DFM資源來修改Form1的2個按鈕的事件處理程序。把例子程序用HEX編輯器開啟,然後找到下

面:

0004A4E0 020D 0007 5442 7574 746F 6E07 4275 7474 ....TButton.Butt
0004A4F0 6F6E 3104 4C65 6674 0208 0354 6F70 0210 on1.Left...Top..
0004A500 0557 6964 7468 024B 0648 6569 6768 7402 .Width.K.Height.
0004A510 1907 4361 7074 696F 6E06 0A53 686F 7720 ..Caption..Show
0004A520 466F 726D 3208 5461 624F 7264 6572 0200 Form2.TabOrder..
0004A530 074F 6E43 6C69 636B 070C 4275 7474 6F6E .OnClick..Button <---這裡有按鈕1的回應事件名稱
0004A540 3143 6C69 636B 0000 0754 4275 7474 6F6E 1Click...TButton
0004A550 0742 7574 746F 6E32 044C 6566 7402 0803 .Button2.Left...
0004A560 546F 7002 3005 5769 6474 6802 4B06 4865 Top.0.Width.K.He
0004A570 6967 6874 0219 0743 6170 7469 6F6E 0604 ight...Caption..
0004A580 496E 666F 0854 6162 4F72 6465 7202 0107 Info.TabOrder...
0004A590 4F6E 436C 6963 6B07 0C42 7574 746F 6E32 OnClick..Button2 <---這裡有按鈕2的回應事件名稱
0004A5A0 436C 6963 6B00 0000 5450 4630 0654 466F Click...TPF0.TFo

我們把按鈕1和按鈕2的事件處理位置對換:

0004A4E0 020D 0007 5442 7574 746F 6E07 4275 7474 ....TButton.Butt
0004A4F0 6F6E 3104 4C65 6674 0208 0354 6F70 0210 on1.Left...Top..
0004A500 0557 6964 7468 024B 0648 6569 6768 7402 .Width.K.Height.
0004A510 1907 4361 7074 696F 6E06 0A53 686F 7720 ..Caption..Show
0004A520 466F 726D 3208 5461 624F 7264 6572 0200 Form2.TabOrder..
0004A530 074F 6E43 6C69 636B 070C 4275 7474 6F6E .OnClick..Button <---按鈕1的回應事件名稱改成按鈕2的
0004A540 3243 6C69 636B 0000 0754 4275 7474 6F6E 2Click...TButton
0004A550 0742 7574 746F 6E32 044C 6566 7402 0803 .Button2.Left...
0004A560 546F 7002 3005 5769 6474 6802 4B06 4865 Top.0.Width.K.He
0004A570 6967 6874 0219 0743 6170 7469 6F6E 0604 ight...Caption..
0004A580 496E 666F 0854 6162 4F72 6465 7202 0107 Info.TabOrder...
0004A590 4F6E 436C 6963 6B07 0C42 7574 746F 6E31 OnClick..Button1 <---按鈕2的回應事件名稱改成按鈕1的
0004A5A0 436C 6963 6B00 0000 5450 4630 0654 466F Click...TPF0.TFo

這樣就可以了!把它另存新檔一個新的可執行,然後執行,你會發現按鈕1和按鈕2的效果已經交換了。


用這種方法可以重新定位同一個Form中的控件的事件處理程序,但是也要注意重定位的事件是否匹配,例如把TButton1.OnClick定位到

TForm.OnKeyDown就不行!也不能把Form1.Button1.OnClick定位到Form2.Button1Click事件上,但是我們卻可以用另外的方法辦到,往下看。

CODE節:
-------
這裡存放著所有的類信息和彙編程式碼。CODE節的最後就是dpr的程式碼。

我不會解釋類信息中的所有資料的含義,主要要介紹如何找一個事件處理程序的RVA位址。還是用HEX編輯器開啟那個程序,我們知道有

Form1和Form2,在CODE節中搜尋字串串'TForm2',可以找到2項:

0003F870 746F 6E31 0100 1300 B804 4400 0C42 7574 ton1......D..But
0003F880 746F 6E31 436C 6963 6B06 5446 6F72 6D32 ton1Click.TForm2
0003F890 0100 58C3 4100 8BC0 9C04 4400 0706 5446 ..X.A.....D...TF
0003F8A0 6F72 6D32 8C03 4400 4440 4300 5500 0555 orm2..D.D@C.U..U
0003F8B0 6E69 7432 0000 8BC0 B8CC 0444 00E8 8EFC nit2.......D....

首先注意到所有的字串串是以pascal的格式存放的。
就在'Button1Click'前面有一個'B8044400',用猜的就知道這個就是Form2.Button1Click的RVA位址。如果我們反編譯一下,然後跳到

'004404B8',就會看到下面的程式碼:

* Possible String Reference to: "Hello from Form2"
|
004404B8 B8CC044400 mov eax, $004404CC

* Reference to: Dialogs.ShowMessage(System.AnsiString)
|
004404BD E88EFCFFFF call 00440150
004404C2 C3 ret

這裡就是處理TForm2.Button1.OnClick事件的程序了。很自然的想到改變這個RVA位址,就可以讓它的回應程序變到別的Form中了,那麼我

們要知道的就是那個RVA位址了。要注意的是我們不是簡單的把事件處理指到任何程序段就可以了,因為不同的處理程序要求不同的參數傳遞。

所以在我們的例子中是把Form1.Button1.OnClick指到Form2.Button1OnClick,把Form2.Button1.OnClick指到Form1.Button1OnClick,它們都

是TNotifyEvent類型的處理程序,有如下的定義:

Type TNotifyEvent = procedure (Sender : TObject) of object;

所以我們可以把TNotifyEvent類型的任何程序賦給TButton.OnClick。好!動手幹吧。在改變之前我們先找到2個按鈕各自的處理程序的RVA

。我們可以在CODE節中找到'TForm1'字串串,然後可以看到下面:

0003FA50 0000 0742 7574 746F 6E32 0200 1300 B006 ...Button2......
0003FA60 4400 0C42 7574 746F 6E32 436C 6963 6B13 D..Button2Click.
0003FA70 00D8 0644 000C 4275 7474 6F6E 3143 6C69 ...D..Button1Cli
0003FA80 636B 0654 466F 726D 3101 0058 C341 0090 ck.TForm1..X.A..
0003FA90 9406 4400 0706 5446 6F72 6D31 6405 4400 ..D...TForm1d.D.
0003FAA0 4440 4300 5500 0555 6E69 7431 0000 8BC0 D@C.U..Unit1....

與是我們知道TForm1.Button1Click的RVA是 - 004406D8,TForm1.Button2Click的RVA是 - 004406B0。下面就可以把

TForm1.Button1.OnClick的RVA改成 - 004404B8:

0003FA50 0000 0742 7574 746F 6E32 0200 1300 B804 ...Button2......
0003FA60 4400 0C42 7574 746F 6E32 436C 6963 6B13 D..Button2Click.
0003FA70 00D8 0644 000C 4275 7474 6F6E 3143 6C69 ...D..Button1Cli
0003FA80 636B 0654 466F 726D 3101 0058 C341 0090 ck.TForm1..X.A..
0003FA90 9406 4400 0706 5446 6F72 6D31 6405 4400 ..D...TForm1d.D.
0003FAA0 4440 4300 5500 0555 6E69 7431 0000 8BC0 D@C.U..Unit1....

然後把TForm2.Button1.OnClick的RVA改成 - 004406D8:

0003F870 746F 6E31 0100 1300 D806 4400 0C42 7574 ton1......D..But
0003F880 746F 6E31 436C 6963 6B06 5446 6F72 6D32 ton1Click.TForm2
0003F890 0100 58C3 4100 8BC0 9C04 4400 0706 5446 ..X.A.....D...TF
0003F8A0 6F72 6D32 8C03 4400 4440 4300 5500 0555 orm2..D.D@C.U..U
0003F8B0 6E69 7432 0000 8BC0 B8CC 0444 00E8 8EFC nit2.......D....

做完了就另存新檔一個可執行文件然後執行它,是不是可以了?
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 11:27 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1