Loading... APC 是一个简称,具体名字叫做异步过程调用,属于是同步对象中的函数,所以去同步对象中查看. 异步过程调用是一种能在特定线程环境中异步执行的系统机制。 往线程APC队列添加APC,系统会产生一个软中断。在线程下一次被调度的时候,就会执行APC函数,APC有两种形式,由系统产生的APC称为内核模式APC,由应用程序产生的APC被称为用户模式APC 那么使用APC场合的注入就有了, 1.必须是多线程环境下 2.注入的程序必须会调用上面的那些同步对象. 那么我们可以注入APC,注意下条件,也不是所有都能注入的. 注入方法的原理: 1.当对面程序执行到某一个上面的等待函数的时候,系统会产生一个中断 2.当线程唤醒的时候,这个线程会优先去Apc队列中调用回调函数 3.我们利用QueueUserApc,往这个队列中插入一个回调 4.插入回调的时候,把插入的回调地址改为LoadLibrary,插入的参数我们使用VirtualAllocEx申请内存,并且写入进去 使用方法: 1.利用快照枚举所有的线程 2.写入远程内存,写入的是Dll的路径 3.插入我们的DLL即可 ```cpp //1.查找窗口 HWND hWnd = ::FindWindow(NULL, TEXT("APCTest")); if (NULL == hWnd) { return; } /*2.获得进程的PID,当然通用的则是你把进程PID当做要注入的程序,这样不局限 于窗口了.这里简单编写,进程PID可以快照遍历获取 */ DWORD dwPid = 0; DWORD dwTid = 0; dwTid = GetWindowThreadProcessId(hWnd, &dwPid); //3.打开进程 HANDLE hProcess = NULL; hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid); if (NULL == hProcess) { return; } //4.成功了,申请远程内存 void *lpAddr = NULL; lpAddr = VirtualAllocEx(hProcess, 0, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (NULL == lpAddr) { return; } //5.写入我们的DLL路径,这里我写入当前根目录下的路径 char szBuf[] = "MyDll.dll"; BOOL bRet = WriteProcessMemory(hProcess, lpAddr, szBuf, strlen(szBuf) + 1, NULL); if (!bRet) { return; } //6.根据线程Tid,打开线程句柄 HANDLE hThread = NULL; hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, dwTid); if (NULL == hThread) { return; } //7.给APC队列中插入回调函数 QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (ULONG_PTR)lpAddr); CloseHandle(hThread); CloseHandle(hProcess); ``` 最后修改:2021 年 02 月 22 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