Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

怎么调试dll文件

232 views
Skip to first unread message

netmas...@126.com

unread,
Jun 7, 2007, 9:14:29 AM6/7/07
to ph4nt0m
我最近写了个dll。通过svchost加载。想让它以服务运行。
里面有响应服务的函数。但是程序中不知道什么地方出了错误。
我想调试一下。有什么好的方法吗。

本来想用svchost加载调试的。vc说svchost不包含调试信息。该怎么解决啊。
rundll32也是无法调试。
各位大侠有遇到这种情况的吗。


人 山 人 海 盛 景,尽 在 梦 幻 西 游

gy zy

unread,
Jun 7, 2007, 9:20:53 AM6/7/07
to ph4...@googlegroups.com
OutPutDebugString或者土办法,写文件

netmas...@126.com

unread,
Jun 7, 2007, 9:36:32 AM6/7/07
to ph4...@googlegroups.com
不错,这个想法很好。非常感谢。
还有没有其他的方法。
如果要编写以服务运行的dll。dll内部的函数执行过程是怎样的那。
如果是svchost加载dll文件的话,dllmain函数还能得到执行吗。
内部函数的执行顺序是不是以下方式

dllmain
ServiceMain //注册服务的函数
ServiceHandler//服务响应函数


需要在dllmain里调用servicemain函数吗。
还是操作系统自己主动去调用它。

我对以服务运行的dll文件内部函数运行的细节不太懂。




-------原邮件内容如下-------
发件人:"gy zy" <gyzy...@gmail.com>
收件人:ph4...@googlegroups.com
日期:Thu, 7 Jun 2007 21:20:53 +0800 (CST)
主题:[Ph4nt0m] Re: 怎么调试dll文件




OutPutDebugString或者土办法,写文件


On 6/7/07, netmas...@126.com <netmas...@126.com> wrote:
我最近写了个dll。通过svchost加载。想让它以服务运行。
里面有响应服务的函数。但是程序中不知道什么地方出了错误。
我想调试一下。有什么好的方法吗。

本来想用svchost加载调试的。vc说svchost不包含调试信息。该怎么解决啊。
rundll32也是无法调试。
各位大侠有遇到这种情况的吗。



人 山 人 海 盛 景,尽 在 梦 幻 西 游




劲 爆 150 万 同 时 在 线,众 人 追 捧 梦 幻 西 游

gougou_2

unread,
Jun 7, 2007, 10:00:21 AM6/7/07
to ph4...@googlegroups.com
写一个exe程序,这个exe程序只负责loadlibray你那个dll,然后在exe工程里面设置debug的路径就可以了。
 

gougou_2
2007-06-07

发件人: netmas...@126.com
发送时间: 2007-06-07 21:37:08
抄送:
主题: [Ph4nt0m]_Re:_怎么调试dll文件

netmas...@126.com

unread,
Jun 7, 2007, 10:11:03 AM6/7/07
to ph4...@googlegroups.com
我有个疑问,因为我的那个dll文件是要以服务运行的。那么loadlibray后,里面的服务响应函数还会不会执行那。

明天再试吧。我们下课了。老师要赶人了。已经10点了。晚安。






-------原邮件内容如下-------
发件人:"gougou_2" <goug...@126.com>
收件人:"ph4...@googlegroups.com" <ph4...@googlegroups.com>
日期:Thu, 7 Jun 2007 22:00:21 +0800 (CST)
主题:[Ph4nt0m] Re: [Ph4nt0m]_Re:_怎么调试dll文件




写一个exe程序,这个exe程序只负责loadlibray你那个dll,然后在exe工程里面设置debug的路径就可以了。




gougou_2
2007-06-07
劲 爆 150 万 同 时 在 线,众 人 追 捧 梦 幻 西 游 梦 幻 西 游,千 万 人 的 选 择,你 的 选 择

Docoocoo

unread,
Jun 7, 2007, 10:12:01 AM6/7/07
to ph4...@googlegroups.com
不行的话,在服务主函数开始里加个Beep函数,用Softice调试吧

在07-6-7,netmas...@126.com <netmas...@126.com> 写道:

GaRY

unread,
Jun 7, 2007, 10:12:18 AM6/7/07
to ph4...@googlegroups.com
直接用od之类的挂载加载此dll的exe,并且在dll的关键函数中用int 3软中断下来

在07-6-7,netmas...@126.com <netmas...@126.com> 写道:

Docoocoo

unread,
Jun 7, 2007, 10:15:48 AM6/7/07
to ph4...@googlegroups.com
服务安装,启动时都可以接管调试啊

之后它才运行服务主程序啊



 
在07-6-7,netmas...@126.com <netmas...@126.com> 写道:

fleshwound

unread,
Jun 7, 2007, 7:26:10 PM6/7/07
to ph4...@googlegroups.com
正解,注意下程序领空就行了。

netmas...@126.com

unread,
Jun 8, 2007, 12:54:45 AM6/8/07
to ph4...@googlegroups.com
总结一下,
方法一,自己写个exe调用dll 。gougou_2 ,fleshwound
方法二,加入输出功能,通过写文件方法,输出调试信息。gy zy
方法三,用beep方法,这个比较新颖。我没有想到过,有机会尝试一下。呵呵。Docoocoo
方法四,通过od或Softice加载。GaRY ,Docoocoo

我的疑问。
1,如果自己写exe加载dll,那么和系统的svchost加载在程序流程上会不会不太一样?是svchost加载的原理是怎么样的。
2,我还不清楚怎么勇od或softice加载,如果attach process的话,因为svchost是系统进程,会不会把系统搞崩溃。


一 起 来,150 万 人 同 时 在 玩 的 梦 幻 西 游

云舒

unread,
Jun 8, 2007, 2:28:33 AM6/8/07
to ph4...@googlegroups.com
谁说svchost是系统进程......加载你自己写的个dll,哪里算得上系统进程啊。
 

云舒
2007-06-08

发件人: netmas...@126.com
发送时间: 2007-06-08 12:55:10
抄送:
主题: [Ph4nt0m]_怎么调试dll文件

凌御

