果洛皆料电子有限公司

木馬中如何編程實(shí)現(xiàn)遠(yuǎn)程關(guān)機(jī)

  • 發(fā)布于:2023-11-01
  • 199 人圍觀

  遠(yuǎn)程控制中,有一個重要的部份就是如何實(shí)現(xiàn)遠(yuǎn)程關(guān)機(jī),如在各種黑客入侵中,我們到處可以見到木馬的身影,木馬它作為一種遠(yuǎn)程控制軟件,它一般是實(shí)現(xiàn)了遠(yuǎn)程關(guān)機(jī)功能的。如我國大名鼎鼎的木馬“冰河”等,都是有這個功能的,只是它是各種功能的集合罷了,今天我們就來看看這個重要的關(guān)機(jī)部分是如何編程實(shí)現(xiàn)的,在這里我就用眼下流行的VC6.0來編寫,同時用VC也大大減少了我們的一些設(shè)計(jì)工作,讓我們的菜鳥也來動手寫一下自己的入侵工具。

  在木馬中,我們是采用的讓客戶端Socket給服務(wù)端的Socket發(fā)送相關(guān)的指令,同時當(dāng)服務(wù)端收到相應(yīng)的指令后,就執(zhí)行相對應(yīng)的操作指令,這些操作當(dāng)然是在服務(wù)端的計(jì)算機(jī)上所進(jìn)行的。而這個操作實(shí)質(zhì)就是調(diào)用相應(yīng)的函數(shù)來處理,這個函數(shù)及其參數(shù)說明就是如下:

  BOOL ExitWindowsEx(UINT uFlags,DWORD dwReserved);

  在其中uFlags可以有的取值:

  EWX_LOGOFF:注消; EWX_POWEROFF:強(qiáng)制關(guān)機(jī); EWX_REBOOT:重啟;

  EWX_SHUTDOWN:先保存再關(guān)機(jī); EWX_FORCE:不保存就關(guān)機(jī); 

  EWX_FORCEIFHUNG:不保存就關(guān)機(jī)(WIN2K以上版本);

  好了,接下來我們就在VC中來用這個函數(shù)實(shí)現(xiàn)我們所要的功能。

  首先,由VC中的向?qū)梢粋€對話框,注意在生成向?qū)е幸x擇成靜態(tài)聯(lián)編,由于我們在木馬中一般是常用的是重啟,那么我們就把這個程序取名為reboot吧!去掉它默認(rèn)生成的靜態(tài)文本,然后添加了三個單選項(xiàng)。并把其它主要的項(xiàng)設(shè)定如下:

控件 ID 屬性
Button1 OnOK “確定”
Button2 OnCancel “取消”
Radio1 IDC_LOGOFF “注消計(jì)算機(jī)”
Radio2 IDC_REBOOT “重啟計(jì)算機(jī)”
Radio3 IDC_SHUTDOWN “關(guān)閉計(jì)算機(jī)”

  第二,打開MFC ClassWizard進(jìn)行消息的映射處理,五個主要的控件都是用單擊這個消息處理,從而為為每個控件進(jìn)行了消息映射。

  第三、在rebootDlg.h中為三個單選按鈕添加一個標(biāo)志成員整形變量m_mark。并且在三個單選項(xiàng)按鈕的函數(shù)體分別加入m_mark=0, m_mark=1, m_mark=2,如:(另兩個也同理)

void CRebootDlg::OnLogoff()
{
 // TODO: Add your control notification handler code here
 m_mark=0;
}

  第四、在雙擊“確定”的按鈕,去掉它原來默認(rèn)調(diào)用的ONOK(),并且加入以下的代碼為:

void CRebootDlg::OnCok()
{
 // TODO: Add your control notification handler code here
 HANDLE hToken;
 TOKEN_PRIVILEGES tkp;
 DWORD dwVersion; //版本號

 dwVersion = GetVersion(); //得到WINDOWS NT或Win32的版本號

 switch(m_mark)//由接收單選項(xiàng)值進(jìn)行相關(guān)操作
 {
  case 0:
   ExitWindowsEx(EWX_LOGOFF,0);
   break; //注消操作
  case 1:
   if(dwVersion < 0x80000000)
   {
    OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken);
    LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
    tkp.PrivilegeCount = 1; //設(shè)置權(quán)限
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
    ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0);
   }
   else //WIN系列其它系統(tǒng)
   {
    ExitWindowsEx(EWX_FORCE | EWX_REBOOT,0);
   }
   break; //重啟操作
  case 2:
   if(dwVersion < 0x80000000)//用于判斷WIN系列,從而設(shè)置相應(yīng)的權(quán)限
   {
    OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES |TOKEN_QUERY,&hToken);
    LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
    ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0);
   }
   else
   {
    ExitWindowsEx(EWX_FORCE | EWX_SHUTDOWN ,0);
   }
   break;//關(guān)閉計(jì)算機(jī)
  }
 }

  第五、“取消”可以不做處理,采用默認(rèn)的就可了,然后編譯運(yùn)行完成,這樣你就為你的木馬編寫了遠(yuǎn)程關(guān)機(jī)部分。最后要是你有什么問題討論請聯(lián)系:anmeihong@sina.com

萬企互聯(lián)
標(biāo)簽: