文档章节

系统服务创建和服务-win32汇编完整版

Mok
 Mok
发布于 2016/06/20 09:37
字数 709
阅读 17
收藏 0

.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include  windows.inc
include  user32.inc
includelib  user32.lib
include  kernel32.inc
includelib  kernel32.lib
include  AdvApi32.inc
includelib  AdvApi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?

stSS   SERVICE_STATUS <> ;服务的状态
hSS   dd ? ;服务的状态句柄
dwOption  dd ?
F_STOP   equ 0001h ;停止服务 \
szBuffer dd MAX_PATH dup(0)
hSCM  dd ?
service  dd ?
lpsb  dd ?
dwThreadID DD ?
hEvent  dd ?
hServiceThread dd ?
.data
szServiceName   db '服务测试五',0
szDisplayName   db '服务测试五',0
szServiceFile   db 'C:\WINDOWS\system32\后台服务.exe',0
szSystem   db 'C:\WINDOWS\system32\',0
szFile    db '\后台服务.exe',0
szCreateServiceError  db 'CreateService is error',0
szStartServiceError  db 'StartServiceError is error',0
szQueryServiceStatussError db 'QueryServiceStatuss is error',0
szOpenSCManagerError  db 'OpenSCManager is error',0

;include 后台服务.Inc
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 服务控制程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcHandler proc _dwControl

  pushad
  mov eax,_dwControl
  .if eax == SERVICE_CONTROL_STOP
  
   mov stSS.dwCurrentState,SERVICE_STOPPED
   invoke SetServiceStatus,hSS,addr stSS

  .elseif eax == SERVICE_CONTROL_INTERROGATE
   invoke SetServiceStatus,hSS,addr stSS
  .endif
  popad
  ret

_ProcHandler endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 服务主程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ServiceProc proc uses ebx esi edi _lParam
 
  .while
   invoke MessageBeep,-1
   invoke Sleep,1000
  .endw
 ret

ServiceProc endp
_ServiceMain proc _dwArgc,_lpszArgv

 pushad
 invoke RegisterServiceCtrlHandler,addr szServiceName,offset _ProcHandler
 mov hSS,eax
 mov stSS.dwServiceType,SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS
 mov stSS.dwCurrentState,SERVICE_START_PENDING
 mov stSS.dwControlsAccepted,SERVICE_ACCEPT_STOP
 mov stSS.dwWin32ExitCode,NO_ERROR
 invoke SetServiceStatus,hSS,addr stSS
;********************************************************************
; 如果初始化代码比较多,那么需要首先把状态设置为 pending,等完成以后
; 再设置为 Running。(在这里加入初始化代码)
;********************************************************************
 mov stSS.dwCurrentState,SERVICE_RUNNING
 invoke SetServiceStatus,hSS,addr stSS
;********************************************************************

;********************************************************************
 invoke CreateEvent,0,TRUE,FALSE,0
 mov hEvent,eax
 
 invoke  CreateThread,0,0,offset ServiceProc,0,0,addr dwThreadID
 mov hServiceThread,eax
 invoke WaitForSingleObject,hEvent,INFINITE
 
 popad
 ret

_ServiceMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 主程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
  local @stSTE[2]:SERVICE_TABLE_ENTRY

  invoke RtlZeroMemory,addr @stSTE,sizeof @stSTE
  mov @stSTE[0].lpServiceName,offset szServiceName
  mov @stSTE[0].lpServiceProc,offset _ServiceMain
  invoke StartServiceCtrlDispatcher,addr @stSTE
  ret

_WinMain endp

_InstallService proc
  LOCAL status:SERVICE_STATUS
;*****************************************************************************
;创建服务
;*****************************************************************************
  invoke OpenSCManager,NULL,NULL,SC_MANAGER_CREATE_SERVICE
  mov hSCM,eax
  .if !eax
   invoke MessageBox,NULL,addr szOpenSCManagerError,0,MB_OK
   jmp _Ret
  .endif
  invoke CreateService,hSCM,addr szServiceName,addr szDisplayName,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,\
  SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,addr szServiceFile,0,0,0,0,0
  mov service,eax
  .if !eax
   invoke MessageBox,NULL,addr szCreateServiceError,0,MB_OK
   jmp _Ret
  .endif
;*******************************************************************************
;创建成功后,启动服务
;*******************************************************************************
  invoke QueryServiceStatus,service,addr status
  .if !eax
   invoke MessageBox,NULL,addr szQueryServiceStatussError,0,MB_OK
   jmp _Ret
  .endif
  mov ebx,status.dwCurrentState
  .if ebx==SERVICE_STOPPED
   invoke StartService,service,NULL,NULL
  
   .if !eax
    invoke GetLastError
    invoke lstrcat,addr szStartServiceError,eax
    invoke MessageBox,NULL,addr szStartServiceError,0,MB_OK
    jmp _Ret
   .endif
  .endif
  invoke CloseServiceHandle,service
  invoke CloseServiceHandle,hSCM
  mov eax,1
      
      
  _Ret:    
      
  ret

