見字如面,我是東北碼農。
下面是效果圖,可以記錄執行哪些程式、函式引數、執行時間。你也會發現一些有趣的事,例如有時僅僅開啟乙個目錄,就會觸發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:在目標程序申請記憶體首先需要把執行緒入口函式的引數,也就是dll的路徑,寫入目標程序。需要先在目標程序申請空間,再寫入。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);
// step3:獲取loadlibrarya位址我們需要在目標程序中獲取loadlibrary的位址,因為loadlibrary在kernel32.dll裡,載入比較早,所以在每個程序內位址都一樣,所以我們可以在本程序獲取直接使用。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);
然後呼叫createremotethread執行遠端執行緒,再呼叫waitforsingleobject等待執行結束。
每個dll都有乙個入口函式dllmain,在dll載入時會呼叫,我們把hook操作寫在這裡。
static bool init = false;先開啟乙個控制台,在控制台展示hook的資訊。然後再進行hook,為了防止多次執行,使用static變數控制一下。if (!init)
}
char tra_cw[1024];hook以後,列印資訊,再呼叫原函式,畢竟我們只是監控,如果想組織,就需要再額外加一些邏輯了。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鏈」問題
作業系統是通過訊息傳遞驅動各種事件動作的,要想監控系統內的動態,發現黑客的入侵行為,需要對非常多的 重要操作 進行監控,比如 許可權的變更 程序的建立與被殺 網路連線的變化 檔案的讀寫 登錄檔的變化 驅動程式的載入 遠端執行緒注入等等。如何實現這些系統行為的監控呢?就是在這些動作程式被執行前,插入自...
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...