[心得]Re: DLL Injection

看板C_and_CPP作者 (吡啶)時間7年前 (2017/05/20 07:29), 7年前編輯推噓8(803)
留言11則, 6人參與, 最新討論串1/1
原文吃光光 內容並非我原創,我只是讀了很多資料和網站,融會貫通後,把這些做法統整 ---本文開始--- DLL Injecton是將DLL注入到另一個宿主程式內,介以改變這個程式的行為, 就像給程式打了一劑迷幻藥,讓他對你言聽計從(誤)。 DLL本身無法直接執行,需要其他程式動態載入, 但透過DLL Injection可以讓DLL有如附身在其他process上, 利用其他process的資源來執行自己的程式碼。 一般程式的進入點是main()函式,DLL也有進入點,叫做DLLMain, 當DLL被載入記憶體時,系統會呼叫DLLMain()函式。 這個手法可以用於程式偵錯、修改遊戲內的數值(生命、物品無限等等), 但也有惡意用途,比如說將後門程式寄生於系統服務上。 DLL Injection可以分為四個步驟 1. 附著於宿主process上(Attach to process) 2. 在宿主process記憶體空間內劃出一塊給DLL(Allocate Memory within the process) 3. 將DLL的路徑資料寫入到該空間(Copy the path of DLL into the process memory) 4. 引導宿主process執行DLL的程式碼,DLLMain()中的程式碼 一、附著於宿主process上 電腦中的process都是各自獨立,原則上,一個process不能越界存取他人的記憶體空間。 如果我們今天要做一些越界的事情,此時就可以透過OpenProcess()來取得許可。 取得許可後,我們才能對宿主程式動一些手腳。 hHandle = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, FALSE, procID ); hHandle為宿主的句柄,接下來都會用到 二、在宿主process記憶體空間內劃出一塊給DLL 在我們控制宿主之前,我們需要一塊記憶體空間來存放DLL的路徑資料, 以合法掩護非法(大誤)。 VirtualAllocEx()正是我們需要的函式。令DLL的絕對路徑為dllPath。 LPVOID WINAPI VirtualAllocEx( HANDLE hProcess, //目標process的handle LPVOID lpAddress, //分配起始位置,可以為NULL SIZE_T dwSize, //分配的size, Strlen(dllPath) DWORD flAllocationType, DWORD flProtect); 這個函式的回傳值是該塊空間的指標,請務必用變數去接,第3-4步會用到 三、將DLL的路徑資料寫入到該空間 BOOL WINAPI WriteProcessMemory( HANDLE hProcess, //目標process的handle LPVOID lpBaseAddress, //第二步VirtualAllocEx回傳的指標 LPCVOID lpBuffer, //dllPath SIZE_T nSize, // Strlen(dllPath) SIZE_T *lpNumberOfBytesWritten); //這邊填NULL即可 四、引導宿主執行DLL的程式碼 我們已經將DLL的路徑寫在宿主的記憶體中了, 接下來需要在宿主裡面建立一個執行緒來跑DLL的程式碼, 由CreateRemoteThread()來建立執行緒。 我們需要LoadLibraryA()這個函式當作引導,dllPath當作參數。 先找出LoadLibraryA()在宿主中的位置 loadLibAddr = GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "LoadLibraryA"); //建立執行緒時,要交給執行緒的函式就在loadLibAddr 接下來 HANDLE WINAPI CreateRemoteThread( HANDLE hProcess, //目標process的handle LPSECURITY_ATTRIBUTES lpThreadAttributes, //這邊填NULL SIZE_T dwStackSize, //這邊填0 LPTHREAD_START_ROUTINE lpStartAddress, //loadLibAddr LPVOID lpParameter, //第二步VirtualAllocEx的回傳值 DWORD dwCreationFlags, //這邊填0 LPDWORD lpThreadId //這邊填NULL ); 回頭看HpyHacking大大所提出的問題 DLL的程式碼可改為 #include "dll.h" #include <windows.h> BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD ul_reason_for_call,LPVOID lpvReserved) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: { int *p = (int *)0x22fedc; *p = 500; /* 0x22fedc是我用Cheat Engine找出的位置 /*每個人找出來的值不一定相同 /* 我是在XP SP3的VM上測試 break; } /* Return TRUE on success, FALSE on failure */ return TRUE; } 執行結果:http://imgur.com/MG85RYK
附上我自己寫的Injector:https://github.com/vaio89/DLLInjector Reference: 安靖、周彬彬、范文慶(2011)。精通Windows API函數、介面、程式設計實例。台北:松岡 Petzold (1998). Programming Windows(5th ed.). Microsoft Press http://blog.opensecurityresearch.com/2013/01/windows-dll-injection-basics.html https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms684175(v=vs.85).aspx https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms682583(v=vs.85).aspx https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms684320(v=vs.85).aspx https://msdn.microsoft.com/zh-tw/library/windows/desktop/aa366890(v=vs.85).aspx https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms681674(v=vs.85).aspx https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms682437(v=vs.85).aspx -- 我就看你們ppt多會嘴 法院見 我就看你們ptxt多會嘴 法院見 我就看你們ppt多會嘴 法院見 我就看你們ptt多會嘴 法院見 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.160.91.97 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1495236553.A.3BC.html ※ 編輯: vaio8937 (118.160.91.97), 05/20/2017 07:30:43 ※ 編輯: vaio8937 (118.160.91.97), 05/20/2017 07:51:37 ※ 編輯: vaio8937 (118.160.91.97), 05/20/2017 07:53:46 ※ 編輯: vaio8937 (118.160.91.97), 05/20/2017 08:25:12 ※ 編輯: vaio8937 (118.160.91.97), 05/20/2017 08:34:54 ※ 編輯: vaio8937 (118.160.91.97), 05/20/2017 08:38:11 ※ 編輯: vaio8937 (118.160.91.97), 05/20/2017 08:40:47 ※ 編輯: vaio8937 (118.160.91.97), 05/20/2017 08:43:21 ※ 編輯: vaio8937 (118.160.91.97), 05/20/2017 08:47:29

05/20 09:32, , 1F
由衷感謝大大這麼詳細的解說OAO
05/20 09:32, 1F

05/20 14:17, , 2F
05/20 14:17, 2F

05/20 14:33, , 3F
好文必推
05/20 14:33, 3F

05/20 14:58, , 4F
所以現在要接著injector這樣
05/20 14:58, 4F
對,Injector也是幫你做那四步。 昨天沒睡好,晚點把Injector的程式碼整理好再放上來 +ω+ ※ 編輯: vaio8937 (118.160.91.97), 05/20/2017 15:34:46 ※ 編輯: vaio8937 (118.160.91.97), 05/20/2017 15:36:46

05/20 15:51, , 5F
你慢慢來沒關係RRR!!!!!我今天也是碰不到電腦,
05/20 15:51, 5F

05/20 15:51, , 6F
只能在手機上查資料ps難怪那麼早起床XD
05/20 15:51, 6F

05/20 18:52, , 7F
第四步是讓宿主調用LoadLibrary來加載我們的DLL
05/20 18:52, 7F

05/21 18:09, , 8F
看到句柄差點以為你文章從對岸幹來的 XD
05/21 18:09, 8F

05/21 18:31, , 9F
玩這個在 Windows 7 以上很容易被 ASLR 整到,不過可以關
05/21 18:31, 9F
※ 編輯: vaio8937 (61.58.73.6), 05/22/2017 00:16:12 本來是想寫handle啦 但我有看過,國內前輩書上也是翻譯成句柄(Ex:王國榮VB6的書) 所以就參考前輩的翻譯 ASLR的話就比較麻煩,base address完全打亂 現在如果要玩DLL注入或buffer overflow,我會盡量用XP的VM ※ 編輯: vaio8937 (61.58.73.6), 05/22/2017 00:32:42 ※ 編輯: vaio8937 (61.58.73.6), 05/22/2017 00:33:59

05/23 00:49, , 10F
再次謝謝你QQ
05/23 00:49, 10F

05/23 20:28, , 11F
lua模組功能可以完全滿足你的需求(可以決定連哪個dll)
05/23 20:28, 11F
文章代碼(AID): #1P7t_9Ey (C_and_CPP)