精华内容
下载资源
问答
  • win32汇编实现dll远程注入。所谓DLL远程注入,就是强迫DLL程序运行在其他进程中,这样做的目的无非有两种:第一是伪装自身,第二是控制宿主。前者常见于病毒或木马,后者则一般用于正规之场合,比如常见的输入法、...
  • 控制台远程注入C++源码,支持32位,64位,含控制台和dll源码,通过控制台注入dll到远程进程。
  • 本文实例讲述了C++封装远程注入类CreateRemoteThreadEx的方法,分享给大家供大家参考。具体方法如下: 首先,类初始化时传入要注入的DLL文件名 只使用两个函数 代码如下:// 注入DLL到指定的地址空间 BOOL ...
  • 注入dll 远程注入方法

    2018-10-30 20:09:51
    远程注入简单实现,需要的可下载参考,很实用,很给力
  • DLL远程注入工具

    2017-10-20 21:02:20
    一个远程注入的工具用于实验用,有源码,有注视,新手可以借鉴
  • dll远程注入工具

    2017-02-08 15:28:15
    自己用的一个小工具,将dll注入到目标进程中,很方便,需要的同学下载使用以下(32BIT和64bit的进程均支持)
  • 易语言远程DLL注入源码,远程DLL注入,HookAPI,UnHookAPI,new_MoveWindow,HOOKAPI,ChangeAPIFristAddress,GetModuleHandle,GetProcAddress,VirtualQueryEx,VirtualProtectEx,WriteProcessMemory,GetCurrentProcess,...
  • 这个源码不用模块的!纯手工打造,还能学到东西
  • 远程注入查看被注入程序使用的dll,内含两个工程一个是要注入到进程的dll,另个是实施注入的控制台注入程序,实例简单
  • 简单易用的远程注入工具,也能用于驱动注入,支持dll拖拽,点击选择进程,无需手动输入pid
  • 远程注入源代码

    2015-04-04 13:09:41
    游戏外挂远程注入源代码,VC6.0开发 可以远程调用其他程序的函数
  • 最近的学习成果,APIHOOK远程注入与卸载功能的小工具
  • 远程注入的EasyHook

    2017-12-28 18:52:01
    EasyHook使用中的一种特殊情况: 需要实现这样一个功能,截获打开文件(CreateFile)和获取文件大小(GetFileSize)函数,且在打开文件时需要获取文件的大小,即在HookCreateFile中同时使用CreateFile和GetFileSize...
  • 本程序源码实现了64位远程注入dll功能,可以从进程列表里选择需要注入dll的程序,采用该源码思路可以实现ERP办公插件,本人用它实现了SAP凭证扫描制单,采购入库单扫描自动录单功能,非常好用。大大提升操作员工工作...
  • 易语言远程注入源码

    2015-10-10 14:46:49
    一款非常不错的易语言源码远程注入 源码 学习的号例子
  • VC6使用远程注入方法获取另一进程表单数据, LVITEMA LVITEM; LVITEM.mask=LVIF_TEXT; LVITEM.cchTextMax=512; LVITEM.pszText=pszText; char ItemBuf[512]; int nCount=::SendMessage(hDeskWnd,LVM_...
  • 远程注入小工具

    2014-05-28 11:19:39
    远程注入小工具CreateRemoteThread
  • 魔鬼作坊VIP模块例子:多进程远程注入dll
  • 本文转载自:https://blog.csdn.net/xuplus/article/details/36051337一、DLL注入DLL的远程注入技术是目前Win32病毒广泛使用的一种技术。使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将...

    本文转载自:

    https://blog.csdn.net/xuplus/article/details/36051337


    一、DLL注入

    DLL的远程注入技术是目前Win32病毒广泛使用的一种技术。使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将这个DLL加载至某些系统进程(如Explorer.exe)中运行。
    这样一来,普通的进程管理器就很难发现这种病毒了,而且即使发现了也很难清除,因为只要病毒寄生的进程不终止运行,那么这个DLL就不会在内存中卸载,
    用户也就无法在资源管理器中删除这个DLL文件,真可谓一箭双雕哉。记得2003年QQ尾巴病毒肆虐的时候,就已经有些尾巴病毒的变种在使用这种技术了。
    到了2004年初,我曾经尝试着仿真了一个QQ尾巴病毒,但独是跳过了DLL的远程加载技术。直到最近在学校论坛上看到了几位朋友在探讨这一技术,便忍不住将这一尘封已久的技术从我的记忆中拣了出来,以满足广大的技术爱好者们。
    在阅读本文之前,你需要了解以下几个API函数:

      ·OpenProcess - 用于打开要寄生的目标进程。

      ·VirtualAllocEx/VirtualFreeEx - 用于在目标进程中分配/释放内存空间。

      ·WriteProcessMemory - 用于在目标进程中写入要加载的DLL名称。

      ·CreateRemoteThread - 远程加载DLL的核心内容,用于控制目标进程调用API函数。

      ·LoadLibrary - 目标进程通过调用此函数来加载病毒DLL。

     在此我只给出了简要的函数说明,关于函数的详细功能和介绍请参阅MSDN。

    示例程序

      我将在以下的篇幅中用一个简单的示例Virus.exe来实现这一技术。这个示例的界面如下图:


    (1)首先运行Target.exe,这个文件是一个用Win32 Application向导生成的“Hello, World”程序,用来作为寄生的目标进程。

    (2)然后在界面的编辑控件中输入进程的名称“Target.exe”,单击“注入DLL”按钮,这时候Virus.exe就会将当前目录下的DLL.dll注入至Target.exe进程中。

    (3)在注入DLL.dll之后,你也可以单击“卸载DLL”来将已经注入的DLL卸载。

      模拟的病毒体DLL.dll

      这是一个简单的Win32 DLL程序,它仅由一个入口函数DllMain组成:

    [cpp]  view plain copy
    1. BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )  
    2. {  
    3.  switch ( fdwReason )  
    4.  {  
    5.   case DLL_PROCESS_ATTACH:  
    6.   {  
    7.    MessageBox( NULL, _T("DLL已进入目标进程。"), _T("信息"), MB_ICONINFORMATION );  
    8.   }  
    9.   break;  
    10.   case DLL_PROCESS_DETACH:  
    11.   {  
    12.    MessageBox( NULL, _T("DLL已从目标进程卸载。"), _T("信息"), MB_ICONINFORMATION );  
    13.   }  
    14.   break;  
    15.  }  
    16.  return TRUE;  
    17. }   


    如你所见,这里我在DLL被加载和卸载的时候调用了MessageBox,这是用来显示我的远程注入/卸载工作是否成功完成。而对于一个真正的病毒体来说,
    它往往就是处理DLL_PROCESS_ATTACH事件,在其中加入了启动病毒代码的部分:

    [cpp]  view plain copy
    1. case DLL_PROCESS_ATTACH:  
    2. {  
    3.  StartVirus();  
    4. }  
    5. break;   

    注入!
    现在要开始我们的注入工作了。首先,我们需要找到目标进程:

    [cpp]  view plain copy
    1. DWORD FindTarget(LPCTSTR lpszProcess)  
    2. {  
    3.  DWORD dwRet = 0;  
    4.  HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  
    5.  PROCESSENTRY32 pe32;  
    6.  pe32.dwSize = sizeof( PROCESSENTRY32 );  
    7.  Process32First(hSnapshot, &pe32);  
    8.  do  
    9.  {  
    10.   if ( lstrcmpi(pe32.szExeFile, lpszProcess) == 0 )  
    11.   {  
    12.    dwRet = pe32.th32ProcessID;  
    13.    break;  
    14.   }  
    15.  } while (Process32Next(hSnapshot, &pe32));  
    16.  CloseHandle( hSnapshot );  
    17.  return dwRet;  
    18. }   


    这里我使用了Tool Help函数库,当然如果你是NT系统的话,也可以选择PSAPI函数库。
    这段代码的目的就是通过给定的进程名称来在当前系统中查找相应的进程,并返回该进程的ID。得到进程ID后,就可以调用OpenProcess来打开目标进程了:

    [cpp]  view plain copy
    1. // 打开目标进程  
    2. HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION |  
    3.  PROCESS_VM_WRITE, FALSE, dwProcessID );   


    现在有必要说一下OpenProcess第一个参数所指定的三种权限。在Win32系统下,每个进程都拥有自己的4G虚拟地址空间,各个进程之间都相互独立。如果一个进程需要完成跨进程的工作的话,那么它必须拥有目标进程的相应操作权限。

    在这里,PROCESS_CREATE_THREAD表示我可以通过返回的进程句柄在该进程中创建新的线程,也就是调用CreateRemoteThread的权限;

    同理,PROCESS_VM_OPERATION则表示在该进程中分配/释放内存的权限,也就是调用VirtualAllocEx/VirtualFreeEx的权限;
    PROCESS_VM_WRITE表示可以向该进程的地址空间写入数据,也就是调用WriteProcessMemory的权限。

    至此目标进程已经打开,那么我们该如何来将DLL注入其中呢?在这之前,我请你看一行代码,是如何在本进程内显式加载DLL的:

    [cpp]  view plain copy
    1. HMODULE hDll = LoadLibrary( "DLL.dll" );   

    那么,如果能控制目标进程调用LoadLibrary,不就可以完成DLL的远程注入了么?的确是这样,我们可以通过CreateRemoteThread将LoadLibrary作为目标进程的一个线程来启动,这样就可以完成“控制目标进程调用LoadLibrary”的工作了。到这里,也许你会想当然地写下类似这样的代码:

    [cpp]  view plain copy
    1. DWORD dwID;  
    2. LPVOID pFunc = LoadLibraryA;  
    3. HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0,  
    4.  (LPTHREAD_START_ROUTINE)pFunc,   
    5. (LPVOID)"DLL.dll", 0, &dwID );   


    不过结果肯定会让你大失所望——注入DLL失败!

    那么现在让我们来分析一下失败的原因吧。我是前说过,在Win32系统下,每个进程都拥有自己的4G虚拟地址空间,各个进程之间都是相互独立的。在这里,我们当作参数传入的字符串"DLL.dll"其实是一个数值,它表示这个字符串位于Virus.exe地址空间之中的地址,而这个地址在传给Target.exe之后,它指向的东西就失去了有效性。

    举个例子来说,譬如A、B两栋大楼,我住在A楼的401;
    那么B楼的401住的是谁我当然不能确定——也就是401这个门牌号在B楼失去了有效性,而且如果我想要入住B楼的话,
    我就必须请B楼的楼长为我在B楼中安排新的住处(当然这个新的住处是否401也就不一定了)。

      由此看来,我就需要做这么一系列略显繁杂的手续——

    首先在Target.exe目标进程中分配一段内存空间;
    然后向这段空间写入我要加载的DLL名称;

    最后再调用CreateRemoteThread。

    这段代码就成了这样:

    [cpp]  view plain copy
    1. // 向目标进程地址空间写入DLL名称  
    2. DWORD dwSize, dwWritten;  
    3. dwSize = lstrlenA( lpszDll ) + 1;  
    4. LPVOID lpBuf = VirtualAllocEx( hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE );  
    5. if ( NULL == lpBuf )  
    6. {  
    7.  CloseHandle( hProcess );  
    8.  // 失败处理  
    9. }  
    10. if ( WriteProcessMemory( hProcess, lpBuf, (LPVOID)lpszDll, dwSize, &dwWritten ) )  
    11. {  
    12.  // 要写入字节数与实际写入字节数不相等,仍属失败  
    13.  if ( dwWritten != dwSize )  
    14.  {  
    15.   VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );  
    16.   CloseHandle( hProcess );  
    17.   // 失败处理  
    18.  }  
    19. }  
    20. else  
    21. {  
    22.  CloseHandle( hProcess );  
    23.  // 失败处理  
    24. }  
    25. // 使目标进程调用LoadLibrary,加载DLL  
    26. DWORD dwID;  
    27. LPVOID pFunc = LoadLibraryA;  
    28. HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0,   
    29. (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, &dwID );   


    需要说的有两点:

    第一,由于我要在目标进程中为ANSI字符串来分配内存空间,所以这里凡是和目标进程相关的部分,都明确使用了后缀为“A”的API函数——当然,如果要使用Unicode字符串的话,可以换作后缀是“W”的API;
    第二,在这里LoadLibrary的指针我是取的本进程的LoadLibraryA的地址,这是因为LoadLibraryA/LoadLibraryW位于kernel32.dll之中,
    而Win32下每个应用程序都会把kernel32.dll加载到进程地址空间中一个固定的地址,所以这里的函数地址在Target.exe中也是有效的。
    在调用LoadLibrary完毕之后,我们就可以做收尾工作了:

    [cpp]  view plain copy
    1. // 等待LoadLibrary加载完毕  
    2. WaitForSingleObject( hThread, INFINITE );  
    3. // 释放目标进程中申请的空间  
    4. VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );  
    5. CloseHandle( hThread );  
    6. CloseHandle( hProcess );   


    在此解释一下WaitForSingleObject一句。由于我们是通过CreateRemoteThread在目标进程中另外开辟了一个LoadLibrary的线程,所以我们必须等待这个线程运行完毕才能够释放那段先前申请的内存。

    好了,现在你可以尝试着整理这些代码并编译运行。运行Target.exe,然后开启一个有模块查看功能的进程查看工具(在这里我使用我的July)来查看Target.exe的模块,
    你会发现在注入DLL之前,Target.exe中并没有DLL.dll的存在:

     在调用了注入代码之后,DLL.dll就位于Target.exe的模块列表之中了:

    二、矛盾相生(解毒)

    1、法一:与DLL注入过程类似

    记得2004年初我将QQ尾巴病毒成功仿真后,有很多网友询问我如何才能杀毒,不过我都没有回答——因为当时我研究的重点并非病毒的寄生特性。这一寄生特性直到今天可以说我才仿真完毕,那么,我就将解毒的方法也一并公开吧。

    和DLL的注入过程类似,只不过在这里使用了两个API:GetModuleHandle和FreeLibrary。出于篇幅考虑,我略去了与注入部分相似或相同的代码:

    [cpp]  view plain copy
    1. // 使目标进程调用GetModuleHandle,获得DLL在目标进程中的句柄  
    2. DWORD dwHandle, dwID;  
    3. LPVOID pFunc = GetModuleHandleA;  
    4. HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)  
    5. pFunc, lpBuf, 0, &dwID );  
    6. // 等待GetModuleHandle运行完毕  
    7. WaitForSingleObject( hThread, INFINITE );  
    8. // 获得GetModuleHandle的返回值  
    9. GetExitCodeThread( hThread, &dwHandle );  
    10. // 释放目标进程中申请的空间  
    11. VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );  
    12. CloseHandle( hThread );  
    13. // 使目标进程调用FreeLibrary,卸载DLL  
    14. pFunc = FreeLibrary;  
    15. hThread = CreateRemoteThread( hProcess, NULL, 0,  
    16.  (LPTHREAD_START_ROUTINE)pFunc,  
    17.  (LPVOID)dwHandle, 0, &dwID );  
    18. // 等待FreeLibrary卸载完毕  
    19. WaitForSingleObject( hThread, INFINITE );  
    20. CloseHandle( hThread );  
    21. CloseHandle( hProcess );   

    用这个方法可以卸载一个进程中的DLL模块,当然包括那些非病毒体的DLL。所以,这段代码还是谨慎使用为好

    在完成卸载之后,如果没有别的程序加载这个DLL,你就可以将它删除了。

    2、法二:采用查杀工具

    2、1.安装木马查杀工具。对于多数人而言,要想通过手工查杀DLL木马是不太现实的,因此安装一款可以查杀此类木马的反病毒软件,是非常有必要的。这里还要提醒读者的是,应及时升级病毒数据库,这样才能保证有效地查杀绝大部分木马病毒。当然,我们也可以在计算机中安装那些专门针对木马的查杀工具,例如木马克星。

    2、2.查看是否有不明端口开放以及对端口通信进行监控。只要木马进行连接,接受/发送数据则必然会打开端口,DLL木马也不例外,我们可以通过“Netstat-ano”命令来查看TCP/UDP端口的连接,以及开放端口的进程标识符;

    也可以直接使用进程端口查看工具Fport.exe来查看与端口对应的进程,以发现是否有不明的连接和端口开放。另外,有些DLL木马通过端口劫持或者端口重用的方法来进行通信,所以仅是查看端口还是不够的,有必要的话,我们可使用嗅探器来了解打开的端口到底在传输些什么数据。

    2、3.检查系统目录下是否有可疑的DLL文件。安装好系统和所有应用程序之后,可对系统目录下System32文件夹中的EXE和DLL文件作一记录:在命令提示符下执行“dir*.exe>bak1.txt&dir*.dll>bak2.txt”,将所有的EXE和DLL文件信息导出成TXT文件保存。当日后发现异常时,可以使用相同的命令再次备份,并使用FC命令比较两次的EXE文件和DLL文件。通过这种方法,我们可以发现可疑的EXE和DLL文件,同时通过文件的大小、创建时间来判断是否为DLL木马。

    2、4.查看系统进程调用的DLL文件。当我们怀疑有DLL木马插入到系统进程,可以使用一些第三方进程工具来查看进程所调用的DLL文件,然后进一步确认是否中了DLL木马。此类查看工具有进程猎手、进程间谍等等。另外,我们也可以使用XP系统自带的命令行工具TaskList,来显示进程调用的DLL文件,并将这些信息导出成TXT文件保存,以便随时进行比较。


    但我们就要利用这种木马 因为他比较难查杀 所以\~~~~~~~~~~~~~~

    3、法三:找出寄生的EXE

    警报,病毒无法清除

    如果系统中被植入了DLL木马,将会出现什么情况呢?

    首先,系统被黑客远程控制,出现数据丢失等情况;其次,杀毒软件会报警系统中有病毒,但是却无法进行清除。例如,在电脑中运行了上面制作的上兴远控木马后,笔者电脑上安装的杀毒软件提示发现病毒,但是在删除DLL病毒文件时却失败了。即使我们手工删除病毒文件,也会因为DLL文件正在使用中,所以也无法彻底删除。即使进入安全模式,得到的也是同样的结果。
    另外,由于DLL木马是插入到系统进程中的,因此通过任务管理器等进程工具,也无法发现任何木马进程,这给木马的清除带来了很大的困难!
    无法删除病毒文件,无法查找到木马进程,那么到底该如何清除DLL注入式木马呢?

    无所遁形,揪出木马藏身之所

    虽然木马没有自己的进程,但是有一个宿主进程,只要结束宿主进程,停止DLL文件的调用,就可以删除DLL文件,进而清除木马。因此,清除DLL木马的第一步,就是找到木马注入的宿主进程。那么,如何才能找到木马注入的宿主进程呢?且让我们细细看来。

    以清除“上兴远控木马”为例,从杀毒软件的报警提示中已经知道木马DLL文件名为“rejoice.dll”。因此,就可以通过一些查看进程调用DLL文件的进程管理工具,找到该文件的宿主进程,此类工具很多,比如大名鼎鼎的ICESword

    运行IceSword后,点击左侧边栏“查看→进程”,就可以在其右侧窗口中看到所有进程列表。右键点击某进程,在弹出菜单中选择“模块信息”命令,即可看到该进程调用的所有DLL文件。


    提示:DLL注入式木马通常是将DLL文件,加载到explorer.exe、svchost.exe、winlogon.exe、iexplore.exe等系统进程中的。因此在查找DLL宿主文件时,可以关闭其它无关的程序,然后依次检查这几个进程中的DLL文件。

    不过一个一个的检查系统进程,确实有些麻烦,如何才能快速的定位木马的宿主进程呢?可以使用一款名为“procexp”的进程管理工具。运行procexp后,在程序界面中间显示的是树状进程关系列表,下方是每个进程的详细信息。点击菜单“Find→Find DLL”命令,打开DLL文件查找对话框,在“DLL Substring”中输入要查找的关键词,这里输入刚才杀毒软件扫描出的DLL文件名“rejoice.dll”。然后点击“Search”按钮,在下方的列表中就可以看到该DLL文件是被哪个进程调用的了。


    牛刀小试,清除普通进程DLL注入木马

    对于大部分DLL注入木马,其注入到“iexplore.exe”和“explorer.exe”这两个进程。对于这类普通进程的DLL木马,清除将是非常方便的。

    如果DLL文件是注入到“iexplore.exe”进程中,由于此进程就是IE浏览器进程,因此就需要先关掉所有IE窗口和相关程序,然后直接找到DLL文件进行删除就可以了。

    如果DLL文件是注入到“explorer.exe”进程中,那么就略显麻烦一些。由于此进程用于显示桌面和资源管理器,因此,当通过任务管理器结束掉“explorer.exe”进程时,桌面无法看到,桌面上所有图标消失掉,"我的电脑"、"网上邻居"等所有图标都不见了,同时,也无法打开资源管理器找到木马文件进行删除。怎么办呢?

    实际上,解决的方法也很简单。在任务管理器中点击菜单“文件→新任务运行”,打开“创建新任务”对话框,点击“浏览”按钮,通过浏览对话框就可以打开DLL文件所在的路径。然后选择“文件类型”为“所有文件”,即可显示并删除DLL文件了。


    在浏览对话框中删除DLL文件

    除恶务尽,清除特殊DLL注入木马

    除了以上所说的注入普通进程的DLL木马之外,还有许多木马注入到系统里关键进程中,比如svchost.exe、smss.exe、winlogon.exe进程。这些进程使用普通方式无法结束,使用特殊工具结束掉进程后,却又很可能造成系统崩溃无法正常运行的情况。对于这些木马,我们可以通过以下两种方法进行清除。

    1.使用IceSword卸载DLL文件

    IceSword的功能十分强大,我们曾在以前作过介绍,在这里,就可以利用它卸载掉已经插入到正在运行的系统进程中的DLL文件。在IceSword的进程列表显示窗口中,右键点击DLL木马宿主进程,选择弹出命令“模块信息”。在进程模块信息对话框中找到DLL木马文件,选择文件后点击“强制解除”命令,即可将系统进程中的DLL木马文件卸载掉了


    卸载系统进程中的DLL木马

    4、法四:定时枚举,发现不是本身所用的就强制Free掉

    防止DLL注入我用的是另一种方法:

    //允许的模块列表
    theApp.m_szAuthorizedList = " USER32.DLL RPCRT4.DLL KERNEL32.DLL GDI32.DLL ADVAPI32.DLL NTDLL.DLL MSVCRT.DLL SETUPAPI.DLL CFGMGR32.DLL WINMM.DLL SHELL32.DLL SHLWAPI.DLL MSVCR80.DLL MFC80.DLL OLE32.DLL COMCTL32.DLL OLEACC.DLL OLEAUT32.DLL ATL80.DLL MSVCM80.DLL MFC80CHS.DLL MSVCP80.DLL MFCM80.DLL MFCM80U.DLL MFC80U.DLL VCOMP.DLL SECUR32.DLL MSVCRT.DLL MSVCP60.DLL MFC60.DLL ";

    然后定时枚举系统进程,找到自己进程本身并分析所加载的模块,发现不是本身所用的就强制FREE掉:

    [cpp]  view plain copy
    1. do  
    2. {  
    3.     if(!IsModuleAuthorized(me32.szModule))  
    4.     {  
    5.         HMODULE hmodule = me32.hModule;  
    6.         CloseHandle(hModuleSnap);    
    7.         FreeLibrary(hmodule);  
    8.         //发现可疑模块并已移除  
    9.         return;  
    10.     }  
    11. }  

     

    5、法五: 拦截自身LoadLibraryExW 这个函数吧  

    如果仅仅只是防御 远程线程 你可以按下面这样做  :

    (1)在程序初始化时把自身程序的所有线程ID 用个ULONG 数组保存起来   
    并动态维护这个ULONG数组 这个也是多线程程序所必需的吧 如果是单线程就更方便了
    (2)然后 在LoadLibraryExW假函数里做一个判断   
    判断当前的操作线程是否为自身程序原有的线程 如果不是 就是远程线程了   

    [cpp]  view plain copy
    1. ULONG __stdcall Fake_LoadLibraryExW(LPCWSTR lpwLibFileName,HANDLE hFile,DWORD dwFlags)     
    2. {  
    3.     ULONG TID=GetCurrentThreadId();  
    4.     //把这个TID 循环对比一下 是否存在于自身TID 数组     
    5.   
    6.   
    7.     if (flag)//存在则 通过     
    8.     {  
    9.         return MyReal_LoadLibraryExW(lpwLibFileName,hFile,dwFlags);  
    10.     }  
    11.     else  
    12.     {  
    13.         return FALSE;  
    14.     }  
    15. }  




    (4)上面的方法可以防止远程线程 在自身程序加载DLL ,但还有个问题 值得注意
    WINDOWS的 SetWindowsHookEx (设GUI全局钩子) 这个函数,因为他是切换到进程上下文 使用程序自身线程来加载DLL的 所以不能用判断TID的方法来判断了  

    这里再提供二个思路   

    (4、1)一个是 判断当前加载 的DLL 是否有WINDOWS签名 是则放行 否则拦截 (稍微有点费时 但非常安全)

    (4、2)在一个是 判断路径  
    系统加载DLL时是不会包含DLL路径的直接是类似“kernel32.dll” 这样的   
    所以,可以判断当前路径是否包含路径分割符,是则拦截 否则放行 (速度快 安全性较高)


    结合上面三种方法 自己写个规则来决定拦截与否吧
    比直接定义模块名 兼容性高多了 也方便多了   

    三、如何防止自己制作的DLL远程注入被查杀
    展开全文
  • DLL的远程注入与远程卸载卸载 涉及Windows API FindWindow GetWindowThreadProcessId OpenProcess VirtualAlloc WriteProcessMemory CreateRemoteThread WaitForSingleObject 有时候修改目标程序,如制作插件,...

    DLL的远程注入与远程卸载卸载

    涉及Windows API

    • FindWindow
    • GetWindowThreadProcessId
    • OpenProcess
    • VirtualAlloc
    • WriteProcessMemory
    • CreateRemoteThread
    • WaitForSingleObject

    有时候修改目标程序,如制作插件,补丁,外挂等,需要使用到DLL注入的操作,注入的方式主要有远程注入、劫持注入、HOOK方式、内存注入等,这里主要说一下远程注入以及远程卸载

    远程注入

    什么是远程注入:

    • 远程注入是指一个进程在另一个进程中创建线程的技术

    远程注入的步骤

    1. 找到目标进程
    2. 向目标进程中划分内存空间
    3. 写入待注入的DLL路径
    4. 远程调用DLL加载函数(LoadLibrary)加载DLL,实现远程注入

    运行实例:
    ![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvOTk4MjQ5LzE1ODk4MTU1ODk1MzctNTI0MWU2ZjgtODA1ZC00MDg1LThkNjgtMzE4ZjEzZjY4MWVlLnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=1021&margin=[object Object]&name=image.png&originHeight=1021&originWidth=1302&size=410314&status=done&style=none&width=1302)
    [运行远程注入.exe 后向目标程序注入DLL,并且在DLL注入成功后弹出对话框]
    具体实现代码:

    // DLL 远程注入.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <Windows.h>
    
    
    HANDLE getTarProcessHandle()
    {
    	HWND hWnd = FindWindowA(NULL, "FindWindowExTest");
    	if (hWnd)
    	{
    		DWORD dwProcessId;
    		if (GetWindowThreadProcessId(hWnd, &dwProcessId))
    		{
    			HANDLE hd = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
    			return hd;
    		}
    	}
    	return 0;
    }
    
    BOOL injectDll()
    {
    	char moudlePath[256] = "D:\\c_work\\DLL远程注入与远程卸载\\Debug\\DLL.dll";
    	if (strlen(moudlePath) != 0)
    	{
    		HANDLE hd = getTarProcessHandle();
    		if (hd)
    		{
    			// 划分内存空间
    			DWORD dwAddr = (DWORD)VirtualAllocEx(hd, 0, 256, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    			// 写入
    			BOOL bl = WriteProcessMemory(hd, (LPVOID)dwAddr, moudlePath, strlen(moudlePath) + 1, NULL);
    			if (bl)
    			{
    				// 执行
    				HANDLE hd1 = ::CreateRemoteThread(hd, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryA, (LPVOID)dwAddr, 0, 0);
    				// 等待线程执行完成
    				WaitForSingleObject(hd1, 0xFFFFFFFF);
    				// 关闭线程
    				CloseHandle(hd1);
    				// 释放进程
    				VirtualFreeEx(hd, (LPVOID)dwAddr, 256, MEM_DECOMMIT);
    				// 关闭句柄
    				CloseHandle(hd);
    				return TRUE;
    			}
    
    		}
    
    	}
    
    	return FALSE;
    }
    
    
    int main()
    {
    	injectDll();
    	getchar();
    }
    
    

    远程卸载

    运行效果
    ![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvOTk4MjQ5LzE1ODk4MTYzMDM0MzMtN2U4NGFiYWUtYWVmMi00OWYxLTlkZTMtZDdlZDMyNzFkMTM1LnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=1059&margin=[object Object]&name=image.png&originHeight=1059&originWidth=973&size=355766&status=done&style=none&width=973)
    远程卸载与远程注入操作类似,其原理是远程调用FreeLibrary 函数,这里就直接贴出代码

    
    // DLL远程卸载.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <iostream>
    #include <Windows.h>
    using namespace std;
    
    HANDLE getTarProcessHandle()
    {
    	HWND hWnd = FindWindowA(NULL, "FindWindowExTest");
    	if (hWnd)
    	{
    		DWORD dwProcessId;
    		if (GetWindowThreadProcessId(hWnd, &dwProcessId))
    		{
    			HANDLE hd = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
    			return hd;
    		}
    	}
    	return 0;
    }
    
    BOOL UninjectDll()
    {
    	char moudlePath[256] = "D:\\c_work\\DLL远程注入与远程卸载\\Debug\\DLL.dll";
    	if (strlen(moudlePath) != 0)
    	{
    		HANDLE hd = getTarProcessHandle();
    		if (hd)
    		{
    			// 划分内存空间
    			DWORD dwAddr = (DWORD)VirtualAllocEx(hd, 0, 256, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    			// 写入
    			BOOL bl = WriteProcessMemory(hd, (LPVOID)dwAddr, moudlePath, strlen(moudlePath) + 1, NULL);
    			if (bl)
    			{
    				// 执行
    				HANDLE hd1 = ::CreateRemoteThread(hd, NULL, NULL, (LPTHREAD_START_ROUTINE)GetModuleHandleA, (LPVOID)dwAddr, 0, 0);
    				// 等待线程执行完成
    				WaitForSingleObject(hd1, 0xFFFFFFFF);
    				DWORD dwHandle = 0;
    				// 获得GetModuleHandle的返回值   FreeLibrary() 所需参数
    				GetExitCodeThread(hd1, &dwHandle);
    				// 释放进程
    				VirtualFreeEx(hd, (LPVOID)dwAddr, 256, MEM_DECOMMIT);
    				cout << "结果:" <<dwHandle << endl;
    				dwAddr = (DWORD)VirtualAllocEx(hd, 0, 256, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    				CloseHandle(hd1);
    				// 使目标进程调用FreeLibrary,卸载DLL
    				hd1 = CreateRemoteThread(hd, NULL, 0, (LPTHREAD_START_ROUTINE)FreeLibrary, (LPVOID)dwHandle, 0, 0);
    				
    				// 等待线程执行完成
    				WaitForSingleObject(hd1, 0xFFFFFFFF);
    				// 关闭线程
    				CloseHandle(hd1);
    				// 释放进程
    				VirtualFreeEx(hd, (LPVOID)dwAddr, 256, MEM_DECOMMIT);
    				// 关闭句柄
    				CloseHandle(hd);
    				return TRUE;
    			}
    
    		}
    
    	}
    
    	return FALSE;
    }
    
    int main()
    {
    	UninjectDll();
    	getchar();
    }
    
    

    当然,上述是一种思路,另外还有一种思路,主要是基于通信实现,即exe 向目标进程的DLL发送一个消息(WM_COPYDATA),DLL使用HOOK 捕获到消息,并在DLL内部进行释放操作,这里我贴出核心代码

    • exe 端

    ![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvOTk4MjQ5LzE1ODk4MTY1MTk0NDktNzM4ZTE0NTMtMTZhMC00Y2MxLWJmNGEtZGI3MDBiZWNkZDk2LnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=325&margin=[object Object]&name=image.png&originHeight=325&originWidth=805&size=34952&status=done&style=none&width=805)

    注:
    1、这里只能使用SendMessage,不能使用PostMessage,因为需要模态(阻塞的模式)去处理消息事件
    2、发送WM_COPYDATA 消息时,sendMessage参数构成:
    sendMessage(接收窗口句柄, WM_COPYDATA, 发送窗口的句柄, copyData 结构体指针);
    WM_COPYDATA
    wParam = (WPARAM) (HWND) hwnd; // handle of sending window
    lParam = (LPARAM) (PCOPYDATASTRUCT) pcds; // pointer to structure with data


    copyData 结构体
    typedef struct tagCOPYDATASTRUCT { // cds
    DWORD dwData; // 任意数值
    DWORD cbData; // 缓冲区大小
    PVOID lpData; // 缓冲区(任意结构)
    } COPYDATASTRUCT;

    • DLL 端

    ![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvOTk4MjQ5LzE1ODk4MTY0NjgyNzYtYzJlM2UyYTMtZGRlZC00ZDIwLWI5YzAtZWQzZjBiZGM4MzllLnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=585&margin=[object Object]&name=image.png&originHeight=585&originWidth=966&size=78095&status=done&style=none&width=966)

    展开全文
  • 这这个资源我自己没有看懂,需要大家来看看,看的不是很明白就是了
  • 远程注入dll

    2016-08-23 17:22:14
    运行Project1.exe 程序 用CreateRemoteThread 函数 将dll远程注入到其它进程 提供3种远程注入方式 1.通过程序名远程注入dll 2.通过PID远程注入DLL 3.通过窗口名远程注入DLL 在程序注入成功后,dll会在 'D:\...
  • [分享]云注入:远程注入控制器!

    千次阅读 2021-06-07 17:47:49
    云注入:远程注入控制器!给大家推荐一款黑科技软件,可以直接在未加密的APP上加入你自己的远程控制器!点我下载官网地址:http://www.cloud-inject.com这意味着什么?就是可以直接在后台更新“公告/版本更新/注册机...

    云注入:远程注入控制器!

    给大家推荐一款黑科技软件,可以直接在未加密的APP上加入你自己的远程控制器!

    45252a5c25b1751d8dcdd46ff851f019.png

    点我下载

    官网地址:http://www.cloud-inject.com

    这意味着什么?就是可以直接在后台更新“公告/版本更新/注册机/检测安装和未安装的应用/远程启动图”相当于变成了自己的软件,在后台随意控制开关,而且还可以查看软件使用情况,最重要的是,不!收!费!

    d35f8f4f2275368ff8c5403cd9ed420b.png

    软件里面支持的功能较多,下面是测试的截图,成功啦,可以加弹窗,弹窗里面支持按钮跳转qq群,浏览器分享等...支持添加注册机,添加之后用户需要卡密才可以实用软件,而卡密只有你可以生成

    76c6e82847392757718f772cedb31219.png

    可以后台设置开关,也就是说你想让他什么时候弹出来就什么时候弹出来~支持远程升级应用,设置强制更新和不强制,强制更新就是不能用啦,不强制就差不多等于一个公告..

    0265e9290855ed8186beafd8478cca1d.png

    1af4875c190c9a6ea66014a436cb044b.png

    下载链接http://www.cloud-inject.com/introduce.html?track_code=16609

    文章作者:小淘君(感谢^_^)

    展开全文
  • 易语言远程线程注入源码,远程线程注入,复制共享数据,输出,GetMsgProc,GetMsgHookOn,GetMsgHookOff,ThreadPro,WriteScreen,Int2Hex,api_UnhookWindowsHookEx,api_SetWindowsHookExA,api_LoadLibraryA,api_...
  • VB的远程注入

    2013-11-10 11:04:10
    一个从pudn上得来的,稍微修改就可进行实际应用。 仅仅实现注入及卸载,没别的功能。请注意甄别。
  • 远程注入

    2011-11-09 23:44:58
    远程注入器 实现远程注入游戏 远程注入
  • VB6.0源码下载 用OpenProcess注入exe或dll远程注入 VB实例源码 学习用的。请不要拿这些技术去害人哦。
  • 远程注入 实例源码

    2012-12-21 15:23:10
    如今远线程注入已经是泛滥成灾,杀毒软件对于远程线程已经做了检查和警示。...此代码对初学者了解远程注入起到学习的作用。 远程注入方式: 使用CreateRemoteThread注入 使用apc QueueUserApc方式
  • 1:@Reference注入的时候导错了包,一定要导入alibaba的包 import com.alibaba.dubbo.config.annotation.Reference; 2:@Service远程调用的时候导错了包,也要使用alibaba的包 import ...

    原因如下
    1:@Reference注入的时候导错了包,一定要导入alibaba的包

    import com.alibaba.dubbo.config.annotation.Reference;
    

    2:@Service远程调用的时候导错了包,也要使用alibaba的包

    import com.alibaba.dubbo.config.annotation.Service;
    

    同时@Service后还要指定service层对应的接口包

    @Service(interfaceClass = CheckItemService.class)
    

    3:Service调用Dao层的时候配置出现了错误,由于是接口映射,在配置文件中,配置文件名要对应Dao层接口的名字,同时存放的位置也要在接口文件所在目录,Resource中的话需要创建同级目录存放;

    <mapper namespace="com.ithu.dao.CheckItemDao">
    

    方法名要对应mapper文件中id的名字;这里如果导包失败整个Service都无法启用所以出现null报空指针;

    4:配置bubbo的时候,扫包出现了错误,扫描不到需要的包
    服务消费者扫包配置:

     <!-- 指定应用名称 -->
        <dubbo:application name="health_backend" />
        <!--指定服务注册中心地址-->
        <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
        <!--批量扫描-->
        <dubbo:annotation package="com.ithu.controller" />
    

    服务生产者扫包配置:
    <dubbo:application name="health_service_provider"/>
        <!--指定暴露服务的端口,如果不指定默认为20880-->
        <dubbo:protocol name="dubbo" port="20887"/>
        <!--指定服务注册中心地址-->
        <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
        <!--批量扫描,发布服务-->
        <dubbo:annotation package="com.ithu.service"/>
    

    5:dubbo的配置文件中使用了linux的缓存存放地址,需要改成对应的,测试时使用pc端地址; 找到zookeeper的目录conf下的配置文件zoo.cfg
    dataDir=D:/apache-zookeeper-3.5.6-bin/data
    

    修改为pc本地目录

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,630
精华内容 33,052
关键字:

远程注入

友情链接: 课件.zip