怎樣調試delphi寫的服務程序-com對象及hook程序

作者:呆呆(abingle.com)

我只會用delphi,也深感於delphi的靈氣。

1.調試delphi 寫的服務程序,有這麼一個辦法。原來每次都是用attach to process方法,很麻煩。並且按照服務線程的執行線路,可能會停不到想要的斷點。笨辦法是,在procedure TsvcFrm.ServiceExecute(Sender: TService);中想要下斷的語句前加個人定勝天的sleep(20000),但實際上這種辦法是主觀臆測的。可行,沒問題。記得大學時,俺一同學,也會修電視,他的辦法是弄個小錘子,四處敲擊,沒兩下就好了,和我用萬用表的方法不一樣,萬用表他根本不會用。而且產生的效益比我的要樂觀。畢業了,他回家開個網吧,也算是做IT,而我成了一位對編程頗有研究的IT業餘人士,結果他收入還是比我高。日,下輩子,老子扛大炮去修勞力士去。回憶回憶過去,展望展望未來,無限感慨。上面的方法是可以的,如同錘子,仔細瞭解下服務程序的執行過程,你會發現,用下面的方法,就可以把服務程序當普通程序調試了。


program svcProxy;

uses
   SvcMgr,
   scvmain in ’scvmain.pas’ {svcFrm: TService};

{$R *.RES}

begin
   Application.Initialize;
   Application.CreateForm(TsvcFrm, svcFrm);
   svcFrm.ServiceExecute(nil);
   //Application.Run;
end.

如上修改dpr文件,就可以直接在serviceexecute過程中下斷了,what a good idea. OK ,debug delphi services directly.

調試好了,修改回去,就行了,調試delphi服務程序就簡單和多了。再也不用去附加到進程這種方法了。

2.調試com對象。

這種方法網上有介紹,帶上。

打開 run->com/comexp.msc ,新建一應用程序(abcd)

並將你的com對象加入進來,找到abcd屬性->高級,將調試勾上,拷下”D:\Delphi7\Bin\bordbg70.exe” C:\WINDOWS\system32\dllhost.exe /ProcessID:{53342392-DAAE-4542-AC55-2EDA5080671E}

在delphi調試中,宿主填上那個dllhost.exe ,參數填上/ProcessID:{53342392-DAAE-4542-AC55-2EDA5080671E},好了,現在就可以當作是普通程序來調試了。有的人說要把這個加上project|option|linker|Include TD32 debug info 和Include remote debug symbols打勾,無所謂,不勾也行,不行就勾。

加上一個小經驗,com程序的類,不能在create中下斷,看看源代碼就知道了,要在init過程中下斷哦。

3.上面其實就是怎樣找宿主的問題,所以要靈活運用啊。舉一例:上次做了一個hook程序,插入到別的進程中,怎麼調試那個插入的dll文件呢?可以,沒問題。比如說,用a.exe 插b.dll 到 c.exe中,我們讓a.exe 中創建 c.exe,並將a.exe做爲宿主,在b.dll.pas中下斷,想斷哪就斷哪。

發佈了9 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章