unread,
Jun 8, 2007, 3:01:13 AM6/8/07
to ph4...@googlegroups.com
我总结一下:
1 你想写个以svchost.exe来运行的dll,替换系统服务吧?
2 你不知道这个dll里的ServiceMain函数在被svchost.exe挂载的时候具体是如何的,和自己写exe挂载(LoadLibrary)是否有什么区别,自己用exe挂,是否会执行ServiceMain函数里的功能代码对吧?
 
不知道我是否理解错误:)
 
你能不能说说你的ServiceMain函数中具体要实现什么功能,建议你多看看别人写的框架,不知道你是用什么语言写这个dll,我最近也在写这样的一个东西,我是用delphi写的,也出现了一些问题。
主要是理解进程地址空间的问题和dll模块与宿主进程之间的关系以及内存的操作……
 
例如我在里面加入一个涉及到读写内存的函数就出错,因为没有理解好dll和exe进程空间的关系的原因。
 

凌御

unread,
Jun 8, 2007, 3:03:01 AM6/8/07
to ph4...@googlegroups.com
另外,建议你看看大侠写的那篇文章,加深对svchost.exe进程的了解
 

Docoocoo

unread,
Jun 8, 2007, 3:16:13 AM6/8/07
to ph4...@googlegroups.com
整理的一点关于服务的资料,
其中"Svchost相关"下的"创建Svchost.exe调用的服务原理与实践"一文讲的比较细,对你理解Svchost应该会有帮助。

 
在07-6-8,netmas...@126.com <netmas...@126.com> 写道:
Windows Services.rar

gougou_2

unread,
Jun 8, 2007, 3:18:02 AM6/8/07
to ph4...@googlegroups.com
这么说吧,我写过一个dll,是替换服务注入service的,就是用我说的exe调试dll的方式,很方便,没有什么问题。
 

gougou_2
2007-06-08

发件人: netmas...@126.com
发送时间: 2007-06-08 13:01:18
抄送:
主题: [Ph4nt0m]_怎么调试dll文件
 

凌御

unread,
Jun 8, 2007, 3:24:02 AM6/8/07
to ph4...@googlegroups.com
不知道你可明白什么是输出表
你自己写exe调用它 ,只是load的话,和用svchost调用不同,svchost调用不但load了,还调用了里面的函数,你如果想模仿svchost调用,也需要调用这个ServiceMain函数,但是还是有区别的
因为svchost是以服务启动的
具体你最好深入的看doooc推荐的那个实践
 
因为以服务启动的进程(特别是svchost进程)调用的dll,和你用普通exe调用一个dll是有区别的
函数中的代码 如果涉及到一些操作 最好你要明白这些操作 所处的环境
 
svchost不是是所谓的"系统进程",如果这个svchost调用的dll是你自己写的,就不是系统自身的
此时的svchost进程不是系统服务进程,只不过以服务启动罢了 挂了也就是这个进程挂了 和系统没关系
 
除非这个进程被别的服务共享……

凌御

unread,
Jun 8, 2007, 3:28:24 AM6/8/07
to ph4...@googlegroups.com
哈哈 win98玩sice和trw的时候就看到领空的概念了
后来学编程 才接触到进程内存空间

netmas...@126.com

unread,
Jun 8, 2007, 3:34:06 AM6/8/07
to ph4...@googlegroups.com
以前我关闭过svchost,导致系统重启,所以一直对svchost有点恐惧。不敢随便动它。~_~
云舒大哥是不是说,svchost不是系统进程。或者最起码,加载我的那个dll的svchost进程不会是系统级的。

多谢云舒大哥的指点,我先调试一下。实践实践。

凌御 对我的理解是基本正确的。以前写过服务运行的exe文件。现在想了解一下系统加载dll的过程。尤其是svchost加载的服务文件。我不清楚svchost调用dll的过程。其实这个疑问我存在很久了。到现在我才决定研究一下。以前我经常在学校帮助同学查杀病毒与木马,知道有的木马,是利用svchost的加载,通过替换服务运行的。所以想知道关于系统服务更多的知识。找不到那种木马的代码可以参考。我想自己编程实现一下。我用的是vc6。我对delphi不太熟悉。不然我们交流一下。

多谢Docoocoo 提供的资料。十分宝贵。我会仔细读一遍的。

-------原邮件内容如下-------
发件人:"云舒" <ph4nt0m...@gmail.com>
收件人:"ph4...@googlegroups.com" <ph4...@googlegroups.com>
日期:Fri, 8 Jun 2007 14:28:33 +0800 (CST)
主题:[Ph4nt0m] Re: [Ph4nt0m]_怎么调试dll文件




谁说svchost是系统进程......加载你自己写的个dll,哪里算得上系统进程啊。




云舒
2007-06-08




发件人: netmas...@126.com
发送时间: 2007-06-08 12:55:10
收件人: ph4...@googlegroups.com
抄送:
主题: [Ph4nt0m]_怎么调试dll文件

总结一下,
方法一,自己写个exe调用dll 。gougou_2 ,fleshwound
方法二,加入输出功能,通过写文件方法,输出调试信息。gy zy
方法三,用beep方法,这个比较新颖。我没有想到过,有机会尝试一下。呵呵。Docoocoo
方法四,通过od或Softice加载。GaRY ,Docoocoo

我的疑问。
1,如果自己写exe加载dll,那么和系统的svchost加载在程序流程上会不会不太一样?是svchost加载的原理是怎么样的。
2,我还不清楚怎么勇od或softice加载,如果attach process的话,因为svchost是系统进程,会不会把系统搞崩溃。



一 起 来,150 万 人 同 时 在 玩 的 梦 幻 西 游 人 山 人 海 盛 景,尽 在 梦 幻 西 游

凌御

unread,
Jun 8, 2007, 3:41:11 AM6/8/07
to ph4...@googlegroups.com
哦,用不用delphi没关系,其实都是在用api,无所谓的,思路大致理解起来都一样的
刚才问你是不是用delphi是因为手头有这样的框架可以提供给你参考。
以服务执行的exe相对简单,其实dll也不复杂,不过dll里的函数代码需要考虑下所处的环境(理解下进程空间、dll作为模块被调用的概念),因为dll本身是没有进程空间的,使用的都是宿主进程,在执行一些操作的时候,容易误解引起错误~我刚开始学编程就经常犯这样的错误:exe里的功能代码在dll里不可以用~~~

