请教:怎样使开机启动的程序最早启动? 在windows98和windows2000里? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 转别人的相关回答:众所周之,winlogon是NT操作系统提供交互登陆支持的组件。它有3个部分组成:主程序winlogon.exe,提供认证功能的GINA DLL,以及零个或多个“网络提供者(network providers)”。 大家都知道,系统在启动时,winlogon.exe将加载GINA DLL,且这个DLL是可以自定义的。依据这个基础,许多偷密码的木马便诞生了。不过winlogon.exe除了加载GINA DLL还会加载其他的DLL,我想这一点并不是每个人都熟悉,这种被加载的DLL被称为“Winlogon Notification Package”。首先,我们来了解一下NT操作系统的3种系统状态:注销状态(Logged Off state),用户登陆状态(Logged On state)和工作站锁定状态(Workstation Locked state)。见图2: “Winlogon通知包(Winlogon Notification Package)”就是处理winlogon在切换状态时发出的事件的DLL。你可以通过“Winlogon Notification Package”来监视winlogon事件的响应。你可以注册这些DLL,那么winlogon.exe会在启动时加载它们,并且会在系统状态切换时来调用注册DLL的事件处理函数。当然这一点用来加载后门是在好不过了,因为加载的后门存在于winlogon.exe的进程中,而winlogon.exe是系统进程,一般情况下是无法终止它的,况且杀死它会导致系统崩溃或重启,没人会这么做。用“Winlogon Notification Package”来加载后门的又一个好处是——你的后门将运行在system权限下而不用注册为系统服务。 为了注册你的“Winlogon Notification Package”,必须在“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify”下创建你的“notification package”子键。在我的系统中,存在6个子键,分别是:crypt32chain,cryptnet,cscdll,sclgntfy,SensLogn,termsrv。在“Notify”项下,可以根据需要创建如下键值:Asynchronous[REG_DWORD]:表明是否异步处理winlogon事件,如设为 1,winlogon将启动一个新线程来处理。DllName[REG_EXPAND_SZ]:指定要加载的DLL名。Impersonate[REG_DWORD]:表明是否以登陆用户的权限来处理事件。Lock[REG_SZ]:锁定桌面事件。Logoff[REG_SZ]:注销事件。Logon[REG_SZ]:登陆事件。Shutdown[REG_SZ]:关机事件。StartScreenSaver[REG_SZ]:启动屏保事件。StartShell[REG_SZ]:启动shell(一般指explorer.exe)事件。Startup[REG_SZ]:系统开机事件。StopScreenSaver[REG_SZ]:停止屏保事件。Unlock[REG_SZ]:解除桌面锁定事件。其中每个事件对应DLL中的一个导出函数,即每当有事件发生时,winlogon.exe便调用相应的函数。譬如:DllName的值为“test.dll”,Logoff的值为“testlogoff”,那么系统注销时winlogon.exe将调用test.dll中导出的“testlogon”函数。 关于DLL的实现非常地简单:只要导出处理事件是要调用的函数就行,其他和别的DLL无异。以下是代码的简单实现://----------------------------------Start of WNP.C-------------------------------------------/*Create file exports.def with content:EXPORTS testlogoff testlogon*/#include <windows.h>#pragma comment(linker,"/export:test=_testlogoff@0")#pragma comment(linker,"/export:test=_testlogon@0")#pragma comment(linker,"/entry:DllEntry")#pragma comment(linker,"/subsystem:windows")#pragma comment(linker,"/align:4096")#pragma comment(linker,"/dll")#pragma comment(linker,"/base:1976369152")typedef struct _WLX_NOTIFICATION_INFO { ULONG Size; ULONG Flags; PWSTR UserName; PWSTR Domain; PWSTR WindowStation; HANDLE hToken; HDESK hDesktop; PFNMSGECALLBACK pStatusCallback;} WLX_NOTIFICATION_INFO, *PWLX_NOTIFICATION_INFO;__declspec(dllexport) void __stdcall testlogoff(PWLX_NOTIFICATION_INFO unknow){ MessageBox(NULL,"系统正在注销!","Winlogon Notification Package",MB_OK);}__declspec(dllexport) void __stdcall testlogon(PWLX_NOTIFICATION_INFO unknow){ MessageBox(NULL,"系统正在登陆!","Winlogon Notification Package",MB_OK);}BOOL __stdcall DllEntry(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH:break; case DLL_THREAD_ATTACH:break; case DLL_THREAD_DETACH:break; case DLL_PROCESS_DETACH:break; }return TRUE;}//----------------------------------End of WNP.C--------------------------------------------- win2k中最早启动的进程是smss.exe,接下来是csrss.exe和winlogon.exe,让winlogon进程来启动你的程序应该是最早的 现在win2000的方法有了,那在win98里怎样实现呢? 不过在98里不能用AUTOEXEC,因为我要启动的是桌面程序 98下修改system.ini在shell=explorer.exe后面添加你要运行的程序,用空格分开eg:shell=explorer.exe test.exe2000下修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon下的Shell 修改方式和上面一样HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon下的Shell的值是"Explorer.exe"改成"Explorer.exe test.exe"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run下面的自运行程序其实是由Explorer.exe进程启动的,现在你的test.exe和explorer.exe同时启动,所以就是最快的 98下的system.ini应该是注册表的一部分吧,请问shell=explorer.exe这个键的在注册表中的路径是什么 ? 在98下修改system.ini在shell=explorer.exe 你的程序.exe2000下修改注册表吧 98下的system.ini不是注册表的一部分关于注册表的路径,上面已经写得很清楚了引用:=======================================HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon下的Shell的值是"Explorer.exe"改成"Explorer.exe test.exe"======================================== 程序在处理大量数据时整个程序会阻塞,在这个时候如何显示个动画表示有数据在处理 如何删除图像的边缘像素 对话框程序中对话框创建完成标志是什么? 话外题,随便聊聊 关于定时器 CListCtrl控件为什么显示不出来 怎么改变com返回值 请教一个比较简单的问题!如果将一组图片全部装入内存? 小女子不才,请问这个链接问题如何解决? CStatic对象,画图时如何限制范围? 怎么样在VC开发的DLL和PB开发的应用程序之间建立一个数据通道(ROUTER)-在线等待, 答者有分! 如何在windows下隐藏一个文件?
DllName[REG_EXPAND_SZ]:指定要加载的DLL名。
Impersonate[REG_DWORD]:表明是否以登陆用户的权限来处理事件。
Lock[REG_SZ]:锁定桌面事件。
Logoff[REG_SZ]:注销事件。
Logon[REG_SZ]:登陆事件。
Shutdown[REG_SZ]:关机事件。
StartScreenSaver[REG_SZ]:启动屏保事件。
StartShell[REG_SZ]:启动shell(一般指explorer.exe)事件。
Startup[REG_SZ]:系统开机事件。
StopScreenSaver[REG_SZ]:停止屏保事件。
Unlock[REG_SZ]:解除桌面锁定事件。其中每个事件对应DLL中的一个导出函数,即每当有事件发生时,winlogon.exe便调用相应的函数。譬如:DllName的值为“test.dll”,Logoff的值为“testlogoff”,那么系统注销时winlogon.exe将调用test.dll中导出的“testlogon”函数。 关于DLL的实现非常地简单:只要导出处理事件是要调用的函数就行,其他和别的DLL无异。以下是代码的简单实现://----------------------------------Start of WNP.C-------------------------------------------
/*Create file exports.def with content:
EXPORTS
testlogoff
testlogon
*/
#include <windows.h>
#pragma comment(linker,"/export:test=_testlogoff@0")
#pragma comment(linker,"/export:test=_testlogon@0")
#pragma comment(linker,"/entry:DllEntry")
#pragma comment(linker,"/subsystem:windows")
#pragma comment(linker,"/align:4096")
#pragma comment(linker,"/dll")
#pragma comment(linker,"/base:1976369152")typedef struct _WLX_NOTIFICATION_INFO { ULONG Size; ULONG Flags; PWSTR UserName; PWSTR Domain; PWSTR WindowStation; HANDLE hToken; HDESK hDesktop; PFNMSGECALLBACK pStatusCallback;
} WLX_NOTIFICATION_INFO, *PWLX_NOTIFICATION_INFO;__declspec(dllexport) void __stdcall testlogoff(PWLX_NOTIFICATION_INFO unknow)
{
MessageBox(NULL,"系统正在注销!","Winlogon Notification Package",MB_OK);
}__declspec(dllexport) void __stdcall testlogon(PWLX_NOTIFICATION_INFO unknow)
{
MessageBox(NULL,"系统正在登陆!","Winlogon Notification Package",MB_OK);
}BOOL __stdcall DllEntry(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:break;
case DLL_THREAD_ATTACH:break;
case DLL_THREAD_DETACH:break;
case DLL_PROCESS_DETACH:break;
}return TRUE;
}
//----------------------------------End of WNP.C---------------------------------------------
在shell=explorer.exe后面添加你要运行的程序,用空格分开
eg:shell=explorer.exe test.exe2000下修改注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon下的Shell
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run下面的自运行程序其实是由Explorer.exe进程启动的,现在你的test.exe和explorer.exe同时启动,所以就是最快的
在shell=explorer.exe 你的程序.exe2000下修改注册表吧
关于注册表的路径,上面已经写得很清楚了
引用:
=======================================
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon下的Shell的值是"Explorer.exe"改成"Explorer.exe test.exe"
========================================