精华内容
下载资源
问答
  • 2020-11-23(dll注入方法)

    2020-11-23 23:21:00
    一般情况下有如下dll注入方法:   1.修改注册表来注入dll;  2.使用CreateRemoteThread函数对运行中的进程注入dll;  3.使用SetWindowsHookEx函数对应用程序挂钩(HOOK)迫使程序加载dll;  4.替换应用程序一定会...

    一般情况下有如下dll注入方法:    
        1.修改注册表来注入dll;
        2.使用CreateRemoteThread函数对运行中的进程注入dll;
        3.使用SetWindowsHookEx函数对应用程序挂钩(HOOK)迫使程序加载dll;
        4.替换应用程序一定会使用的dll;
        5.把dll作为调试器来注入;
        6.用CreateProcess对子进程注入dll;
        7.修改被注入进程的exe的导入地址表。

    展开全文
  • DLL注入方法小结

    2012-12-11 12:31:00
    //DLL注入到进程中,是当前游戏外挂常使用的一种作弊方式,因此在这里先和大家交流一下DLL的注入方法,在以后的文章中还会和大家讨论一下如何拦截:DLL的注入方法总结:1.使用远程线程2.hook的方式一、 远程线程注入...

    远程注入的源码:

    http://files.cnblogs.com/shadow-lei/Injector1.1.zip

    //DLL注入到进程中,是当前游戏外挂常使用的一种作弊方式,因此在这里先和大家交流一下DLL的注入方法,在以后的文章中还会和大家讨论一下如何拦截:
    DLL的注入方法总结:
    1.使用远程线程
    2.hook的方式
    一、 远程线程注入
    1. 想要把自己的DLL注入到目标进程中,需要获取目标进程的句柄,因此,我们就需要提高我们自己注入工具的权限,否则获取不到目标进程的句柄,下面是提高权限的方法:

     1 bool enableDebugPriv() 
     2 { 
     3     HANDLE hToken; 
     4     LUID sedebugnameValue; 
     5     TOKEN_PRIVILEGES tkp; 
     6 
     7     if (!OpenProcessToken(GetCurrentProcess(), 
     8         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
     9     { 
    10         return false; 
    11     } 
    12     if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME,  &sedebugnameValue)) 
    13     { 
    14         CloseHandle(hToken); 
    15         return false; 
    16     } 
    17     tkp.PrivilegeCount = 1; 
    18     tkp.Privileges[0].Luid = sedebugnameValue; 
    19     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    20     if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) 
    21    { 
    22         CloseHandle(hToken); 
    23         return false; 
    24     } 
    25     return true; 
    26 }    

    2. 获取目标进程句柄
    OpenProcess(权限类型,是否可被持续,过程ID):功能:返回目标过程句柄
    OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);

    3. 在目标进程中分配内存,来存储我们要注入的DLL路径:
      VirtualAllocEx(hProcess, NULL, strlen(Path), PAGE_READWRITE);

      //VirtualAllocEx()函数功能:为制订的过程分派虚拟地址
      //参1:要分派的过程句柄
      //参2:要分派的虚拟地址的地位,0默示,主动分派地位
      //参3:分派的大小
      //参4:MEM_COMMIT默示,分派物理内存或者页面内存,并且初始化内存为0
      //参5:存储选项:PAGE_READWRITE默示可以在页面内存中 “读写”
      //返回值:若是分派内存成功,则返回分派内存的地址,若是分派失败则返回NULL,调用GetLastError()查看错误原因

    4. 在目标进程中上面分配的内存中,写入DLL的路径:
      4.1 WriteProcessMemory(hProcess, pszLibFileRemote, (PVOID)pszLibFile, strlen(Path), NULL)

      //WriteProcessMemory()函数功能:在制订过程中写入内存
      //参1:写入过程的句柄
      //参2:写入内存的,必须是已经创建的地址,比如上方用VirtualAllocEx()在过程中创建的内存地址
      //参3:写入内存中的数据内容的缓存
      //参4:写入数据大小
      //参5:一个选项,0默示忽视
      //返回值: 非0值默示成功, 返回0则默示写入错误。调用GetLastError()查看错误原因

      有时会读写失败,有可能是因为内存块的保护权限,因此需要修改内存块的保护权限,在写入成功之后,要还原刚才修改的权限
      VirtualProtectEx(hProcess, pszLibFileRemote, strlen(Path), PAGE_EXECUTE_READWRITE, &dwOld);
      WriteProcessMemory(hProcess,  pszLibFileRemote, Path, strlen(Path), NULL);
      VirtualProtectEx(hProcess, pszLibFileRemote, strlen(Path), dwOld, &dwOld);
      VirtualFreeEx(hProcess, pszLibFileRemote, strlen(Path), MEM_RELEASE);

    5. 获取LoadLibrary()函数地址,因为要用他来动态加载DLL,该函数在kernel32.dll文件中
      PROC AdrMyDllDir=(PROC)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryW");
      //W代表UNICODE版本,说实话,A代表多字节字符集

    6. 创建远程线程
    CreateRemoteThread(hProcess,NULL, NULL, (LPTHREAD_START_ROUTINE)AdrMyDllDir(LPVOID)LoadString, NULL, NULL);
    这里的AdrMyDllDir存放LoadLibraryW ,也就是说把LoadLibraryW当做线程处理惩罚函数,传入的参数bufRemote存放的是目标DLL文件的地址。

    二、下面讲解一下如何用hook既钩子注入DLL文件。
    所谓hook,既钩子。hook会在应用程序接到消息之前,阻碍应用程序的信息,比如鼠标键盘钩子会阻碍一个应用程序的鼠标键盘信息。要做盗号木马?用WH_KEYBOARD类型的hook
    1.我们要跨过程应用钩子,要把hook函数写在DLL文件中。
    2.在DLL文件中 设置钩子.
      这里须要调用线程ID,threadId,我们会在面调用DLL的调用端中写入
      hhookGetMsg=::SetWindowsHookEx(WH_GETMESSAGE,GetMessageHookProc,::GetModuleHandle(TEXT("dll.dll")),threadId);
      //参数1:钩子类型
      //参数2:钩子处理函数
      //参数3:钩子地点的模块
      //参数4:钩子要阻碍的线程ID,若是要设置全局钩子,这里给0。
      把这个SetWindowsHookEx()函数写在一个导出函数中:
      _declspec(dllexport) void SetHook(DWORD threadId)
      {
        hhookGetMsg=::SetWindowsHookEx(WH_GETMESSAGE,GetMessageHookProc,::GetModuleHandle(TEXT("dll.dll")),threadId);
      }
      SetHook()就是本dll的导出函数
    3.在钩子处理函数中写入功能,当钩子截取到WM_NULL消息的,注入DLL文件。因为WM_NULL消息,是个没用的消息,应用程序一般不会收到这个消息,除非我们本身发送一个这个消息,所以我们在注入DLL的时,只要给要注入的应用程序发一个WM_NULL消息,当钩子截取到WM_NULL的时就注入钩子,就可以了。
    LRESULT CALLBACK GetMessageHookProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
      MSG* pMsg=(MSG*)lParam;
      if(WM_NULL==pMsg->message)
      ::LoadLibraryW(TEXT("D://MyDLL.dll"));
    }
    编译DLL项目,产生DLL文件。

    4.编写调用端,调用钩子
      首先获取窗口句柄
      HWND FindWindow( LPCTSTR lpClassName,LPCTSTR lpWindowName);
      返回窗体句柄。hWnd.
      hWnd=FindWindow(0,要注入dll的窗体的名称(例如:记事本))
      通过hWnd,查找窗体线程ID
      threadId=GetWindowThreadProcessId(hWnd,0);
      有了线程ID了,可以调用钩子了。
      SetHook(threadId);
      这时钩子已经加载到目标线程中了。
      向目标窗体发送WM_NULL消息
      SendMessage(hWnd,WM_NULL,0,0);
      钩子会在目标窗体受到消息前受到WM_NULL消息。因为钩子处理函数中做了判断,当受到WM_NULL消息时,加载DLL文件。所以DLL文件就注入到目标线程中了。

    转载于:https://www.cnblogs.com/shadow-lei/archive/2012/12/11/dll%e6%b3%a8%e5%85%a5.html

    展开全文
  • C# dll注入方法简介

    2013-04-28 21:04:40
    事实上dll注入很简单,无非就是调用virtualAllocEx,WriteProcessMemory,OpenProcess,CreateRemoteThread等API函数,因为我是学c#的,所以也想看一下c# dll注入这方面的文章,但在网上找了半天,没有找到一篇,也许是...
    事实上dll注入很简单,无非就是调用virtualAllocEx,WriteProcessMemory,OpenProcess,CreateRemoteThread等API函数,因为我是学c#的,所以也想看一下c# dll注入这方面的文章,但在网上找了半天,没有找到一篇,也许是c#刚兴起的缘故,学c#的并不多,没办法,只好自己移植一下,因为凡是用到API函数,所有的编程的语言都是相同的,这就为我们的移植带来了方便,学c#的一般应该对API的调用概念很淡,因为c#通常不会去调用API函数,因为这些已经被封装了,在vb,vc++等语言中要结束一个进程,首先就必须要得到这个进程的句柄,然后才能进行相应的关闭进程等操作,得到句柄要用到OpenProcess
     API函数,结束进程要用到TerminateProcess API函数,但是在c#中你根本不需要知道这些API函数就能完成同样的功能,所以你要是想了解一下API的相关知识,学一点vb是一个很好的选择。好了!下面就开始我们的c# dll注入之旅吧!
    

        首先需要加入以下API函数:

    1. [DllImport("kernel32.dll")]  
    2. public static extern int VirtualAllocEx(
    3. IntPtr hwnd, int lpaddress, int size, int type, int tect);  
    4. [DllImport("kernel32.dll")]  
    5. public static extern int WriteProcessMemory(
    6. IntPtr hwnd, int baseaddress, string buffer, int nsize, int filewriten );  
    7. [DllImport("kernel32.dll")]  
    8. public static extern int GetProcAddress(int hwnd, string lpname);  
    9. [DllImport("kernel32.dll")]  
    10. public static extern int GetModuleHandleA(string name);  
    11. [DllImport("kernel32.dll")]  
    12. public static extern int CreateRemoteThread(
    13. IntPtr hwnd, int attrib, int size, int address, int par, int flags, int threadid);   

        C#声明API比较复杂,因为是调用非托管的dll,所以要用到DllImport来调用非托管的dll,他还有很多属性在这就不多说了,网上有很介绍,可以去查一下,不过c#调用自身的变得动态链接库是倒是很方便,直接加个引用就ok了,调用dll要用的一个引用:using System.Runtime.InteropServices;这个不要忘了加上,下面是编好的所有代码:

    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.ComponentModel;  
    4. using System.Data;  
    5. using System.Drawing;  
    6. using System.Text;  
    7. using System.Windows.Forms;  
    8. using System.Runtime.InteropServices;  
    9. using System.Diagnostics;  
    10. namespace dllinject  
    11. {  
    12. public partial class Form1 : Form  
    13. {  
    14. [DllImport("kernel32.dll")] //声明API函数  
    15. public static extern int VirtualAllocEx(
    16. IntPtr hwnd, int lpaddress, int size, int type, int tect);  
    17. [DllImport("kernel32.dll")]  
    18. public static extern int WriteProcessMemory(
    19. IntPtr hwnd, int baseaddress, string buffer, int nsize, int filewriten );  
    20. [DllImport("kernel32.dll")]  
    21. public static extern int GetProcAddress(int hwnd, string lpname);  
    22. [DllImport("kernel32.dll")]  
    23. public static extern int GetModuleHandleA(string name);  
    24. [DllImport("kernel32.dll")]  
    25. public static extern int CreateRemoteThread(
    26. IntPtr hwnd, int attrib, int size, int address, int par, int flags, int threadid);  
    27. public Form1()  
    28. {  
    29. InitializeComponent();  
    30. }  
    31.  
    32. private void button1_Click(object sender, EventArgs e)  
    33. {  
    34. int ok1;  
    35. //int ok2;  
    36. //int hwnd;  
    37. int baseaddress;  
    38. int temp=0;  
    39. int hack;  
    40. int yan;  
    41. string dllname;  
    42. dllname = "c:\\dll.dll";  
    43. int dlllength;  
    44. dlllength = dllname.Length + 1;  
    45. Process[] pname = Process.GetProcesses(); //取得所有进程  
    46. foreach (Process name in pname) //遍历进程  
    47. {  
    48. //MessageBox.Show(name.ProcessName.ToLower());  
    49. //所示记事本,那么下面开始注入
    50. if (name.ProcessName.ToLower().IndexOf("notepad") != -1)   
    51. {  
    52.  
    53. baseaddress = VirtualAllocEx(name.Handle, 0, dlllength , 4096, 4); //申请内存空间  
    54. if (baseaddress == 0) //返回0则操作失败,下面都是  
    55. {  
    56. MessageBox.Show("申请内存空间失败!!");  
    57. Application.Exit();  
    58. }  
    59. ok1 = WriteProcessMemory(name.Handle, baseaddress, dllname, dlllength, temp); //写内存  
    60. if (ok1 == 0)  
    61. {  
    62.  
    63. MessageBox.Show("写内存失败!!");  
    64. Application.Exit();  
    65. }
    66.  
    67. //取得loadlibarary在kernek32.dll地址   
    68. hack = GetProcAddress(GetModuleHandleA("Kernel32"), "LoadLibraryA");  
    69. if (hack == 0)  
    70. {  
    71. MessageBox.Show("无法取得函数的入口点!!");  
    72. Application.Exit();  
    73. }  
    74. yan = CreateRemoteThread(name.Handle, 0, 0, hack, baseaddress, 0, temp); //创建远程线程。  
    75. if (yan == 0)  
    76. {  
    77. MessageBox.Show("创建远程线程失败!!");  
    78. Application.Exit();  
    79. }  
    80. else 
    81. {  
    82. MessageBox.Show("已成功注入dll!!");  
    83. }  
    84.  
    85. }  
    86.  
    87. }  
    88.  
    89. }  
    90. }  
    91.  

    至此,我们的C# DLL注入之旅就圆满结束了。

    展开全文
  • Dll注入方法-钩子

    2014-07-20 15:29:00
    idHook: 钩子类型lpfn:钩子过程的指针 ,也即拦截到指定系统消息后的预处理过程,定义在DLL中hMod:应用程序实例的句柄 如果是全局钩子, hInstance是DLL句柄(DllMain中给的模块地址。就是包...


    HHOOK SetWindowsHookEx(
    int idHook,
    HOOKPROC lpfn,
    HINSTANCE hMod,
    DWORD dwThreadId);

    idHook: 钩子类型
    lpfn:钩子过程的指针 ,也即拦截到指定系统消息后的预处理过程,定义在DLL中
    hMod:应用程序实例的句柄 如果是全局钩子, hInstance是DLL句柄(DllMain中给的模块地址。就是包含HookProc的动态库加载地址。否则给0就可以了,即勾自己。
    dwThreadId:要安装钩子的线程ID ,指定被监视的线程,如果明确指定了某个线程的ID就只监视该线程,此时的钩子即为线程钩子;如果该参数被设置为0,则表示此钩子为监视系统所有线程的全局钩子。


    其中idHook参数可以取如下常量:
    WH_CALLWNDPROC //窗口钩子,当系统向目标窗口发送消息时将触发此钩子
    WH_CALLWNDPROCRET //窗口钩子,当窗口处理完消息后将触发此钩子
    WH_CBT //当Windows激活、产生、释放(关闭)、最小化、最大化或改变窗口时都将触发此事件
    WH_DEBUG //调试钩子
    WH_GETMESSAGE //当往消息队列中增加一个消息时将触发此钩子
    WH_JOURNALPLAYBACK //回放钩子,可以用于播放已记录的鼠标和键盘的操作
    WH_JOURNALRECORD //记录钩子,可以用于记录鼠标和键盘的操作,木马程序可以使用此钩子窃取受控方在屏幕中敲入的密码
    WH_KEYBOARD //当敲击键盘时将触发此钩子
    WH_MOUSE //当有鼠标操作时将触发此钩子
    WH_MSGFILTER //消息过滤钩子
    WH_SHELL //Shell钩子
    WH_SYSMSGFILTER //系统消息过滤钩子


    原理:通过SetWindowsHookEx函数将DLL注入到进程的地址空间中,最后一个参数dwThreadId指向的是被注入进程内的某个线程ID。
    (1) 进程A对线程dwThread挂键盘钩子
    (2) 线程dwThreadId获取到的键盘消息会实现被钩子拦截
    (3) 系统检查hMod指向的DLL是否已被载入到线程dwThreadId所在的进程地址空间中,若否,则载入。这时,假设DLL被载入到进程B
    (4) 系统在进程B的地址空间中调用lpfn函数

    *********************************************************************************

    DLL部分

    *********************************************************************************

    LRESULT CALLBACK FunProc(
    int code, // hook code
    WPARAM wParam, // virtual-key code
    LPARAM lParam // keystroke-message information
    )
    {
    MessageBox(NULL,"KEY PRESS","hook inject",MB_OK);
    return CallNextHookEx(0,code,wParam,lParam);
    }

    HHOOK g_HookHandle;

    __declspec(dllexport) void SetHook()
    {
    DWORD tid = 0;
    // 获取窗口句柄
    HWND gameh = FindWindow(NULL,"test.txt - 记事本");
    if (gameh == 0)
    {
    return;
    }
    // 获取创建这个窗口的线程
    tid = GetWindowThreadProcessId(gameh,NULL);
    // 安装钩子到指定线程 WH_KEYBOARD 键盘钩子
    g_HookHandle = SetWindowsHookEx(WH_KEYBOARD, FunProc, GetModuleHandle("HOOKInject.dll"),tid);
    }

    __declspec(dllexport) void UnHook()
    {
    UnhookWindowsHookEx(g_HookHandle);
    }

    *********************************************************************************

    EXE部分

    *********************************************************************************

    typedef void (*lpFun)();
    int main()
    {
    HINSTANCE hDll; //DLL句柄
    lpFun SetHook; //函数指针
    lpFun UnHook; //函数指针
    hDll = LoadLibrary("..\\Debug\\HOOKInject.dll");
    if (hDll != NULL)
    {
    SetHook = (lpFun)GetProcAddress(hDll, "SetHook");
    UnHook = (lpFun)GetProcAddress(hDll, "UnHook");
    }

    if (SetHook != NULL)
    {
    SetHook();
    }
    getchar();
    UnHook();
    if (hDll != NULL)
    {
    FreeLibrary(hDll);
    }

    return 0;
    }

    转载于:https://www.cnblogs.com/15157737693zsp/p/3856274.html

    展开全文
  • Ring3下Dll注入方法整理汇总

    千次阅读 2016-06-30 11:08:54
    lpk.dll、usp10.dll、msimg32.dll、midimap.dll、ksuser.dll、comres.dll、ddraw.dll 以lpk为例,在win7下由于lpk被加入KnownDLLs且该注册表值不可修改,使得lpk强制从系统目录加载, 不过可以将lpk.dll加入...
  • 原帖地址:... 1. lpk.dll、usp10.dll、msimg32.dll、midimap.dll、ksuser.dll、comres.dll、ddraw.dll 以lpk为例,在win7下由于lpk被加入KnownDLLs且该注册表值不可修改,使得lpk强制从...
  • DLL注入方法及通讯

    2018-08-24 12:55:19
    DLL注入方法及通讯
  • Dll注入经典方法完整版
  • DLL各种注入方法收集

    2017-11-08 16:24:02
    DLL各种注入方法收集
  • 注入dll 远程注入方法

    2018-10-30 20:09:51
    远程注入简单实现,需要的可下载参考,很实用,很给力
  • Bleak用C#编写的Windows本机DLL注入库,支持多种注入方法。 支持的方法CreateRemoteThread ManualMap(仅x86)NtCreateThreadEx QueueUserAPC RtlCreateUserTh令人毛骨悚然的说明自2019年12月12日起已弃用,不再...
  • DLL注入

    2020-02-17 14:37:34
    DLL注入DLL注入DLL注入的作用DLL注入的实现方法CreatRemoteThread()流程 DLL注入 DLL注入:向运行中的其他进程强制插入特定的DLL文件。 DLL被加载到进程后会自动运行DllMain()函数。 BOOL WINAPI DllMain(HINSTANCE ...
  • RemoteDll是一款国外强大DLL注入工具,本压缩包里包括了汉化版和原版,按情况使用。 【更新说明】 新版本添加了2个... 【支持】 它支持下面的DLL注入方法: 删除的DLL是的RemoteDLL的独特功能。它可以帮助你瞬间完全从
  • 这款万能DLL注入器的作用就是将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分,实现我们自定义的扩展功能。使用方法简单,只需打开目标进程,然
  • DLL注入经典方法

    2014-10-26 10:47:24
    注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1; 3,WriteProcessMemory将Dll的名字写入第二步开辟出的内存中。 4,...
  • DLL注入技术

    2019-02-27 16:21:34
    DLL注入方法:在进程创建阶段加载输入表中的DLL(静态输入);通过调用LoadLibrary(Ex)主动加载(动态加载);由于系统机制的要求们必须加载系统预设的一些基础服务模块。 1、静态修改PE输入表法 准备工作:dll,...
  • 以下介绍几种跨进程调用DLL方法。 从《Windows核心编程》的书中可知,Windows下各个进程间的地址是相互独立的。建立新的进程时,会为此进程开辟一块独立的虚拟地址空间,这样有助于系统的稳定。——当一个进程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 807
精华内容 322
关键字:

dll注入方法