• 欢迎光临~

使用Windbg OllyDbg从头调试windows服务

开发技术 开发技术 2022-10-16 次浏览

使用Windbg OllyDbg从头调试windows服务

 https://toutiao.io/posts/akni2p/preview

补充:先设置下odb的jit支持。

JIT的设置方法x64dbg和ollydeg都有自动设置

x64dbg:
菜单栏选择 选项(o)->选项(p)->杂项->将这份x64dbg设为即时调试器
window服务调试(二):调试windows服务方法_windows服务启动超时_02
ollydbg:
菜单栏选择 选项(T)->实时调试设置(J)->设置OllyICE为实时调试器
window服务调试(二):调试windows服务方法_windows服务_03
 
https://blog.51cto.com/u_15060540/3888921

 

使用Windbg OllyDbg从头调试windows服务

在分析恶意软件时,恶意软件通常会创建服务,然后拉起服务删除自身文件,结束进程。很多关键的操作都在恶意软件新创建的服务之中,当然可以使用IDA进行静态的调试,但同时需要OD对服务进行动态的调试。

对于绝大多数的服务可以直接attach到OD或者windbg上进行调试,但是如果想从启动就开始就调试该服务,这种attach的方法就不是很适用。网上有一些多年前的文档教程,但是在亲身尝试的时候总是用各种各样的问题,我就结合网上教程和亲身测试对如何使用OD/Winddbg调试windows服务进行一个较为详细的说明。

 

 

下面的内容见原文:https://toutiao.io/posts/akni2p/preview

1、恶意软件分析:


本人分析的是一个挖门罗币恶意软件的loader,直接步入对服务进行操作与的正题,首先是创建一个服务:

使用Windbg OllyDbg从头调试windows服务

然后会对服务注册表中的一些值进行设定,这里就省略了。

在注册表的数值被设置之后,会直接调用StartService()开启服务:

使用Windbg OllyDbg从头调试windows服务

此时要在次设置好断点,不要执行该布步骤。

静态分析该文件时,在文件中可以看到很多的函数操作,包括对文件的读写,对进程的遍历等等。但是在单纯执行该文件的时候,这些函数操作都不会表现出来。IDA反汇编代码如下:

使用Windbg OllyDbg从头调试windows服务

从以上代码可知,如果该程序是以服务的形式被拉起的,则会运行sub_401F30()函数的程序,否则会向下运行到绿色框中的程序。绿色框中程序的功能就是,删除现有服务,再新创文件,自删除文件,创建新服务,设置注册表参数,拉起服务,结束程序。所以如果不进入到服务进行debug,则一直不能看到核心的恶意代码。而且这些恶意操作执行的速度会很快,不等你attach到OD上就会结束,所以此时需要设置当服务一被拉起就进行调试功能。

恶意软件所注册的服务通常是自启动的,为了方便调试,可以将其更改为手动开启模式。

 

 

2、设置运行程序打开OD/Windbg功能


使用注册表编辑器,打开注册表路径:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionImage File Execution Options ,添加一个主键,名称设置为将要调试服务的exe文件:

使用Windbg OllyDbg从头调试windows服务

我要调试的服务的exe文件是scvhost.exe所以在HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionImage File Execution Options 键值下新建一个键值的名称为scvhost.exe,然后再里面添加一个新建一个字符串选项,命名为debugger,最后对debugger这个参数进行设置,设置为调试器的路径。在设置好之后,运行scvhost.exe文件,就自动进入OD的调试界面。所以最好在调试前在被调试服务文件入口设置好断点。

 

 

3、延长服务开启超时时间设置:


当调试服务.exe文件时,其实是在从服务启动时进行调试的,系统对启动服务设置了默认的超时时间,超过时间就会退出启动并报错:

使用Windbg OllyDbg从头调试windows服务

系统默认启动服务的超时时间是30秒,但30秒远远不够对服务进行分析,所以要延长服务超时的时长。

打开注册表,在HKEY_LOCAL_MACHINESYSTEM CurrentControlSetControl 键值下查找ServicesPipeTimeout参数,一般不存在,需要新建。新建DWORD值“ServicesPipeTimeout”,其值为欲设置的超时时间,先选择为十进制,数值单位是毫秒,如设置 24小时,则值为86400000毫秒:

使用Windbg OllyDbg从头调试windows服务

在设置好貌似不能直接起到作用,需要重启才能有效果。

 

 

4、设置要调试的服务与桌面交互:


之有打开了桌面交互功能才能够在服务被加载的时候弹出OD/Windbg。首先是打开服务的桌面交互功能。在cmd中输入,services.msc,打开服务控制版面,找到要被调试的服务,然后勾选桌面交互选项:

使用Windbg OllyDbg从头调试windows服务

实际上这等同于修改注册表中的要调试服务的type选项。选择“Type”,修改其值为:原值 OR 0x00000100(如原值为:0x00000010 OR 0x00000100 =0x00000110):

使用Windbg OllyDbg从头调试windows服务

除了要打开服务的桌面交互选项之外,还要开启服务的桌面交互检测服务,系统默认通常是关闭的,需要手动打开。如果不打开该服务,OD/windbg调试窗口就不会弹出:

使用Windbg OllyDbg从头调试windows服务

启动该服务。

 

 

5、启动服务


保证上面的步骤都设置好之后,启动要调试的服务,会弹出如下对话框:

使用Windbg OllyDbg从头调试windows服务

点击查看信息,此时调试器会跳出,加载到服务起始处:

使用Windbg OllyDbg从头调试windows服务

 

*注意:

0x1

整个过程有几点需要额外注意,很多恶意软件会将服务伪装成svchost.exe,用来迷惑用户。修改注册表有风险,如果在

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionImage File Execution Options

键下添加svchost.exe或者系统其他进程如winlog.exe等,在计算机重启时会遇到麻烦。原因很简单,系统是对可执行文件的名称进行处理的,所以在真正的svchost.exe被执行时系统也会尝试将其加载到OD/Windbg进行调试。所以一个好的解决方法就是将服务设置为手动开启,然后修改文件名,并且修改对应服务的路径中可执行文件的名称。所以就理解为什么我调试的文件名称是scvhost.exe而不是svchost.exe。

0x2

使用尽量使用OD的原始版本,在跳出窗口时带有各种插件的OD会对系统造成影响,导致黑屏打不开。Windbg可以正常打开。



程序员灯塔
转载请注明原文链接:使用Windbg OllyDbg从头调试windows服务
喜欢 (0)
违法和不良信息举报电话:022-22558618 举报邮箱:dljd@tidljd.com