目前我知道有3种dll注入的方式:
1. 在目标进程的地址空间,用CreateRemoteThread启动新的线程,线程入口为LoadLibrary这个API,参数为dll文件全路径,通过那个线程的执行,实现DLL加载。
2. 此法只能在目标Exe文件执行之前使用。此法先创建挂起状态的目标进程,得到目标进程在内存中入口函数的地址,然后将入口函数开始的一段内存数据备份起来,填充上调用LoadLibrary的代码,然后解挂进程,待其执行完加载DLL的操作,再用备份数据恢复原入口函数头部,继续执行目标进程即可。
3. 使用SetWindowsHookEx给目标进程挂钩子函数的同时,顺便让钩子函数所在的DLL进入到目标进程的地址空间。
我想了解一下,还有其他的方法么?

解决方案 »

  1.   

    可以修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows键的AppInit_DLLs值,将DLL路径加到里面,所有进程启动会自动载入该DLL。
      

  2.   


    http://www.codeproject.com/KB/threads/winspy.aspx?df=100&forumid=16291&select=1025152&msg=1025152
      

  3.   

    呵呵2,3都是靠1实现的吧.AppInit_DLLs这个键很多病毒也在用,可以看到在系统登陆那里就应该开始attach了
      

  4.   

    楼主可以去看看《Windows核心编程》,那本书上面讲的比较详细
      

  5.   

    还有一种比较暴力的方法
    用QueueUserAPC
    自己搜索
      

  6.   

    在目标进程中申请足够的空间,把需要 加载的那部分DLL的内容写到申请的空间中。
      

  7.   

    还有非文档化的方法,在ntdll.dll里面有个好像叫LoadSection(UnMapSection)的函数可以让别的进程加载DLL。
    我现在在网吧,没有办法确认函数的名字。
    楼主dump一下ntdll.dll,看看里面导出函数中有没有带Section的,自己看看。
      

  8.   

    还有:
    1 SetThreadContext在微软的detour中使用的就是这种方法;
    2 QueryUserApc,但前提是你自己创建的进程,当然你可以写驱动,修改线程的可等待状态,但写驱动了,还需要什么注入?
    另外,SetWindowsHookEx只能对有窗体的进程进行注入。
      

  9.   

    总结一下:
    1. 在目标进程的地址空间,用CreateRemoteThread
    2. 在目标进程的入口函数填充上调用LoadLibrary的代码
    3. SetWindowsHookEx
    4. 修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows键的AppInit_DLLs值,将DLL路径加到里面
    5. QueryUserApc
    6. SetThreadContext。 我的理解是,按7楼兄弟的说法,先把代码复制到目标进程空间,然后用SetThreadContext设置目标进程主线程的IP为dll的某个函数首地址,是这样的吗?望赐教
    7. 8楼兄弟说的是ntdll.dll里的NtMapViewOfSection和NtUnmapViewOfSection吗?还是ZwMapViewOfSection和ZwUnmapViewOfSection呢?这几个函数在MSDN里查不到啊,在哪里能查到用法呢?各位还有其他办法补充的吗?
      

  10.   

    7、8楼说的可能是未公开的东西,不过看名称应该是ring0级的底层函数
      

  11.   

    修改可执行文件的输入表,增加一个要注入的DLL,其它要注入的DLL再由这个来注入。
    还有种方法就是为PE文件增加一个新的代码节,修改程序入口点到新的节,在新界内用LoadLibrary函数载入DLL,然后回到原来的代码入口点。
      

  12.   

    ntdll.dll里的NtMapViewOfSection和ZwMapViewOfSection是同一个东西。
    native api虽然很多是undocumented的,但《Windows NT 2000 Native API Reference》中作
    者已经都将其详细解释了。
      

  13.   

    可以修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows键的AppInit_DLLs值,将DLL路径加到里面,所有进程启动会自动载入该DLL。
      

  14.   

    1) 使你的进程生成暂停运行的子进程。2) 从. e x e模块的头文件中检索主线程的起始内存地址。3) 将机器指令保存在该内存地址中。4) 将某些硬编码的机器指令强制放入该地址中。这些指令应该调用L o a d L i b r a r y函数来加载D L L。5) 继续运行子进程的主线程,使该代码得以执行。6) 将原始指令重新放入起始地址。7) 让进程继续从起始地址开始执行,就像没有发生任何事情一样。上面的步骤6和7要正确运行是很困难的,因为你必须修改当前正在执行的代码。不过这是可能的。
    而且要求代码是父进程才行
      

  15.   

    《Windows核心编程》看一下,里面介绍了几种常见方法
      

  16.   

    做个特洛伊木马,将目标进程的DLL用自己的DLL替换掉,自己DLL的堆栈结构要和目标的一致
      

  17.   

    windows核心编程里提供的方法是及其落后的方法,漏洞很多,不成熟。
    强烈建议你去学习detours
      

  18.   

    此法只能在目标Exe文件执行之前使用。此法先创建挂起状态的目标进程,得到目标进程在内存中入口函数的地址,然后将入口函数开始的一段内存数据备份起来,填充上调用LoadLibrary的代码,然后解挂进程,待其执行完加载DLL的操作,再用备份数据恢复原入口函数头部,继续执行目标进程即可。 
    -------------------------------------------------------------------以前我使用添加PE节区的方法实现过与此类似的功能——具备自拷贝功能的PE植入代码。其实,单单更改PE入口点,不会导致杀毒软件查杀,完全可以更改PE入口点至新添加的代码区。添加的代码执行完了,再跳转回原PE入口点就行了。这样更方便些,不必保存原PE入口处的代码,不必将保存的代码写回原PE入口处,代码区本来为只读的,还要更改节区属性,有点烦。最近想写个小软件的,专门用于更改PE,使PE在运行前首先加载某些附加的DLL,就是一直静不下心。感觉用处也不是很大。
      

  19.   

    查查PE 结构,一些数据结构啦,其中有一个条目用于存放PE 入口点的。
    参考书目《windows环境下32位汇编语言程序设计》里面有非常珍贵的关于pe结构的资料。 
      

  20.   

    PE文件的
    AddressOfEntryPoint
    应该就是入口地址,只要改变他的值就可以了。。
      

  21.   

    我也正在学习PE文件格式,如果LZ需要我可以提供给LZ
    以便我们以后交流,共同学习。。
    (*^__^*) 嘻嘻……。。
      

  22.   

    请看《Windows Via C/C++》或《Windows核心编程》第22章,很详细了。
      

  23.   

    <<windows核心编程>>第22章讲了几种方法,也有靠驱动,还有输入法注入的这些比较高深的东西,继续学习中。
      

  24.   

    用注册表的方法注入dll要重新启动才行!!!!!!!!!!!11