简单的装载、启动、停止、卸载驱动-还是喜欢命令行的感觉。OSR 的 driver Loader比较经典功能强大,但自己前期写潜伏的kit,只需要简单的载入即可,就写了这个小程序。
代码:
/* * Loaddriver *By Philomela * 2011 *See Useage() */ #include <windows.h> #include <stdio.h> #include <tchar.h> #include <windef.h> #define printError printf char aPath[1024]; char *theDrivername; //Up the privilege BOOL up() { HANDLE hToken,hProcess; TOKEN_PRIVILEGES tp; char *pSEDEBUG="SeDebugPrivilege"; hProcess=GetCurrentProcess(); if (!OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken)) { printError(TEXT("OpenProcessToken")); return FALSE; } if (!LookupPrivilegeValue(NULL,pSEDEBUG,&tp.Privileges[0].Luid)) { printError(TEXT("LookupPrivilegeValue")); //printf("无法找到指定权限:%s",pSEDEBUG); return FALSE; } tp.PrivilegeCount=1; tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; if (AdjustTokenPrivileges(hToken,FALSE,&tp,NULL,NULL,NULL) != 0) return TRUE; else { printError(TEXT("AdjustTokenPrivileges")); return FALSE; } } BOOL _util_load_sysfile(char *theDrivername) { char aPath[1024]; char aCurrentDirectory[515]; SC_HANDLE rh; SC_HANDLE sh = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (!sh) return FALSE; rh = CreateService(sh,theDrivername,theDrivername,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,\ SERVICE_ERROR_NORMAL,aPath,NULL,NULL,NULL,NULL,NULL); if (!rh) { printf("Didn`t create a service... %d\n", GetLastError()); if (GetLastError() == ERROR_SERVICE_EXISTS) { rh = OpenService(sh,theDrivername,SERVICE_ALL_ACCESS); if (!rh) { printf("Can`t find a Service but it found\n"); CloseHandle(sh); return FALSE; } } else { _tprintf( TEXT("Service all ready on\n") ); CloseHandle(sh); return FALSE; } } //start the drivers if(rh) { if( 0 == StartService(rh, 0, NULL)) { if(ERROR_SERVICE_ALREADY_RUNNING == GetLastError()) { printf("Service already running\n"); } else { printf("Failed on StartService %d\n",GetLastError()); CloseHandle(sh); CloseHandle(rh); return FALSE; } } CloseServiceHandle(sh); CloseServiceHandle(rh); } return TRUE; } void Usage() { _tprintf(_T("load x [-r -d -g -s -k] [default -r -g]\n")); _tprintf(_T("\t -r 注册\n")); _tprintf(_T("\t -d 取消注册\n")); _tprintf(_T("\t -g 启动驱动\n")); _tprintf(_T("\t -s 停止驱动\n")); _tprintf(_T("\t -k 停止并取消注册\n")); } BOOL deleteService(SC_HANDLE sh,SC_HANDLE rh) { rh= OpenService( sh, // SCManager database theDrivername, // name of service SERVICE_ALL_ACCESS); // only need DELETE access if (rh == NULL) { _tprintf(_T("OpenService failed (%d)\n"), GetLastError()); return FALSE; } if (! DeleteService(rh) ) { _tprintf(_T("DeleteService failed (%d)\n"), GetLastError()); return FALSE; } _tprintf(_T("Delete service succeeded\n")); return TRUE; } BOOL stop(SC_HANDLE sh,SC_HANDLE rh) { SERVICE_STATUS ssStatus; rh= OpenService( sh, // SCManager database theDrivername, // name of service SERVICE_ALL_ACCESS); // only need DELETE access if (! rh) { _tprintf(_T(" OpenService Failed :%d\n"),GetLastError()); return FALSE; } if (! ControlService( rh, // handle to service SERVICE_CONTROL_STOP, // control value to send &ssStatus) ) // address of status info { printf("ControlService failed (%d)\n", GetLastError()); return FALSE; } _tprintf(_T("Stop service success\n")); return TRUE; } BOOL create(SC_HANDLE sh) { if (!CreateService(sh,theDrivername,theDrivername,SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,aPath,NULL,NULL,NULL,NULL,NULL) ) { if(ERROR_SERVICE_ALREADY_RUNNING == GetLastError()) { _tprintf(_T("Service already running\n")); return FALSE; } else if(ERROR_SERVICE_EXISTS == GetLastError()) { _tprintf(_T("Service exists\n")); return FALSE; } _tprintf(_T("Failed on CreateService %d\n"),GetLastError()); return FALSE; } _tprintf(_T("Create service success\n") ); return TRUE; } BOOL run(SC_HANDLE sh,SC_HANDLE rh) { rh = OpenService(sh,theDrivername,SERVICE_ALL_ACCESS); if ( StartService(rh, 0, NULL) == 0) { if(ERROR_SERVICE_ALREADY_RUNNING == GetLastError()) _tprintf(_T("Service already running\n")); else _tprintf(_T("Failed on StartService %d\n"),GetLastError()); return FALSE; } _tprintf(TEXT("run service success\n")); return TRUE; } void Close(SC_HANDLE sh, SC_HANDLE rh) { if(sh) CloseServiceHandle(sh); if(rh) CloseServiceHandle(rh); } int main(int argc, TCHAR* argv[]) { char aCurrentDirectory[515]; SC_HANDLE sh = NULL ,rh = NULL; BOOL d_flag = FALSE, s_flag = FALSE; BOOL r_flag = TRUE, g_flag = TRUE; if ( argc < 2 ) { Usage(); return 1; } up(); theDrivername = argv[1]; while ( argc-- > 2) { if( argv[argc][0] != '-' ) { Usage(); return 1; } switch(argv[argc][1]) { case 'r': g_flag = FALSE; //不需要启动驱动 break; case 'd': d_flag = TRUE; break; case 'g': g_flag = TRUE; r_flag = FALSE; //不需要注册 break; case 's': s_flag = TRUE; break; case 'k': s_flag = d_flag = TRUE; break; default: Usage(); return 1; } } sh = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (!sh) return FALSE; GetCurrentDirectory( 512, aCurrentDirectory); _snprintf(aPath,1022,"%s\\%s.sys",aCurrentDirectory,theDrivername); printf("loading %s\n",aPath); //先判断是否需要停止、反注册驱动 if (s_flag == TRUE) stop(sh,rh); if (d_flag == TRUE) deleteService(sh,rh); if (s_flag || d_flag) { // Close(sh,rh); //_tprintf(_T("\tExit...\n")); return 0; } if (r_flag == TRUE) create(sh); if (g_flag == TRUE) run(sh,rh); Close(sh,rh); return 0; }