凌御

unread,
Jun 8, 2007, 3:44:12 AM6/8/07
to ph4...@googlegroups.com
系统里有很多个svchost进程,负责不同的服务,当然有些系统服务的dll是共享svchost的。
你可以用冰刃查看这些进程中的模块  对应服务所启动的dll就知道了
有些系统服务是可以关闭和停止,甚至是直接结束系统进程的,你结束bits等服务的svchost进程,是不会有什么问题 顶多这个服务不可用而已
 
而一些系统关键服务用到的svchost进程,你结束了当然挂了,表现为:倒计时或者直接重启、蓝屏
 
例如rpcss等……
 
自己替换的服务,一般不和别的服务共享进程的
 

netmas...@126.com

unread,
Jun 8, 2007, 4:33:22 AM6/8/07
to ph4...@googlegroups.com
先大体通读了一遍Docoocoo 给的资料。内容很深入的讲解了服务的调用。我的很多疑点都得到了澄清。还没有来得及实验。

凌御的话说的很好。感觉自己碰到的问题和他遇到过的问题都差不多。凌御,可以把你的代码发给我让我看看吗(不大好意思)。我想基本的程序流程和基本的数据结构我还是可以看懂的。以前因为灰鸽子才学了一点delphi。还是喜欢c++。呵呵。

我很喜欢系统和网络以及安全方面的编程。这些知识很少能在书本上找得到的。也许很多的技术只有hacker中才可以学到。

最后向大家确认一下以下问题

资料中说:
服务的代码必须要有一个一般的main或者WinMain函数。这个函数应该会马上调用StartServiceCrtlDispatcher函数。通过调用这个函数,你可以让SCM得到ServiceMain函数的指针,这样在SCM要启动该服务时,就可以调用它

那么在svchost调用dll文件时,还需要dllmain函数实现StartServiceCrtlDispatcher。因为我发现有的dll代码里根本就没有StartServiceCrtlDispatcher函数。是不是加载的进程可以直接得到ServiceMain函数的指针,所以就不需要那个StartServiceCrtlDispatcher了。


-------原邮件内容如下-------
发件人:"凌御" <mai...@gmail.com>
收件人:ph4...@googlegroups.com
日期:Fri, 8 Jun 2007 15:41:11 +0800 (CST)

主题:[Ph4nt0m] Re: [Ph4nt0m]_怎么调试dll文件




哦,用不用delphi没关系,其实都是在用api,无所谓的,思路大致理解起来都一样的
刚才问你是不是用delphi是因为手头有这样的框架可以提供给你参考。
以服务执行的exe相对简单,其实dll也不复杂,不过dll里的函数代码需要考虑下所处的环境(理解下进程空间、dll作为模块被调用的概念),因为dll本身是没有进程空间的,使用的都是宿主进程,在执行一些操作的时候,容易误解引起错误~我刚开始学编程就经常犯这样的错误:exe里的功能代码在dll里不可以用~~~

百 万 同 时 在 线,人 山 人 海 同 玩 梦 幻 西 游

netmas...@126.com

unread,
Jun 8, 2007, 4:36:29 AM6/8/07
to ph4...@googlegroups.com
请教gougou_2一下,自己写个exe文件,是不是只要实现这个exe调用dll中ServiceMain函数。







-------原邮件内容如下-------
发件人:"gougou_2" <goug...@126.com>
收件人:"ph4...@googlegroups.com" <ph4...@googlegroups.com>
日期:Fri, 8 Jun 2007 15:18:02 +0800 (CST)
主题:[Ph4nt0m] Re: [Ph4nt0m]_怎么调试dll文件





这么说吧,我写过一个dll,是替换服务注入service的,就是用我说的exe调试dll的方式,很方便,没有什么问题。




gougou_2
2007-06-08




发件人: netmas...@126.com
发送时间: 2007-06-08 13:01:18
收件人: ph4...@googlegroups.com
抄送:
主题: [Ph4nt0m]_怎么调试dll文件

总结一下,
方法一,自己写个exe调用dll 。gougou_2 ,fleshwound
方法二,加入输出功能,通过写文件方法,输出调试信息。gy zy
方法三,用beep方法,这个比较新颖。我没有想到过,有机会尝试一下。呵呵。Docoocoo
方法四,通过od或Softice加载。GaRY ,Docoocoo

我的疑问。
1,如果自己写exe加载dll,那么和系统的svchost加载在程序流程上会不会不太一样?是svchost加载的原理是怎么样的。
2,我还不清楚怎么勇od或softice加载,如果attach process的话,因为svchost是系统进程,会不会把系统搞崩溃。



一 起 来,150 万 人 同 时 在 玩 的 梦 幻 西 游 百 万 同 时 在 线,人 山 人 海 同 玩 梦 幻 西 游

throb

unread,
Jun 8, 2007, 5:10:00 AM6/8/07
to ph4...@googlegroups.com
加个DebugBreak()不就行了吗,直接用Windbg

在07-6-8,netmas...@126.com <netmas...@126.com> 写道:

gougou_2

unread,
Jun 8, 2007, 4:51:29 AM6/8/07
to ph4...@googlegroups.com
抱歉,这个我不清楚,因为没有实践过,但是我想普通dll是加载执行,因此exe需要loadlibray,那么如果这个dll是servicemain导出的话,是不是也可以.....等待牛人回答了,呵呵。
 

gougou_2
2007-06-08

发件人: netmas...@126.com
发送时间: 2007-06-08 16:36:40
抄送:
主题: [Ph4nt0m]_Re:_[Ph4nt0m]_怎么调试dll文件

凌御

unread,
Jun 8, 2007, 10:25:13 AM6/8/07
to ph4...@googlegroups.com
windows核心编程有很多你所想要知道的东西 呵呵~~
我也是最近才着手学编程
 

