Windows服务原理&调试方法_win service 工作 原理-程序员宅基地

技术标签: 恶意软件分析  

Windows服务原理&调试方法

教程参考自《逆向工程核心原理》


1.概述

服务程序比较难调试,有时,即使是逆向分析经验丰富的人调试起来也并非易事。本文通过服务的原理来简单介绍下服务的调试方法。


2.原理

Service(服务程序)由SCM(Service Control Manager)管理,运行Service时,需要由sc(控制器)执行启动命令。sc向SCM提出服务控制请求,SCM向Service传递控制命令,并接收其返回的值。PS:sc无法直接向Service下达命令,必须通过SCM传达。
1

SCM可以理解为是一个抽象化的服务接口,一般通过函数OpenSCManager调用。
2

而sc就是我们常用的服务控制器,可以通过:services.msc打开或直接使用命令行运行sc.exe进行操作。
3

所有Service都是由sc调用StartService() API启动的,若Service为自启动服务,则由SCM调用StartService()启动。
4

Service启动过程:

[1]sc调用StartService()
sc调用StartService()的同时,SCM会创建相应的Service进程,然后执行Service进程的EP代码。

[2]Service进程调用StartServiceCtrlDispatcher()
为了以服务形式运行,必须在服务进程内部调用StartServiceCtrlDispatcher() API来注册服务主函数SvcMain()的地址d调用StartServiceCtrlDispatcher()时,返回sc的StartService()函数。SCM调用Service进程的服务主函数SvcMain()。

[3]服务进程调用SetServiceStatus()
虽然已经创建了Service进程,但尚未以服务的形式运行。当前状态仍为SERVICE_START_PENDING。在服务主函数SvcMain()内部调用SetServiceStatus(SERVICE_RUNNING) API后,才正式以Service进程形式运行。


3.代码演示

根据有无运行参数,本例程序可分别以服务模式(无参数)或常规模式(有参数)运行。以服务模式运行时会调用StartServiceCtrlDispatcher() API,启动服务主函数(SrvMain());以常规模式运行时,根据所给参数的种类,分别调用InstallService()/UninstallService()函数,它们分别用来安装或卸载服务。

主函数
5

6

InstallServie()函数
7

UninstallService()函数
8

8

服务主函数SvcMain()
9

服务控制函数SvcCtrlHandler()
10


4.程序演示

在命令行下运行程序DebugMe1.exe,加上参数install。
11

从services.msc中可以看到服务SvcTest已被创建。
12

SvcTest服务的进程(DebugMe1.exe)是以services.exe进程的子进程形式运行的,起始所有服务进程都以该形式运行。Services.exe进程就是SCM。
13

对于EXE文件形态的Windows服务程序而言,必须在其EP代码内部调用StartServiceCtrlDispatcher() API,将服务主函数(SvcMain())的地址通知给SCM。对于DLL文件形式为Windows服务而言,服务主函数(默认为ServiceMain)为导出函数,SCM会调用运行导出函数,所以不需要另外调用StartServiceCtrlDispatcher() API。


5.调试服务

使用IDA可以快速找到ServiceMain(),如下图,对应的地址为0x1000C8C0。
14

然后使用OD加载程序,直接在ServiceMain(0x1000C8C0)处右键->此处为EIP。
15

大家可能有个疑问,那么直接?不会造成什么寄存器、栈的访问错误吧。答案是一般不会,ServiceMain()是一个较独立的函数(名字都叫Main函数了),很少接收外界传来的参数,所以可以将EIP指过去直接运行。不过有时出现下面这种情况需要注意,ServiceMain需要传来的ServiceName参数,这时我们若不构建一个ServieName,将会出现内存访问错误。
16

a2是一个双重指针,在栈中0x12F870的位置,我们在其写入一个伪造的地址,这里地址为0x1001A424,然后再在0x1001A424中写入地址0x1001A434(ServiceName存放的地址),最后,再在0x1001A434下填入服务名就行了,这样就实现了参数填充,不会再出现内存访问错误了。PS:0x1001A424和0x1001A434不是特定的,自己找块空闲的内存写就行。
17

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37552052/article/details/82390354

智能推荐

android 视图动画遇到的坑_android view有动画时执行invisible-程序员宅基地

文章浏览阅读1.6k次。Android中视图动画使用率越来越少了,很多大神都使用属性动画了。但个人觉得视图动画比属性动画使用起来更简单,所以能用视图动画实现的就不考虑用属性动画。 今天在项目中使用视图动画时,遇到了几个坑,记录下来,供踩到同样坑的同学参考一下~一、平移与缩放冲突 使用视图动画,常使用到动画集合AnimationSet,然后在动画集合中添加平移、绽放,旋转等动画。_android view有动画时执行invisible

Anaconda新手使用教程_anaconda使用教程-程序员宅基地

文章浏览阅读4.6w次,点赞102次,收藏897次。Anaconda使用教程一(新手友好)前言一、python和包以及anaconda的概念关系关于python与包关于anaconda二、Anaconda安装问题对windows三、Anaconda使用问题配置Anaconda源可能出现的错误conda install 仍然出现下载速度慢的错误四、Anaconda创建虚拟环境并使用创建你的第一个环境查看当前conda所有环境激活你的环境在你的环境中用conda或者pip安装包查看环境中现有的包在环境中运行python程序(windows系统)退出当前环境删除环_anaconda使用教程

