分享
 
 
 

自己编制windows的后台进程程序

王朝system·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

在WINDOWS NT 中有一个功能强大的SERVICE 管理器, 它管理着一部分实现重要功能的后台进程, 例如FTP.HTTP.RAS. 网络Message 等等, 这些后台进程被称之为Service, 他们可以在系统启动时就加载, 可以运行在较高的优先级, 可以说是非常靠近系统核心的设备驱动程序中的一种. WINDOWS95 没有提供SERVICE 管理器, 取而代之的是一个简单的登记接口, 可以类似的称之为WINDOWS95 下的Service( 不过严格的讲,WINDOWS95 下是没有Service 的), 同样的, 通过这个登记接口, 我们可以使自己的程序随系统启动而最先运行, 随系统关闭而最后停止, 和操作系统结合在一起, 实现许多独特的功能. 首先我们可以先来看看一些相关的知识。

进程数据库(PDB) 介绍

在Windows 的核心数据结构中, 有一个重要的进程管理结构叫进程数据库, 它位于Kernel32 的公用内存堆中,可以通过GetCurrentProcessID(...) 得到指向该结构的指针, 以下是部分PDB 的组成, 与本文直接相关的是PDB 偏移21h 处的Service 标志字节, 通过后面的伪码分析, 我们可以清楚的看到所谓登记为Windows95 或Windows98 下的Service 进程, 只不过是把它相应的PDB 中该标志字节置为1 而已.

偏移量长度 说明

============================================

+00h DWORD Type // Kernel32 对象的类型

+04h DWORD CReference // 参考计数

+08h DWORD Un1 // 未知

+0ch DWORD pSomeEvent // 指向K32OBJ_EVENT 指针

+10h DWORD TerminationStatus // 活动标志或返回值

+14h DWORD Un2 // 未知

...

+21h BYTE Flags1 // Service 标记,

// "1" 是Service 进程,

// "0" 普通进程

...

+24h DWORD pPSP // DOS PSP 指针

...

============================================

实现接口

(1) Windows95 中提供的简单的Service 接口是一个32 位的API: RegisterServiceProcess, 由于在VC++ 的Online help 中得不到关于这个API 的确切解释, 笔者不得不针对此API 进行了逆向分析, 以下是在Windows95 的Kernel32.dll 中该API 的伪码. 我们可以清楚的看到Window95 内部到底是怎样做的, 其实处理的非常简单.

BOOL RegisterServiceProcess( DWORD dwProcessID, DWORD dwType )

