远程线程注入-下

远程线程的几个关键点

  1. 被创建的线程在别的进程中执行
  2. 呗创建的线程锁依赖的代码或数据都来自于目标进程

如果想要在目标进程中干我们想干的事,我们就需要吧自己的功能代码加入到目标进程内部,这个也就是常说的代码注入

我们目前学过的知识就可以实现一些注入的功能

  1. 内存的操作
  2. 动态链接库

通过直接读写内存的方式

  1. 利用VirtualAllocEx在目标进程中申请一段内存空间
  2. 通过WriteProcessMemory在目标进程中刚申请的空间内将我们的功能代码的硬编码写入
  3. CreateRemoteThread 启动我们的目标代码

优点: 操作简单不易呗发现
缺点: 因为远程线程锁执行的代码和利用的资源只能是目标进程提供的,那么我们写入的这段硬编码必须得脱离其他依赖独立运行,只能直接调用API,不能使用静态库提供的函数,不能直接使用动态库使用的函数,不能出现随意的调用或者jmp,在构造这种代码的时候会非常复杂,当然按照以上要求构造出来的代码我们还有一种叫法,叫做ShellCode

DllMain

BOOL WINAPI DllMain
(
        HINSTANCE hinstDLL;//DLL模块举办(DLL 被加载的位置)
        DWORD fwdReason, //  制定本地DLLMain被调用的原因
        LPVOID ipvReserved; //保留位
)

//fdwReason的一些宏说明:

DLL_PROCESS_ATTACH:
      当进程第一次将该DLL映射到内存空间时,我们的进程就会调用一次这个DllMain并传入这个参数
DLL_PROCESS_DETACH:
      当进程将当前DLL从内存空间解除映射的时候,就会调用一次DllMain并传入这个参数
DLL_THREAD_ATTCH:
      每当有一个新的线程创建,都会调用一次DllMain并传入这个参数
DLL_THREAD_DEACH:
      每当有一个线程结束(ExitThread)时就会调用一次DllMain并传入这个参数,如果线程是因为TerminateThread函数而结束的则不会调用

通过动态链接库的方式

  1. 利用一些手段加载带有我们功能函数的DLL
  2. 通过DLLMAIN来启动我们的功能

优点:操作简单实现也简单,写在DLL中的功能函数不需要想 ShellCode那样做到什么也不依赖,因为DLL被加载后重定位会替我们搞定这些麻烦事,所以在DLL中可以像写我们普通的正常程序一样来写我们的功能代码
缺点:容易被检测

加载DLL:

image.png

你可能感兴趣的:(远程线程注入-下)