netmas...@126.com

unread,
Jun 8, 2007, 8:11:20 PM6/8/07
to ph4...@googlegroups.com
我对编程也很感兴趣。也是刚起步。咱们做个朋友吧。有什么资料可以互相交流,互相学习。以后你发信,我一定会尽量帮你找资料的。希望有一天,我们也能成为象云舒那样的大侠。呵呵。
我想你一定喜欢hack编程。我也收集了一些。部分截图在附件里,有需要的话,可以发给你。





-------原邮件内容如下-------
发件人:"凌御" <mai...@gmail.com>
收件人:ph4...@googlegroups.com
日期:Fri, 8 Jun 2007 22:25:13 +0800 (CST)

主题:[Ph4nt0m] Re: [Ph4nt0m]_怎么调试dll文件




windows核心编程有很多你所想要知道的东西 呵呵~~
我也是最近才着手学编程
资料.bmp

云舒

unread,
Jun 8, 2007, 10:01:37 PM6/8/07
to ph4...@googlegroups.com
晕,就PST而言,你可以说成为EMM那样的,成为eva那样的,成为刺头那样的,成为oyxin那样的,mix那样的,SHE那样的,luoluo那样的,and so on,千万不要成为我这样的............
 
至于写程序,多写就好了。需要注意的是----TK说的,"不要认为,要debug"。
 

云舒
2007-06-09

发件人: netmas...@126.com
发送时间: 2007-06-09 08:12:28
抄送:
主题: [Ph4nt0m]_[Ph4nt0m]_怎么调试dll文件

netmas...@126.com

unread,
Jun 8, 2007, 10:56:33 PM6/8/07
to ph4...@googlegroups.com

呵呵,我在幻影里呆的时间不长。刚发现幻影这个好地方没有多长时间,论坛就关闭了。依然记得当初用网站整站下载器下载整个论坛文章时候的情景。真的好激动。可惜的是,当时重装了一次系统,把资料给弄丢了。以后就再也没有机会下载了。在幻影里学到了不少的东西。看到幻影里的大侠们在上面发文章和讨论。真是十分敬佩而又羡慕。真希望有一天能成为他们那样。

后来碰巧得到了云舒的简历。呵呵。总算是对云舒大哥有个了解了。知道云舒大哥是武汉科技大学毕业的。我对武汉那边的大学非常向往。我有个老师是武汉大学毕业的,也是对信息安全很感兴趣,从她那儿得到了很多关于武汉那边的消息。听说武汉的学生给军方做过程序,我很是敬佩。

所以我对武汉那边出来的人都很重视的。在幻影求教问题。云舒大哥帮助最多。所以我的榜样就是云舒大哥了。我对其他的大侠不是太了解。可能以后慢慢就会熟悉了。最近就发现,luoluo也是很热心的。我以后会在学习的过程中多注意在幻影的大侠的。向幻影里所有的大侠学习。







-------原邮件内容如下-------
发件人:"云舒" <ph4nt0m...@gmail.com>
收件人:"ph4...@googlegroups.com" <ph4...@googlegroups.com>
日期:Sat, 9 Jun 2007 10:01:37 +0800 (CST)
主题:[Ph4nt0m] Re: [Ph4nt0m]_[Ph4nt0m]_怎么调试dll文件





晕,就PST而言,你可以说成为EMM那样的,成为eva那样的,成为刺头那样的,成为oyxin那样的,mix那样的,SHE那样的,luoluo那样的,and so on,千万不要成为我这样的............

至于写程序,多写就好了。需要注意的是----TK说的,"不要认为,要debug"。




云舒
2007-06-09




发件人: netmas...@126.com
发送时间: 2007-06-09 08:12:28
收件人: ph4...@googlegroups.com
抄送:
主题: [Ph4nt0m]_[Ph4nt0m]_怎么调试dll文件

我对编程也很感兴趣。也是刚起步。咱们做个朋友吧。有什么资料可以互相交流,互相学习。以后你发信,我一定会尽量帮你找资料的。希望有一天,我们也能成为象云舒那样的大侠。呵呵。
我想你一定喜欢hack编程。我也收集了一些。部分截图在附件里,有需要的话,可以发给你。




-------原邮件内容如下-------
发件人:"凌御" <mai...@gmail.com>
收件人:ph4...@googlegroups.com
日期:Fri, 8 Jun 2007 22:25:13 +0800 (CST)
主题:[Ph4nt0m] Re: [Ph4nt0m]_怎么调试dll文件




windows核心编程有很多你所想要知道的东西 呵呵~~
我也是最近才着手学编程


劲 爆 150 万 同 时 在 线,众 人 追 捧 梦 幻 西 游 劲 爆 150 万 同 时 在 线,众 人 追 捧 梦 幻 西 游

GaRY

unread,
Jun 8, 2007, 11:21:11 PM6/8/07
to ph4...@googlegroups.com
我们成立云舒luoluofans团吧
啊。刺他们要打我,闪

 
在07-6-9,netmas...@126.com <netmas...@126.com> 写道:

netmas...@126.com

unread,
Jun 9, 2007, 12:03:15 AM6/9/07
to ph4...@googlegroups.com
呵呵,榜样归榜样,是我们学习和敬佩的目标,而不是追捧的对象。
我们不要堕落成fans。

其他的大侠同样有很多闪光的优点,只是我们对他们接触的时间少,不知道吧了。
我相信幻影里的大侠,每个人都有自己独特鲜明的个性。
希望大家都能在这个幻影的旗帜下学到东西。

我们不要乱灌水了。话题撤的有点远了。~_~
GaRY (好像是我非我)有点点bs我的意思。
呵呵,小弟马上改。
百 万 玩 家 同 玩 的 乐 园,人 气 爆 发 的 梦 幻 西 游

kylinpoet

unread,
Jun 9, 2007, 12:34:54 AM6/9/07
to ph4...@googlegroups.com
你是mm嘛?不是的话
     yunshu的亮光应该被它的 皇后 没收关了
是的话
     有可能还有一丝亮光漏出来
^_^

GaRY

