插入代码 ``` / * * ?函数原型: 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 ; } |