_InstallService endp
_Check proc ;检查当前是否系统目录
 
 
  invoke GetCurrentDirectory,sizeof szBuffer,addr szBuffer
  .if eax
 
   ;invoke MessageBox,0,addr szBuffer,0,MB_OK
   lea esi,szBuffer
   lea edi,szSystem
   invoke lstrlen,addr szSystem
   push eax
   pop ecx
   cld
   repe cmpsb
   .if !ecx
    mov eax,1;是系统目录
   .else
    mov eax,0
   .endif
 
 
  .endif
   
 
  ret

_Check endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start: 
 
 invoke _Check
 .if eax    ;是系统目录的话就启动服务程序
  invoke _WinMain
 .else
  invoke lstrcat,addr szBuffer,addr szFile
  invoke  CopyFile,addr szBuffer,addr szServiceFile,FALSE  ;不是的话创建服务,并启动服务,成功返回非0
 
 
  invoke _InstallService
  .if eax
    invoke DeleteFile,addr szBuffer
  .endif
     
   
    
 .endif

 
 invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start

不多说了,仔细看代码

这是一个创建代码和服务都在一个程序里的例子

主要是根据当前目录是否为系统目录判断的


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/instruder/archive/2009/12/12/4992732.aspx

© 著作权归作者所有

上一篇: 关于Qt
下一篇: 爱情故事(1)
Mok

Mok

粉丝 5
博文 313
码字总数 165627
作品 0
武汉
技术主管
私信 提问
[Beautifulzzzz的博客目录] 快速索引点这儿O(∩_∩)O~~,红色标记的是不错的(⊙o⊙)哦~

3D相关开发 [direct-X] 1、direct-X最小框架 [OpenGL] 1、环境搭建及最小系统 [OpenGL] 2、企业版VC6.0自带的Win32-OpenGL工程浅析 51单片机 [51单片机] 1602液晶显示控制代码 [51单片机] 1...

史迪奇2号
2017/08/01
0
0
Win32汇编开发环境介绍和RadAsm简明教程

Win32汇编开发环境介绍和RadAsm简明教程 现在很多朋友都在学习汇编语言,一方面汇编语言是大学计算机课程的必修课,另一方面则是为了从其它语言转到汇编语言来,无论什么原因,我认为学习汇编...

nothingfinal
2009/08/01
0
0
MASM32 SDK

MASM32 SDK是不同工具软件的大集合,它的汇编编译器用的是微软MASM软件包中的Ml.exe,资源编译器和32位链接器使用的是Microsoft Visual Studio中的Rc.exe和Link.exe,同时包含了Microsoft V...

匿名
2011/05/04
6.6K
1
windows 安装MongoDB(64位)

1,下载 官网地址:http://www.mongodb.org/downloads(32位还是64位自行选择)。 我下载的是mongodb-win32-x86_64-2.4.5.zip,网盘地址:http://pan.baidu.com/s/1eSz5SKq 2,解压 把mongo...

安安-Anan
2016/06/23
83
0
MySQL5解压缩版windows下安装配置应用总结

MySQL5解压缩版windows下安装配置应用总结 说明:本文针对mysql-noinstall版本,也就是解压缩版的安装配置应用做了个总结,这些操作都是平时很常用的操作。文章中不对mysql的可执行文件安装版...

伤明明
2018/01/07
0
1

没有更多内容

加载失败,请刷新页面

加载更多

【0918】正则介绍_grep

【0918】正则介绍_grep 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 一、正则介绍 正则是一串有规律的字符串,它使用单个字符串来描述或匹配一系列符合某个语法规则的字符串。 二、grep工具 ...

飞翔的竹蜻蜓
20分钟前
4
0
为什么要在网站中应用CDN加速?

1. 网页加载速度更快 在网站中使用CDN技术最直接的一个好处就是它可以加快网页的加载速度。首先,CDN加速的内容分发是基于服务器缓存的,由于CDN中缓存了不少数据,它能够给用户提供更快的页...

云漫网络Ruan
57分钟前
8
0
亚玛芬体育(Amer Sports)和信必优正式启动合作开发Movesense创新

亚玛芬体育和信必优正式启动合作开发Movesense创新,作为亚玛芬体育的完美技术搭档,信必优利用Movesense传感器技术为第三方开发移动应用和服务。 Movesense基于传感器技术和开放的API,测量...

symbiochina88
今天
4
0
创龙TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA核心板规格书

SOM-TL437xF是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA芯片设计的核心板,采用沉金无铅工艺的10层板设计,适用于高速数据采集和处理系统、汽车导航、工业自动化等领...

Tronlong创龙
今天
4
0
好程序员Java学习路线分享MyBatis之线程优化

  好程序员Java学习路线分享MyBatis之线程优化,我们的项目存在大量用户同时访问的情况,那么就会出现大量线程并发访问数据库,这样会带来线程同步问题,本章我们将讨论MyBatis的线程同步问...

好程序员官方
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部