前言:
“代码远程线程注入”是实现将本进程的一段二进制代码注入到另一个远程进程中,在被注入进程中运行指定代码的技术。“代码远程线程注入”的核心代码非常简炼且逻辑惊艳,不管是对c语言的语法还是对编译器编译顺序的了解都有很大帮助,因为从该代码中就可以大致猜测出编译器的部分编译规则和PE文件数据的放置格式,其中关于c代码的巧妙应用也值得借鉴。
本文章的目的重在分享代码,而不是分享总结,因为作者并没有系统学习过PE文件格式、编译器原理和系统安全等相关知识,自学的一点奇技淫巧纯粹用于平日消遣,有限的知识量并不允许我在文章中分享更为专业和有价值的总结,否则有误人子弟之嫌。如果出现描述错误欢迎指正。
以下分享的程序代码参考自文章https://www.cnblogs.com/freesec/p/6554518.html并在修复了该文章部分代码错误的基础上做了一点改进,主要改进是调用了ntdll文件中微软公司留下的后门函数ZwCreateThreadEx,该函数用于替代CreateRemoteThread,她的优点是更接近底层,可以穿透session0隔离将代码注入到系统进程中。但是由于session0隔离,系统进程和用户进程不会直接通过窗口进行交互,可能无法使用弹出对话框的方式来验证注入系统进程是否成功。
*注:本代码仅供学习交流,如果将本代码用于非法途径,后果自负。(2018.12.20)
头文件以及参数声明:
#include <stdio.h>
#include<Windows.h>
//声明需要用到的函数
typedef HMODULE(WINAPI *lpLoadLibraryA)(char* filename);
typedef FARPROC(WINAPI *lpGetProcAddress)(HMODULE hModule, char* funcName);
typedef int(WINAPI *lpMessageBoxA)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
#ifdef _WIN64
typedef DWORD(WINAPI *typedef_ZwCreateThreadEx)(
PHANDLE ThreadHandle,
ACCESS_MASK DesiredAccess,
LPVOID ObjectAttributes,
HANDLE ProcessHandle,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
ULONG CreateThreadFlags,
SIZE_T ZeroBits,
SIZE_T StackSize,
SIZE_T MaximumStackSize,
LPVOID pUnkown);
#else
typedef DWORD(WINAPI *typedef_ZwCreateThreadEx)(
PHANDLE ThreadHandle,
ACCESS_MASK DesiredAccess,
LPVOID ObjectAttributes,
HANDLE ProcessHandle,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
BOOL CreateSuspended,
DWORD dwStackSize,
DWORD dw1,
DWORD dw2,
LPVOID pUnkown