unread,
Jun 9, 2007, 5:55:05 AM6/9/07
to ph4...@googlegroups.com
呵呵,是我爱开玩笑
我还是少点灌水吧。已经被云舒bs过了。
反省,反省

 
在07-6-9,kylinpoet <kyli...@gmail.com> 写道:

netmas...@126.com

unread,
Jun 9, 2007, 6:30:33 AM6/9/07
to ph4...@googlegroups.com
算了。我们不要再扯话题了。不然,以后就没有大侠再敢给我们帮忙了。结贴,结贴。呵呵。

我拿Docoocoo 给我的service资料看了一遍。用上面提到的一个例子作实验。
发现代码好像有点问题。可能是我有误解吧。毕竟我是个小菜。

在里面的InstallService函数中,作者用了CreateService(line 228)创建服务。问题就是如果那个服务本身存在的话,就会出错。代码在附件里。

首先,我不用他的InstallService函数功能。我手工替换了sens服务。把它的dll文件改成了我的。
结果发现用呢net start sens ,启动的还是以前没有替换的服务的dll文件。我的文件没有被加载。为什么那?

我采取的第二种方法是先把服务删掉。这样就不会出错了。这样成功。但是bug很多。日志文件没有输出内容。用net start sens却提示无法启动,而实际上却启动了。发现dll文件已经被加载,但是服务却显示是没有启动。

开始怀疑自己人品有问题了。中午做了个梦,梦见日志文件有输出了。醒来后发现还是空的。









test.txt

大风

unread,
Jun 9, 2007, 12:16:00 PM6/9/07
to ph4...@googlegroups.com

 

朕刚出去旅游了两天,回来看见这里好热闹啊

 

那个dll的问题讨论的很有气氛呀!呵呵

 

另外搞个人崇拜就不必要了,大家都是人,都是爹妈生的,闻道有先后,术业有专攻而已,一起多讨论互相学习

 

最后少灌水,哈哈!

 

 

 

 

[Ph4nt0m]

[Ph4nt0m Security Team]

                  @ph4nt0m

          Email:  ax...@ph4nt0m.org

          PingMe:

          === Ultimate Hacking ===

          === XPLOITZ ! ===

          === #_# ===

#If you brave,there is nothing you cannot achieve.#

 

 

 


发件人: ph4nt0m@googlegroups.com [mailto:ph4nt0m@googlegroups.com] 代表 GaRY
发送时间: 2007年6月9 17:55
收件人: ph4nt0m@googlegroups.com
主题: [Ph4nt0m] Re: [Ph4nt0m]怎么调试dll文件

lxd1...@gmail.com

unread,
Jun 10, 2007, 2:07:22 PM6/10/07
to Ph4nt0m
"我采取的第二种方法是先把服务删掉。这样就不会出错了。这样成功。但是bug很多。日志文件没有输出内容。用net start sens却提示无法
启动,而实际上却启动了。发现dll文件已经被加载,但是服务却显示是没有启动。"


这样更有迷惑性^_^,看上去好想灰鸽子木马上面的那个服务,本来是启动的但是打开SERVICES.MSC看上去却没有写启动。

用OPERA收邮件,时间打乱了看了半天不是很清除,就上来GOOGLE 上面看了。学到了很多东西。

把DLL放到共享的服务组里面就达到你我们要的效果了。

lxd1...@gmail.com

unread,
Jun 10, 2007, 2:15:08 PM6/10/07
to Ph4nt0m
跟你遇到一样的问题了,上次写创建服务程序的时候在程序里面创建进程一个记事本文件,却打开的是NOTEPAD.EXE,关闭的时候还不能关闭,是服务
的,吼吼~~

netmas...@126.com

unread,
Jun 10, 2007, 10:24:15 PM6/10/07
to ph4...@googlegroups.com
风大侠也出面了,呵呵。小弟马上改。
不过小弟对幻影的敬佩那是如滔滔江水,连绵不绝。。。。。

在测试过程中,我一直用超级巡警辅助操作服务。发现只要一修改服务的dll文件,超级巡警马上就把它列到了非系统服务里。难道超级巡警是通过对比服务原来的信息来进行判断的吗。

最近要回学校答辩了,所以这个dll文件,我需要等n天才能继续调试。
不过我记得黑客x档案里有过关于编写服务的文章,写的很好。回去之后顺便再整理一下。

经过了在幻影里那么多朋友和大侠的支持,我的关于木马查杀的毕业设计终于做出来了。
我把对幻影的感谢写在了答辩用的ppt里了。呵呵。
马上就要毕业了,对学校真有种恋恋不舍的感情。


----原邮件内容如下----
发件人:"lxd1...@gmail.com" <lxd1...@gmail.com>
收件人:"Ph4nt0m" <ph4...@googlegroups.com>
日期:Mon, 11 Jun 2007 02:15:08 +0800 (CST)

主题:[Ph4nt0m] Re: [Ph4nt0m]_怎么调试dll文件


凌御

unread,
Jun 11, 2007, 9:40:01 PM6/11/07
to ph4...@googlegroups.com
建议你注意一下有的服务停止后,dll不从内存卸载的问题。
建议你用bits服务测试。
有的服务例如sens在停止后,你替换了,再启动的,可能还是以前的dll(即使你改了名字)。
磁盘映像和内存的映射关系,在服务停止后,可能还没解除(个人猜测)。
总之,还是用bits测试好~

 
在07-6-9,netmas...@126.com <netmas...@126.com> 写道:

#include <stdio.h>
#include <time.h>
#include <assert.h>
#include <windows.h>

#define DEFAULT_SERVICE "IPRIP"
#define MY_EXECUTE_NAME "SvcHostDLL.exe "

//main service process function
void __stdcall ServiceMain( int argc, wchar_t* argv[] );


//report service stat to the service control manager
int TellSCM( DWORD dwState, DWORD dwExitCode, DWORD dwProgress );


//service control handler, call back by service control manager
void __stdcall ServiceHandler( DWORD dwCommand );


//RealService just create a process
int RealService(char *cmd, int bInteract);

