您现在的位置:首页 >> API >> API >> 内容

怎样调试Delphi写的服务程序COM对象及Hook程序

时间:2011/9/3 15:43:45 点击:

  核心提示:1.调试delphi 写的服务程序,有这么一个办法。原来每次都是用attach to process方法,很麻烦。并且按照服务线程的执行线路,可能会停不到想要的断点。笨办法是,在procedure T...

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中下断,想断哪就断哪。

作者:呆呆 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
本类推荐
  • 没有
本类固顶
  • 没有
  • 盒子文章(www.2ccc.com) © 2024 版权所有 All Rights Reserved.
  • 沪ICP备05001939号