遠端執行緒 hook 監控?

2022-09-14 03:24:10 字數 2609 閱讀 4585

見字如面,我是東北碼農。

下面是效果圖,可以記錄執行哪些程式、函式引數、執行時間。你也會發現一些有趣的事,例如有時僅僅開啟乙個目錄,就會觸發git的快取程序。

實現功能前,我們需要了解當我們雙擊執行乙個程式時,到底發生了什麼?

例如啟動乙個瀏覽器,第一步需要先在桌面找到瀏覽器的圖示。在windows系統中,桌面程序是explorer.exe,有點類似linux的shell。如果你現在開啟任務管理器,就可以發現explorer.exe程序,如果結束掉explorer.exe程序,桌面就會馬上會消失。

當雙擊瀏覽器圖示時,就會啟動瀏覽器程序。桌面程式explorer.exe會呼叫createprocess介面,把各項引數填好去建立乙個程序。createprocess有很多引數,我們監控時只需要關心前兩個引數就好,程式執行路徑和程式函式。

我們需要在explorer.exe程序空間內hook createprocess。就像發射炮彈一樣,hook createprocess我們可以寫到乙個dll中,作為炮彈。現在的問題是如何讓這枚炮彈發射到explorer.exe程序中。這裡進入本文正題:遠端執行緒dll注入。

本章節會介紹如何實現乙個通用的遠端執行緒注入的小工具,並使用這個工具注入我們的dll到explorer.exe中。

相信對windows底層程式設計和系統安全熟悉的人並不陌生,遠端執行緒實現時需要借助於乙個windows api函式createremotethread,通過它可以在另外乙個程序中注入乙個執行緒並執行。

實現函式很簡單,僅僅20行**(沒有做返回值判斷,僅為了展示記錄)**如下:

static bool remotethread_inject(dword pid,const char* dll_path) 

遠端執行緒注入dll,就是在目標程序中建立乙個執行緒,執行loadlibrary,載入我們的dll。

// step1:在目標程序申請記憶體  

int dll_path_len = strlen(dll_path )+1;

void* remote_buf = virtualallocex(pro, null, dll_path_len, mem_commit, page_readwrite);

// step2:在目標程序寫入dll路徑

bool ret = writeprocessmemory(pro, remote_buf, (lpvoid)dll_path, dll_path_len, null);

首先需要把執行緒入口函式的引數,也就是dll的路徑,寫入目標程序。需要先在目標程序申請空間,再寫入。

// step3:獲取loadlibrarya位址

auto load_func = getprocaddress(getmodulehandle(l"kernel32.dll"), "loadlibrarya");

// step4:執行遠端執行緒

handle remote_thread = createremotethread(pro, null, 0, (lpthread_start_routine)load_func, remote_buf, 0, null);

// step5:等待執遠端執行緒行完畢

waitforsingleobject(remote_thread, 10000);

我們需要在目標程序中獲取loadlibrary的位址,因為loadlibrary在kernel32.dll裡,載入比較早,所以在每個程序內位址都一樣,所以我們可以在本程序獲取直接使用。

然後呼叫createremotethread執行遠端執行緒,再呼叫waitforsingleobject等待執行結束。

每個dll都有乙個入口函式dllmain,在dll載入時會呼叫,我們把hook操作寫在這裡。

static bool init = false;

if (!init)

}

先開啟乙個控制台,在控制台展示hook的資訊。然後再進行hook,為了防止多次執行,使用static變數控制一下。

char tra_cw[1024];

bool winapi mycreateprocessw(

_inout_opt_ lpwstr lpcommandline,

_in_opt_ lpsecurity_attributes lpprocessattributes,

_in_opt_ lpsecurity_attributes lpthreadattributes,

_in_ bool binherithandles,

_in_ dword dwcreationflags,

_in_opt_ lpvoid lpenvironment,

_in_opt_ lpcwstr lpcurrentdirectory,

_in_ lpstartupinfow lpstartupinfo,

_out_ lpprocess_information lpprocessinformation

)

hook以後,列印資訊,再呼叫原函式,畢竟我們只是監控,如果想組織,就需要再額外加一些邏輯了。

最後,東北碼農,求關注、點讚、**,謝謝~

談談監控主機的「Hook鏈」問題

作業系統是通過訊息傳遞驅動各種事件動作的,要想監控系統內的動態,發現黑客的入侵行為,需要對非常多的 重要操作 進行監控,比如 許可權的變更 程序的建立與被殺 網路連線的變化 檔案的讀寫 登錄檔的變化 驅動程式的載入 遠端執行緒注入等等。如何實現這些系統行為的監控呢?就是在這些動作程式被執行前,插入自...

winform鍵盤全域性與執行緒Hook

宣告鍵盤鉤子的封送結構型別 structlayout layoutkind.sequential public class keyboardhookstruct 使用windows api函式代替獲取當前例項的函式,防止鉤子失效 dllimport kernel32.dll public stati...

jprofiler監控遠端tomcat

上傳安裝包jprofiler linux 7 2 3.tar.gz到遠端linux伺服器 tar zxf jprofiler linux 7 2 3.tar.gz解壓檔案 選擇on a remote computer和linux x86 amd64,next 選擇jvm資訊,next 選擇啟動模式w...