hdu 3496 二维费用背包_hdu - 3496-程序员宅基地

文章浏览阅读1k次。题意:求在一定l时间内看完n中电影中的m是否可能,若可能则最后快乐度是多少。之前错了好多遍,一直找不到原因,后来在百度上看了很多别人的代码发现只有初始化不同我的初始化: memset(f,0,sizeof(f));别人的: for(int i=0;i for(int j=0;j一开始认为没什么影响,但是苦于一直找不到原因,所以我将自_hdu - 3496

Random、SecurityRandom、Math.random()_securerandom和math.random()-程序员宅基地

文章浏览阅读2k次。下面可以不看,一句话,为了其安全起见,以后我们就用SecurityRandom就好了。JDK中有两个随机数类。一个是PRNG,也就伪随机数类java.util.Random,是采用线性同余算法产生的。另一个是RNG,也就是java.util.Random的子类强随机数java.security.SecureRandom,这是一个SPI类,也就是说具体的算法由Pro..._securerandom和math.random()

npm安装vue报错:npm ERR! code ETIMEDOUT-程序员宅基地

文章浏览阅读8k次,点赞8次,收藏8次。npm安装vue报错npm ERR! code ETIMEDOUT_code etimedout

Linux解决Warning: mysql_connect(): Headers and client library minor version mismatch. 警告_mysql headers:50647-程序员宅基地

文章浏览阅读5k次。这两天用阿里云服务器重新部署网站服务器后,打开某php页面出现了如下警告:Warning: mysql_connect(): Headers and client library minor version mismatch. Headers:50547 Library:50631 in /XXX(某某目录)/wp-db.php on line 1520,虽然是警告,但是有的界面会因此打不开,无法..._mysql headers:50647

随便推点

上手指南 | Jetpack Hilt 依赖注入框架_hilt 使用 broadcastreceiver-程序员宅基地

文章浏览阅读2.7k次,点赞5次,收藏6次。Hilt 是 Android 的依赖注入库,是基于 Dagger 。可以说 Hilt 是专门为 Andorid 打造的。_hilt 使用 broadcastreceiver

php 解压安装程序,解压缩各种安装程序包-程序员宅基地

文章浏览阅读97次。解压缩各种安装程序包文:tracky来源:http://bbs.hanzify.org/index.php?showtopic=24638&hl=点击:2578解压缩各种安装程序包1 微软的Installer制作的安装包,后缀一般是msi,mspA 可以用totalcmd 的msiplus插件,可以解压。不可以修改msi。B 可以用WinINSTALL LE 2003,在w..._php软件压缩包安装

ChatGPT-GPT4:提升科研、论文写作与AI绘图效率的新契机_最新chatgpt/gpt4科研技术应用与ai绘图及论文高效写作-程序员宅基地

文章浏览阅读295次。2023年我们进入了AI2.0时代。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车,就有可能被淘汰在这个数字化时代,如何能高效地处理文本、文献查阅、PPT编辑、编程、绘图和论文写作已经成为您成功的关键。而 ChatGPT,作为一种强大的自然语言处理模型,具备显著优势,能够帮助您在各个领域取得突破。ChatGPT 在论文写作与编程方面也具备强大的能力。_最新chatgpt/gpt4科研技术应用与ai绘图及论文高效写作

Nginx---静态资源处理_nginx静态资源释放-程序员宅基地

文章浏览阅读2.5k次。NginxNginx服务器基础配置实例Nginx服务操作的问题Nginx配置成系统服务Nginx命令配置到系统环境Nginx静态资源部署Nginx静态资源概述Nginx静态资源的配置指令listen指令default_server说明server_name指令配置方式一:精确匹配配置方式二:使用通配符配置配置三:使用正则表达式配置匹配执行顺序server_name总结location指令设置请求资源的目录root / aliasindex指令error_page指令静态资源优化配置语法sendfile,用来开_nginx静态资源释放

U盘使用TransMac软件格式化之后用不了,已解决!_transmac格式化u盘导致无法读取-程序员宅基地

文章浏览阅读2.9w次,点赞2次,收藏4次。有一天,上网查查Android的知识点(我是初学者),不经意的碰到黑苹果这个概念,因为没用过白苹果,所以有个想折腾的想法,于是从此深入大坑。教程是网上的,是用TransMac格式化的U盘,后面折腾了半天,启动卡在苹果LOGO,生命在于折腾。我不怕。。。。。—___—这个是题外话了。后面因为要用到U盘(不是黑苹果的事了),突然发现U盘用不了了,格式化也不行,用DG也不行(有人说可以),然后网上找..._transmac格式化u盘导致无法读取

毕设问题杂谈_blender怎么解除蒙皮-程序员宅基地

文章浏览阅读3k次。一、maya模型通过mixamo绑定后,发现有模型重叠需要删改,在Maya中删除后导出fbx后总是空集。发现是个fbx导出问题,MAYA做了动画的模型导出FBX,动画好好的,但部分模型没了???【maya吧】_百度贴吧这样操作后会取消蒙皮绑定,于是我去blender里 通过betterfbx插件导入,在编辑模式中删除了多余模型,之后再betterfbx导出,fbx模型绑定都在,进入unity也没问题,应该就是个Mayafbx插件问题。(小白见解)二、..._blender怎么解除蒙皮