DLL 遠程線程注入

遠程線程注入


首先 , 這裏講和爲注入 , 通俗講 , 就是把自己的東西強加給別人
也就是在 其他程序的運行的內存空間裏面 插入自己的代碼
這裏提到的遠程線程注入
這個算是很常用,也算是用的比較多的一種注入方式了

實用代碼解析

打開進程

    // 打開遠程線程
    if ((hRemoteProcess = OpenProcess(PROCESS_CREATE_THREAD |
        PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwRemoteProcessID)) ==
        NULL)

根據PID 打開一個程序 返回其句柄

創建遠程線程


        CreateRemoteThread(hRemoteProcess, NULL, 0, LoadLibrary, "./a.dll", 0, NULL))

這行代碼就是 winAPI 中提供的用於創建遠程線程的代碼 , 從表面上看 , 很容易理解 就是在我們打開的應用空間裏 加載 a.dll 這個鏈接庫
但是實際上沒有這麼簡單咯
下面的分析
這裏面臨的問題主要就是在這兩個參數裏面 LoadLibrary 和 a.dll

LoadLibrary

我們知道一個進程的地址,和其真實內存空間的地址是一種映射關係 , 雖然DLL 已經被加載到內存中去 , 可是對於不同的進程 這個映射值是不一樣的 , 所以 我們 如果 直接把這個函數值 傳入 , 多半得到的是內存非法訪問的異常

”a.dll”

這裏A.dll 是個字符串 , 那麼其屬性應該是 寬字節的字符串指針 PWSTR , 如果直接這樣傳入, 顯然得到的是異常錯誤

得到函數地址

    PTHREAD_START_ROUTINE  pfnStartAddr = (PTHREAD_START_ROUTINE)
        GetProcAddress(GetModuleHandle(TEXT("kernel32")), "LoadLibraryW");

所以這裏 必須 通過 GetProcAddress 得到這個函數的 確切的地址 .這樣上述問題一得到解決

創建遠程字符串

    //使用VirtualAllocEx函數在遠程進程內存地址空間分配DLL文件名緩衝區
    pszLibFileRemote = (PWSTR)VirtualAllocEx(
        hRemoteProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);

    //在遠程進程中寫緩衝區
    WriteProcessMemory(hRemoteProcess, pszLibFileRemote,(PVOID)szDllFullPath, cb, NULL

VirtualAllocEx 用於在遠程進程的空間裏 開闢 一塊緩衝區
WriteProcessMemory 則是寫特定進程的特定內存空間
這樣通過兩個函數的配合 就可以 將 本地進程的字符串 傳遞到 遠程的進程

遠程線程程創建

CreateRemoteThread(hRemoteProcess, NULL, 0, pfnStartAddr , pszLibFileRemote , 0, NULL))

最後就是這樣 , 好可以成功創建遠程線程.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章