久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
VC++ 遠程線程注入學習筆記
[打印本頁]
作者:
liuyuxi
時間:
2015-1-11 00:39
標題:
VC++ 遠程線程注入學習筆記
一天學硬件,一天學軟件。哈~正所謂【軟硬兼施】啊。今天輪到學軟件了,由于之前對DLL木馬有一些研究,大部分木馬都是通過遠程線程注入的方式實現無進程執行。早就想學 這種技術了,無奈當時自身的編程技術還不到那個境界,現在試試。。。
花了一下午的時間, 查詢相關資料,看視頻教程,大概給弄懂怎么回事了。就是將木馬的實現功能全部寫在一個DLL中(DLL 也是可執行文件,但是不可以直接執行,需要EXE調用),然后找個目標進程(一般是IE進程,突破防火墻~),將自身路徑寫入到該進程空間內,然后在該進程中尋找LoadLibraryA()這個加載DLL 的函數地址,通過遠程線程函數使該進程執行LoadLibraryA()這個加載函數,加載DLL。 直白點,就是先將DLL的路徑寫入到目標進程空間內,然后在目標進程空間內尋找 LoadLibraryA()這個函數的地址,再利用LoadLibraryA()這個函數調用木馬的DLL。相當于執行了木馬...然后木馬就可以隨意的xxoxoxox你的電腦了~
遠程線程注入的細分過程 共可分5 步:
1、通過進程PID 打開目標進程獲得目標進程句柄。(為了能操作該進程就要獲得它的句柄)
利用到的API: HANDLE OpenProcess( DWORD dwDesiredAccess,BOOL bInheritHandle, DWORD dwProcessId);
功能:
OpenProcess 函數用來打開一個已存在的進程對象,并返回進程的句柄。
函數原型:
HANDLE OpenProcess( DWORD dwDesiredAccess, //權限
BOOL bInheritHandle, // 是否繼承句柄
DWORD dwProcessId // 目標進程的PID標識符
);
返回值: 如成功,返回值為指定進程的句柄。 如失敗,返回值為空,可調用GetLastError獲得錯誤代碼。
2、根據上面提供的目標進程句柄在其申請一塊內存空間。(用于存放DLL的完整路徑)
利用到的API:LPVOID VirtualAllocEx(HANDLE hProcess,LPVOID lpAddress,SIZE_T dwSize,DWORD flAllocationType, DWORD flProtect )
功能:
VirtualAllocEx 函數的作用是在指定進程的虛擬空間保留或提交內存區域,除非指定MEM_RESET參數,否則將該內存區域置0。
函數原形:
LPVOID VirtualAllocEx(
HANDLE hProcess, // 進程句柄
LPVOID lpAddress, // 獲取內存空間的區域
SIZE_T dwSize, // 要獲取空間的大小
DWORD flAllocationType, // 內存分配的類型
DWORD flProtect // 內存頁保護
);
返回值:執行成功就返回分配內存的首地址,不成功就是NULL。
3、將DLL的路徑寫入到目標進程內申請的內存空間。(因為進程間是有邊界的,不能互相訪問彼此的內存空間)
利用到的API:BOOL WriteProcessMemory( HANDLE hProcess, LPVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesWritten );
功能:
此函數能寫入某一進程的內存區域(直接寫入會出Access Violation錯誤,故需此函數)。
函數原形:
BOOL WriteProcessMemory(
HANDLE hProcess, // 進程句柄
LPVOID lpBaseAddress, // 內存空間分配的首地址
LPVOID lpBuffer, // 寫入的內容
DWORD nSize, // 寫入的內容大小
LPDWORD lpNumberOfBytesWritten // 不知道干嘛用 ...
);
返回值:非零值代表成功。
4、在目標進程中尋找LoadLibraryA()這個函數的函數地址。(找到函數地址才能調用它)
利用到的API: FARPROC GetProcAddress( HMODULE hModule, LPCSTR lpProcName );
HMODULE GetModuleHandle ( LPCTSTR lpModuleName );
功能:
GetProcAddress函數檢索指定的動態鏈接庫(DLL)中的輸出庫函數地址。
函數原型:
FARPROC GetProcAddress(
HMODULE hModule, // DLL模塊句柄
LPCSTR lpProcName // 函數名
);
返回值:
如果函數調用成功,返回值是DLL中的輸出函數地址。
如果函數調用失敗,返回值是NULL。得到進一步的錯誤信息,調用函數GetLastError。
說明:GetModuleHandle 獲取一個應用程序或動態鏈接庫的模塊句柄
參數:
lpModuleName
模塊名稱 如果參數是NULL 則獲取自身句柄
返回值:如執行成功成功,則返回模塊句柄。零表示失敗。通過GetLastError獲得錯誤信息
5、創建遠程線程,根據上面找到LoadLibraryA()的函數地址,調用該函數,LoadLibraryA()函數的參數就是目標進程中的DLL路徑 (這時就是執行我們的DLL 了)
利用到的API:HANDLE WINAPI CreateRemoteThread( __in HANDLE hProcess, __in LPSECURITY_ATTRIBUTES lpThreadAttributes, __in SIZE_T dwStackSize, __in LPTHREAD_START_ROUTINE lpStartAddress, __in LPVOID lpParameter, __in DWORD dwCreationFlags, __out LPDWORD lpThreadId );
功能:創建一個在其它進程地址空間中運行的線程(也稱:創建遠程線程).
函數原型:
HANDLE WINAPI CreateRemoteThread(
1 __in HANDLE hProcess, // 目標進程句柄
__in LPSECURITY_ATTRIBUTES lpThreadAttributes, // 線程安全屬性
__in SIZE_T dwStackSize, // 線程棧初始大小
__in LPTHREAD_START_ROUTINE lpStartAddress, // 線程函數
__in LPVOID lpParameter, // 線程參數
__in DWORD dwCreationFlags, // 創建的標志 (立即執行、掛起等)
__out LPDWORD lpThreadId // 線程句柄
);
返回值: 如果調用成功,返回新線程句柄.
如果失敗,返回NULL.
具體實現代碼:(EXE)
======================================================================================================
#include <windows.h>
#include <stdio.h>
BOOL InjectDll(char *DllPath, DWORD dwProcessID)
{
if ( (DllPath == NULL) && (dwProcessID < 0))
return FALSE;
// 1、打開目標進程獲得目標進程句柄 // 權限 ,句柄繼續承,加成PID
HANDLE hRemoteProcess = OpenProcess(PROCESS_ALL_ACCESS,0,dwProcessID);
if (hRemoteProcess == NULL)
return FALSE;
// 2、通過目標進程句柄在其申請一塊內存空間 // 進程句柄,獲取內存地址區域,分配的內存大小,內存分配的類型,內存頁保護
LPVOID RemoteProcessSize = VirtualAllocEx(hRemoteProcess,NULL,strlen(DllPath)+1,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
if (RemoteProcessSize == NULL)
return FALSE;
// 3、將DLL的路徑寫入到目標進程內申請的內存空間
// 進程句柄,要寫入的內存首地址,寫入的內容,內容的大小,未知
BOOL bRet = WriteProcessMemory(hRemoteProcess,RemoteProcessSize,DllPath,strlen(DllPath)+1,0);
if(!bRet)
return FALSE;
// 4、將函數LoadLibraryA的入口地址作為我們的遠程線程的入口地址
// 當遠程線程啟動時,就會調用LoadLibraryA 裝載我們的DLL // 模塊句柄 /*獲取模塊句柄(模塊名)*/ ,函數名
PTHREAD_START_ROUTINE ScanLoad = (PTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle("Kernel32.DLL"),"LoadLibraryA");
if (ScanLoad == NULL)
return FALSE;
/* 哈前天才剛從小凡那挖過來的知識點 沒想到現在就用上了。再次感謝我家滴小凡!o(∩_∩)o 哈哈 PTHREAD_START_ROUTINE 這個其實是函數型指針,原型typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(LPVOID lpThreadParameter); 用來指向LoadLibraryA 函數 */
// 5、創建遠程線程執行DLL 這里其實就是用LoadLibraryA 加載我們的DLL
HANDLE hRemoteThread = NULL;
// 目標進程句柄,線程安全屬性,線程初始大小,線程函數(目標中的LoadLibraryA),函數參數(就是目標進程中的DLL路徑),標志,線程句柄
hRemoteThread = CreateRemoteThread(hRemoteProcess,NULL,0,ScanLoad,RemoteProcessSize,0,0);
if(hRemoteThread == NULL)
return FALSE;
return TRUE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
if (InjectDll("D:\\ssdddd.dll",1552)) // 傳遞DLL 完整路徑和需要注入的目標進程的PID
MessageBox(0,"注入成功!","",MB_SYSTEMMODAL);
else
MessageBox(0,"注入失敗!","",MB_SYSTEMMODAL);
}
========================================================================================================
這個是被調用的DLL:
========================================================================================================
#include "windows.h"
BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, PVOID fImpLoad) // 這是個回調函數 也是DLL 入口點
{
switch(fdwReason)
{
case DLL_PROCESS_ATTACH: // 進程被調用
MessageBox(NULL,"嘎嘎~DLL自身被調用~","進程被調用 ",MB_SYSTEMMODAL);
break;
case DLL_THREAD_ATTACH: // 線程被調用
MessageBox(NULL,"嘎嘎~目標程序啟動了一個線程~","線程被調用 ",MB_SYSTEMMODAL);
break;
case DLL_PROCESS_DETACH: // 進程退出
MessageBox(NULL,"嘎嘎~目標進程退出~","進程退出",MB_SYSTEMMODAL);
break;
case DLL_THREAD_DETACH: // 線程退出
MessageBox(NULL,"嘎嘎~目標線程退出~","線程退出",MB_SYSTEMMODAL);
break;
}
return(TRUE);
}
========================================================================================================
遠程線程注入還有其他的方式,好像是將要實現的功能函數直接寫入到目標進程內,在明白進程內執行該函數...不過原理應該都是一樣滴,遠程線程注入還有其他的用處,例如外掛啊、破解補丁啊、等等...
嗯,這就是今天理解到的東西,剛接觸,可能有些地方理解錯了,請大家不要見笑哈,歡迎批評指正~ 有興趣的童鞋可以加我 共同探討
等學會了遠程線程注入,準備開始研究研究HOOK了,HOOK 更好玩~ 興奮吖~~
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
成人超碰
|
九九九久久国产免费
|
国产精品永久久久久
|
青青操av
|
亚洲一区二区三区乱码aⅴ 四虎在线视频
|
中文字幕在线精品
|
欧美黄色片
|
黄色片a级
|
99国产精品久久久久老师
|
九九国产在线观看
|
日韩一级精品视频在线观看
|
久久av一区二区三区
|
91 在线
|
美女国产
|
超碰520
|
国内久久精品
|
日韩波多野结衣
|
日日日色
|
日本a∨视频
|
日韩欧美一区二区三区四区
|
欧美一级片免费看
|
日韩精品一区二区三区在线
|
亚洲电影第三页
|
草草影院ccyy
|
成人做爰www免费看 午夜精品久久久久久久久久久久
|
国产精品中文在线
|
国产在线视频一区
|
国产高清精品一区二区三区
|
秋霞在线一区二区
|
欧美伊人久久久久久久久影院
|
日韩小视频在线
|
中文字幕一区二区三区精彩视频
|
国产高清毛片
|
亚洲福利在线观看
|
亚洲传媒在线
|
欧美色人
|
日本精品在线一区
|
午夜成人免费视频
|
国产一区二区三区不卡av
|
91在线视频网址
|
av网站免费看
|