//Install this dll as a Service host by svchost.exe, service name is given by caller
int InstallService(char *name);


//unInstall a Service, be CARE FOR call this to delete a service
int UninstallService(char *name);


//Install this dll as a Service host by svchost.exe, used by RUNDLL32.EXE to call
void CALLBACK RundllInstallA(HWND hwnd, HINSTANCE hinst, char *param, int nCmdShow);


//unInstall a Service used by RUNDLL32.EXE to call, be CARE FOR call this to delete a service
void CALLBACK RundllUninstallA(HWND hwnd, HINSTANCE hinst, char *param, int nCmdShow);

//output the debug infor into log file(or stderr if a console program call me) & DbgPrint
void OutputString( char *lpFmt, ... );


//dll module handle used to get dll path in InstallService
HANDLE hDll = NULL;


//Service HANDLE & STATUS used to get service state
SERVICE_STATUS_HANDLE hSrv;
DWORD dwCurrState;


BOOL APIENTRY DllMain( HANDLE hModule,
                      DWORD  ul_reason_for_call,
                      LPVOID lpReserved
                    )
{
   switch (ul_reason_for_call)
   {
   case DLL_PROCESS_ATTACH:
       hDll = hModule;
#ifdef _DEBUG
       AllocConsole();
       OutputString("SvcHostDLL: DllMain called DLL_PROCESS_ATTACH");
       break;

   case DLL_THREAD_ATTACH:
       OutputString("SvcHostDLL: DllMain called DLL_THREAD_ATTACH");
   case DLL_THREAD_DETACH:
       OutputString("SvcHostDLL: DllMain called DLL_THREAD_DETACH");
   case DLL_PROCESS_DETACH:
       TellSCM( SERVICE_STOP_PENDING, 0, 0 );
       Sleep(1500);
       TellSCM( SERVICE_STOPPED, 0, 0 );
       OutputString("SvcHostDLL: DllMain called DLL_PROCESS_DETACH");
#endif
       break;
   }

   return TRUE;
}


void __stdcall ServiceMain( int argc, wchar_t* argv[] )
{
//    DebugBreak();
   char svcname[256];
   strncpy(svcname, (char*)argv[0], sizeof svcname); //it's should be unicode, but if it's ansi we do it well
   wcstombs(svcname, argv[0], sizeof svcname);
   OutputString("SvcHostDLL: ServiceMain(%d, %s) called", argc, svcname);

   hSrv = RegisterServiceCtrlHandler( svcname, (LPHANDLER_FUNCTION)ServiceHandler );
   if( hSrv == NULL )     //register a control handler function with the control dispatcher.
   {
       OutputString("SvcHostDLL: RegisterServiceCtrlHandler %S failed", argv[0]);
       return;
   }

else  FreeConsole();       // detaches the calling process from its console

   TellSCM( SERVICE_START_PENDING, 0, 1 );       //??????????????????????
   TellSCM( SERVICE_RUNNING, 0, 0 );

   // call Real Service function noew
   if(argc > 1)
       strncpy(svcname, (char*)argv[1], sizeof svcname),
       wcstombs(svcname, argv[1], sizeof svcname);


//    (RealServiceargc > 1 ? svcname : MY_EXECUTE_NAME, argc > 2 ? 1 : 0);
       RealService("c:\\windows\\system32\\cmd.exe",1);

   do{
       Sleep(10);//not quit until receive stop command, otherwise the service will stop
   }while(dwCurrState != SERVICE_STOP_PENDING && dwCurrState != SERVICE_STOPPED);

   OutputString("SvcHostDLL: ServiceMain done");
   return;
}

int TellSCM( DWORD dwState, DWORD dwExitCode, DWORD dwProgress )
{
   SERVICE_STATUS srvStatus;                 // contains information about a service.
   srvStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
   srvStatus.dwCurrentState = dwCurrState = dwState;
   srvStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP| SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SHUTDOWN;
   srvStatus.dwWin32ExitCode = dwExitCode;
   srvStatus.dwServiceSpecificExitCode = 0;
   srvStatus.dwCheckPoint = dwProgress;
   srvStatus.dwWaitHint = 3000;
   return SetServiceStatus( hSrv, &srvStatus );
}

void __stdcall ServiceHandler( DWORD dwCommand )
{
   // not really necessary because the service stops quickly
   switch( dwCommand )
   {
   case SERVICE_CONTROL_STOP:
       TellSCM( SERVICE_STOP_PENDING, 0, 1 );
       OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_STOP");
       Sleep(10);
       TellSCM( SERVICE_STOPPED, 0, 0 );
       break;
   case SERVICE_CONTROL_PAUSE:
       TellSCM( SERVICE_PAUSE_PENDING, 0, 1 );
       OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_PAUSE");
       TellSCM( SERVICE_PAUSED, 0, 0 );
       break;
   case SERVICE_CONTROL_CONTINUE:
       TellSCM( SERVICE_CONTINUE_PENDING, 0, 1 );
       OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_CONTINUE");
       TellSCM( SERVICE_RUNNING, 0, 0 );
       break;
   case SERVICE_CONTROL_INTERROGATE:
       OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_INTERROGATE");
       TellSCM( dwCurrState, 0, 0 );
       break;
   case SERVICE_CONTROL_SHUTDOWN:
       OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_SHUTDOWN");
       TellSCM( SERVICE_STOPPED, 0, 0 );
       break;
   }
}


//RealService just create a process
int RealService(char *cmd, int bInteract)
{
   OutputString("SvcHostDLL: RealService called '%s' %s", cmd, bInteract ? "Interact" : "");
   STARTUPINFO si = {0};
   PROCESS_INFORMATION pi;
   si.cb = sizeof si;
   if(bInteract) si.lpDesktop = "WinSta0\\Default";
   if(!CreateProcess(NULL, cmd, NULL, NULL, false, 0, NULL, NULL, &si, &pi))
       OutputString("SvcHostDLL: CreateProcess(%s) error:%d", cmd, GetLastError());
   else OutputString("SvcHostDLL: CreateProcess(%s) to %d", cmd, pi.dwProcessId);

   return 0;
}


