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, NULLVirtualAllocEx 用于在遠程進程的空間里 開辟 一塊緩沖區
WriteProcessMemory 則是寫特定進程的特定內存空間
這樣通過兩個函數的配合 就可以 將 本地進程的字符串 傳遞到 遠程的進程
遠程線程程創建
CreateRemoteThread(hRemoteProcess, NULL, 0, pfnStartAddr , pszLibFileRemote , 0, NULL))最后就是這樣 , 好可以成功創建遠程線程.
總結
以上是生活随笔為你收集整理的DLL 远程线程注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宏观 量子计算一句话
- 下一篇: 只允许运行一个实例的方法