{

HANDLE dwPID;

if( dwProcessID == NULL )

dwPID = dwCurrentProcessID; // Get global kernel32 variable

else

// Call some kernel functions

if( ( dwPID = CheckPID( dwProcessID ) == NULL )

return FALSE;

if( dwType == 1 )

{

*(BYTE *)( dwPID + 0x21 ) | = 0x01;

return TRUE;

}

if( dwType == 0 )

{

*(BYTE *)( dwPID + 0x21 ) & = 0xFE;

return TRUE;

}

return FALSE;

}

以下为函数原形:

BOOL RegisterServiceProcess( DWORD dwPID, DWORD dwType )

参数: dwPID: 进程ID, NULL 代表当前进程

dwType: RSP_SIMPLE_SERVICE 为登记

RSP_UNREGISTER_SERVICE 为取消登记

返回值: TRUE: 调用成功

FALSE: 调用失败

(2) 另外, 为了让Service 进程有机会在BOOT 后就启动,Windows95 的Registry 中提供了加载方法: 在KEY " MyComputer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices " 加入自己的应用程序命令行, 即可实现开机自动加载. 当然, 如果你得机器中没有这个Key, 自己建一个也是可以的.

例程

---- 下面是实现例程, 所有代码经过了测试, 可以方便的加入到自己的项目文件中.

---- 头文件:

// File: service.h

// The head file of "service.cpp"

// Note: 1. You must use C++ compiler

// 2. The platform is WIN32 (WINNT & WIN95)

#ifndef _SERVICE_H

#define _SERVICE_H

/////////////////////////////////////////////////// USED FOR WIN95 SERVICE

// Micros

#define RSP_SIMPLE_SERVICE 1

#define RSP_UNREGISTER_SERVICE 0

// Function types for GetProcAddress

#define RegisterServiceProcess_PROFILE (DWORD (__stdcall *) (DWORD, DWORD))

// Service Fuctions in Win95

BOOL W95ServiceRegister(DWORD dwType);

BOOL W95StartService( DWORD dwType );

#endif

CPP 文件:

// File: service.cpp --- implement the service

#include "service.h"

/////////////////////////////////////////////////// USED FOR WIN95 SERVICE

登记为Service 子程序:

////////////////////////////////////////////////////////////////////////////////

/

// Define: BOOL W95ServiceRegister(DWORD dwType)

// Parameters: dwType --- Flag to register or unregister the service

// RSP_SIMPLE_SERVICE means register

// RSP_UNREGISTER_SERVICE means unregister

// Return: TRUE --- call success; FALSE --- call failer

BOOL W95ServiceRegister( DWORD dwType )

{

// Function address defination

DWORD (__stdcall * hookRegisterServiceProcess)

( DWORD dwProcessId, DWORD dwType );

// Get address of function

hookRegisterServiceProcess = RegisterServiceProcess_PROFILE

GetProcAddress

(GetModuleHandle("KERNEL32"),

TEXT("RegisterServiceProcess"));

// Register the WIN95 service

if(hookRegisterServiceProcess(NULL,dwType)==0)

return FALSE;

return TRUE;

}

加入注册表程序:

#define SERVICE_NAME TEXT("SERVICE")

// Define: BOOL W95StartService( DWORD dwType )

// Parameters: dwType --- Flag to register or unregister the service

// RSP_SIMPLE_SERVICE means register

// RSP_UNREGISTER_SERVICE means unregister

// Return: TRUE --- call success; FALSE --- call failer

BOOL W95StartService( DWORD dwType )

{

// Local Variables

TCHAR lpszBuff[256];

LPTSTR lpszStr = lpszBuff +128;

LPTSTR lpszName = lpszBuff;

HANDLE hKey = NULL;

DWORD dwStrCb = 0;

DWORD dwValueType = 0;

// Get service name currently

lpszName = GetCommandLine();

for( int i = _tcslen(lpszName)-1; i>=0; i-- )

{

if( ( lpszName[i] != '"' )&&( lpszName[i]!=' ') )

break;

else if( lpszName[i] == '"' )

lpszName[i] = '\0';

}

if( lpszName[0] == '"' )

lpszName = lpszName +1;

// Registe as start up service

if( RegOpenKeyEx (HKEY_LOCAL_MACHINE,

TEXT( "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunServices"),

0,

KEY_QUERY_VALUE | KEY_SET_VALUE,

&hKey ) != ERROR_SUCCESS )

{

if( RegCreateKey( HKEY_LOCAL_MACHINE,

TEXT( "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunServices"),

&hKey ) != ERROR_SUCCESS )

{

//DebugOut( "RegCreateKey() error!");

return FALSE;

}

}

dwValueType = REG_SZ;

dwStrCb = 128;

// Take value

if( RegQueryValueEx(hKey,

SERVICE_NAME,

0,

&dwValueType,

(LPBYTE)lpszStr,

&dwStrCb ) == ERROR_SUCCESS )

{

// Find this key value

if( _tcscmp( lpszStr, lpszName )==0 )

{

// Remove the service

if( dwType == RSP_UNREGISTER_SERVICE )

{

if( RegDeleteValue( hKey, SERVICE_NAME ) == ERROR_SUCCESS )

{

RegCloseKey ( hKey );

return TRUE;

}

RegCloseKey( hKey );

return FALSE;

}

// Already exist service

if( dwType == RSP_SIMPLE_SERVICE )

{

//DebugOut("Already registed!");

RegCloseKey( hKey );

return TRUE;

}

}

// Not find it

} // No this value

// Unregiste return

if( dwType == RSP_UNREGISTER_SERVICE )

{

RegCloseKey( hKey );

return TRUE;

}

// No this value then create it

if( dwType == RSP_SIMPLE_SERVICE )

{

dwStrCb = 128;

// Set value

if( RegSetValueEx(hKey,

SERVICE_NAME,

0,

REG_SZ,

(CONST BYTE *)lpszName,

dwStrCb ) != ERROR_SUCCESS )

{

//DebugOut("RegSetValueEx() error!");

RegCloseKey( hKey );

return FALSE;

}

RegCloseKey( hKey );

return TRUE;

}

// Unknow type

RegCloseKey( hKey );

return FALSE;

}

主程序:

// WinMain function is the entry of the this program

int APIENTRY WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

if( W95ServiceRegister( RSP_SIMPLE_SERVICE ) )

{

W95StartService( RSP_SIMPLE_SERVICE );

}

MessageBox(NULL, "Sample service", "SERVICE", MB_OK );

UNREFERENCED_PARAMETER( hInstance );

UNREFERENCED_PARAMETER( lpCmdLine );

UNREFERENCED_PARAMETER( nCmdShow );

UNREFERENCED_PARAMETER( hPrevInstance );

return 0;

}

运行这个程序, 等到MessageBox 弹出后, 从WINDOWS 中退出到LOG ON 状态, 你会看见MessageBox 一直保持打开状态直至受到响应或系统关机.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有