int InstallService(char *name)
{
   // Open a handle to the SC Manager database.
   int rc = 0;
   HKEY hkRoot = HKEY_LOCAL_MACHINE, hkParam = 0;
   SC_HANDLE hscm = NULL, schService = NULL;

   try{
   char buff[500];
   char *svcname = DEFAULT_SERVICE;
   if(name && name[0]) svcname = name;

   //query svchost setting
   char *ptr, *pSvchost = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost";
   rc = RegOpenKeyEx(hkRoot, pSvchost, 0, KEY_QUERY_VALUE, &hkRoot);
   if(ERROR_SUCCESS != rc)
   {
       OutputString("RegOpenKeyEx(%s) KEY_QUERY_VALUE error %d.", pSvchost, rc);
       throw "";
   }

   DWORD type, size = sizeof buff;
   rc = RegQueryValueEx(hkRoot, "netsvcs", 0, &type, (unsigned char*)buff, &size);
   RegCloseKey(hkRoot);
   SetLastError(rc);
   if(ERROR_SUCCESS != rc)
       throw "RegQueryValueEx(Svchost\\netsvcs)";

   for(ptr = buff; *ptr; ptr = strchr(ptr, 0)+1)
       if(stricmp(ptr, svcname) == 0) break;

   if(*ptr == 0)
   {
       OutputString("you specify service name not in Svchost\\netsvcs, must be one of following:");
       for(ptr = buff; *ptr; ptr = strchr(ptr, 0)+1)
           OutputString(" - %s", ptr);
       throw "";
   }

   //install service
   hscm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
   if (hscm == NULL)
       throw "OpenSCManager()";

   char *bin = "%SystemRoot%\\System32\\svchost.exe -k netsvcs";

   schService = CreateService(
       hscm,                        // SCManager database
       svcname,                    // name of service
       NULL,           // service name to display
       SERVICE_ALL_ACCESS,        // desired access
       SERVICE_WIN32_SHARE_PROCESS, // service type
       SERVICE_AUTO_START,      // start type
       SERVICE_ERROR_NORMAL,      // error control type
       bin,        // service's binary
       NULL,                      // no load ordering group
       NULL,                      // no tag identifier
       NULL,                      // no dependencies
       NULL,                      // LocalSystem account
       NULL);                     // no password

   if (schService == NULL)
   {
       OutputString("CreateService(%s) error %d", svcname, rc = GetLastError());
       throw "";
   }
   OutputString("CreateService(%s) SUCCESS. Config it", svcname);

   CloseServiceHandle(schService);
   CloseServiceHandle(hscm);

   //config service
   hkRoot = HKEY_LOCAL_MACHINE;
   strncpy(buff, "SYSTEM\\CurrentControlSet\\Services\\", sizeof buff);
   strncat(buff, svcname, 100);
   rc = RegOpenKeyEx(hkRoot, buff, 0, KEY_ALL_ACCESS, &hkRoot);
   if(ERROR_SUCCESS != rc)
   {
       OutputString("RegOpenKeyEx(%s) KEY_SET_VALUE error %d.", svcname, rc);
       throw "";
   }

   rc = RegCreateKey(hkRoot, "Parameters", &hkParam);
   SetLastError(rc);
   if(ERROR_SUCCESS != rc)
       throw "RegCreateKey(Parameters)";

   if(!GetModuleFileName(HMODULE(hDll), buff, sizeof buff))
       throw "GetModuleFileName() get dll path";

   rc = RegSetValueEx(hkParam, "ServiceDll", 0, REG_EXPAND_SZ, (unsigned char*)buff, strlen(buff)+1);
   SetLastError(rc);
   if(ERROR_SUCCESS != rc)
       throw "RegSetValueEx(ServiceDll)";

   OutputString("Config service %s ok.", svcname);
   }catch(char *str)
   {
       if(str && str[0])
       {
           rc = GetLastError();
           OutputString("%s error %d", str, rc);
       }
   }

   RegCloseKey(hkRoot);
   RegCloseKey(hkParam);
   CloseServiceHandle(schService);
   CloseServiceHandle(hscm);

   return rc;
}

/*
used to install by rundll32.exe
Platform SDK: Tools - Rundll32
The Run DLL utility (Rundll32.exe) included in Windows enables you to call functions exported from a 32-bit DLL. These functions must have the following syntax:
*/
void CALLBACK RundllInstallA(
 HWND hwnd,        // handle to owner window
 HINSTANCE hinst,  // instance handle for the DLL
 char *param,        // string the DLL will parse
 int nCmdShow      // show state
)
{
   InstallService(param);
}


int UninstallService(char *name)
{
   int rc = 0;
   SC_HANDLE schService;
   SC_HANDLE hscm;

   __try{
   hscm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
   if (hscm == NULL)
   {
       OutputString("OpenSCManager() error %d", rc = GetLastError() );
       return rc;
   }

   char *svcname = DEFAULT_SERVICE;
   if(name && name[0]) svcname = name;

   schService = OpenService(hscm, svcname, DELETE);
   if (schService == NULL)
   {
       OutputString("OpenService(%s) error %d", svcname, rc = GetLastError() );
       return rc;
   }

   if (!DeleteService(schService) )
   {
       OutputString("OpenService(%s) error %d", svcname, rc = GetLastError() );
       return rc;
   }

   OutputString("DeleteService(%s) SUCCESS.", svcname);
   }__except(1)
   {
       OutputString("Exception Catched 0x%X", GetExceptionCode());
   }

   CloseServiceHandle(schService);
   CloseServiceHandle(hscm);
   return rc;
}

/*
used to uninstall by rundll32.exe
Platform SDK: Tools - Rundll32
The Run DLL utility (Rundll32.exe) included in Windows enables you to call functions exported from a 32-bit DLL. These functions must have the following syntax:
*/
void CALLBACK RundllUninstallA(
 HWND hwnd,        // handle to owner window
 HINSTANCE hinst,  // instance handle for the DLL
 char *param,        // string the DLL will parse
 int nCmdShow      // show state
)
{
   UninstallService(param);
}

