回顾线程
程序开始运行时,操作系统就创建了这个程序的进程。一个进程中有多个线程,一个线程就是这个进程正在执行的一个任务。比如main函数就在一个线程中执行。
远程线程注入
首先,这篇文章不是讲远程线程DLL注入(但可以说是为其打基础)。在初学Windows API时,我们学到过函数CreateThread,用来在当前进程中创建一个线程。在这里,又有了一个新的函数——CreateRemoteThread,这两个函数不光名字像,参数列表也很相似(后者只是增加了一个目标进程句柄)。
要进行远程线程注入,我们首先要有一个目标,这里就是inject_me.cpp所生成的程序。该程序在不受外界影响的情况下会无限循环下去。
inject_me.cpp
1 |
|
接下来就是最核心的注入程序了。首先最重要的一点就是:进行远程线程注入时,线程执行的函数或者说线程所执行的机器码应该在目标进程(inject_me.exe)中已存在,本文中线程执行的函数就是TestFunc,而Inject函数的参数(目标进程ID,线程函数TestFunc的地址)需要从inject_me.exe中获取。
inject.cpp
1 |
|
演示
首先运行inject_me.exe,程序会输出00234539
为TestFunc的地址,78bc
为PID以及TID7704
。当我们开始运行inject.exe开始对目标进程inject_me.exe注入,正常情况下目标进程将会新建一个进程,执行TestFunc函数,并输出:You injected me.
1 | 00234539 |