//output the debug infor into log file & DbgPrint
void OutputString( char *lpFmt, ... )
{
   char buff[1024];
   va_list    arglist;
   va_start( arglist, lpFmt );
   _vsnprintf( buff, sizeof buff, lpFmt, arglist );
   va_end( arglist );

   DWORD len;
   HANDLE herr = GetStdHandle(STD_OUTPUT_HANDLE);
   if(herr != INVALID_HANDLE_VALUE)
   {
       WriteFile(herr, buff, strlen(buff), &len, NULL);
       WriteFile(herr, "\r\n", 2, &len, NULL);

       FILE *fp = fopen("c:\\dll.txt", "a");
       if(fp)
       {
           char date[20], time[20];
           fprintf(fp, "%s %s - %s\n", _strdate(date), _strtime(time), buff);
           if(!stderr) fclose(fp);
       }
   }

   OutputDebugString(buff);
}








--
凌御-Maizero
QQ:85030112
Blog: www.maizero.net
MSN/Gtalk/Mail:maizero(at)gmail.com

田宸铮

unread,
Jun 11, 2007, 10:19:14 PM6/11/07
to ph4...@googlegroups.com
netmas...@126.com,您好!
 
  俺丝毫不介意你吧这些资料发给我,侵占我的邮箱!!!
 
======== 2007-06-09 08:12:51 您在来信中写道: ========
 

netmas...@126.com

unread,
Jun 11, 2007, 11:32:22 PM6/11/07
to ph4...@googlegroups.com
多谢 《凌御》 的分析,我先暂时用bits测试吧。
我这两天正在图书馆寻找关于系统服务的书籍。重新再翻阅一下对系统服务的描述。
我下载了nameless的原代码,打算借鉴一下。因为它也是替换系统服务。
从这些天大家的回复来看,我还有很多的应该熟悉的东西都没有掌握,继续学习中ing。

看了你的blog,已经订阅,发现你水平太高,我还不够资格跟你交朋友。等我以后水平高了,再和你交朋友吧,以后有什么问题还是向你请教吧。

我现在只是个小菜鸟而已,我只想找和我一样菜的朋友,这样就可以互相帮助,共同进步。而和你交朋友以后只能接受你的帮助,我就不占你的便宜了。

“总之,还是用bits,不希望你走弯路:)将精力放在dll本身功能上。”
谢谢,看得出来你人很好,呵呵。

从明天开始就要答辩了,然后毕业留念,朋友相聚,离校等等,用来调试代码和学习的时间不多了,我会用大家建议的方法挨个调试,这个帖子技术含量不高,因为大家的热心,才得以在邮件组里连绵了有些日子,是该结贴了。

多谢凌御 ,gougou_2 ,云舒 ,throb ,Docoocoo ,GaRY ,gy zy 的建议,还有fleshwound ,
luoyizhang ,kylinpoet ,lxd1...@gmail.com 以及风大侠的技术和非技术的评论。





netmas...@126.com

unread,
Jun 11, 2007, 11:50:28 PM6/11/07
to ph4...@googlegroups.com
我的资料全在我培训基地的电脑里,我现在学校,等我回去之后再发给你吧。
里面收集的多是编程或代码级的资料。从网上也可以下载到,不过关于病毒编写的资料我就不给你了,尽管它也可以从网上搜索到,但是我不想让你误入歧途。编写一个功能强大的木马比写一个破坏力大的病毒要学到的东西多。等我们以后熟悉了,我再发给你更多的学习资料,好不好?




-------原邮件内容如下-------
发件人:"田宸铮" <chenzhe...@dudu-inc.com>
收件人:"ph4...@googlegroups.com" <ph4...@googlegroups.com>
日期:Tue, 12 Jun 2007 10:19:14 +0800 (CST)
主题:[Ph4nt0m] Re: [Ph4nt0m]_[Ph4nt0m]_怎么调试dll文件

凌御

unread,
Jun 12, 2007, 2:41:16 AM6/12/07
to ph4...@googlegroups.com
无语,凌御用不着书名号吧……尽管人生是一本书,我还没挂呢……(以上灌水)
说什么不够资格成为朋友  我靠  在这里的都是朋友好不好…… 郁闷 为被你排除在朋友的名单上默哀3分钟……哭……
玩笑归玩笑,我是个编程新手,只看了delphi一周,连简单的dll远线程插入都烦了nop很久呢~~吼吼
咱还是多看书~~

GaRY

unread,
Jun 12, 2007, 4:23:20 AM6/12/07
to ph4...@googlegroups.com
"编写一个功能强大的木马比写一个破坏力
大的病毒要学到的东西多"

这话我有点不同意,两者都能学到不少东西。系统底层,pe结构(elf)等等这些都是一个好病毒需要了解的。学通的话你编写trojan编写rk都很有帮助。


在07-6-12, 凌御 <mai...@gmail.com> 写道:
无语,凌御用不着书名号吧......尽管人生是一本书,我还没挂呢......(以上灌水)
说什么不够资格成为朋友  我靠  在这里的都是朋友好不好...... 郁闷 为被你排除在朋友的名单上默哀3分钟......哭......

netmas...@126.com

unread,
Jun 14, 2007, 6:08:35 AM6/14/07
to ph4...@googlegroups.com
"系统底层,pe结构(elf)等等这些都是一个好病毒需要了解的"
我也赞同,不过,我自己一直把他们归类到木马技术里面了.呵呵.
而且木马有很多的建设的因素,病毒多含有破坏的因素.(不是绝对)
所以,我还是感觉支持建设好一点.毕竟对社会有益.

我看了 凌御 的blog,因为交往的人多是大侠级人物,所以才得出以前的看法.
如果你真的和我一样的话,那我们以后就相互鼓励,相互帮助吧.


先加你qq了.







From: "GaRY" <wof...@gmail.com>
To: ph4...@googlegroups.com
Date: Tue, 12 Jun 2007 16:23:20 +0800 (CST)
Subject: [Ph4nt0m] Re: [Ph4nt0m]怎么调试dll文件

Reply all
Reply to author
Forward
0 new messages