进程与线程(七)APC的实验,古老的Code

2023-12-03 00:38

本文主要是介绍进程与线程(七)APC的实验,古老的Code,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在看APC,顺便科普一个。APC的作用是指定一个特定线程上下文执行例程而不等待其返回值,实现异步调用。如果想看理论的话可以去看combojiang大牛的文章~apc是对线程而言的,用户模式的apc优先级最低,只有在线程处于alertable状态才可以被插入,我们可以做一个实验,利用APC向一个线程中注入DLL。

插入进程的流程与API~

申请内存,写入DLL地址,遍历进程的所有线程,向队列投入APC,n老的Code。


  1 BOOL InsertDLLByAPC(DWORD dwPID,TCHAR szDLLPath[MAX_PATH]) 2 { 3     //打开进程 4     HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,TRUE,dwPID); 5     if (hProcess == INVALID_HANDLE_VALUE) 6     { 7         wprintf(_T("process cannot be opened,error code: %d \n"),GetLastError()); 8         return FALSE; 9     } 10      11     DWORD dwSize = lstrlenW(szDLLPath)+1; 12     //VirtualAlloceEx参数意义?明天查啊~分配内存 13     TCHAR * pszRemoteFileName = (TCHAR *)VirtualAllocEx(hProcess,NULL,dwSize*sizeof(TCHAR),MEM_COMMIT,PAGE_READWRITE); 14     if (pszRemoteFileName == NULL) 15     { 16         wprintf(_T("memory error,error code: %d \n"),GetLastError()); 17         return FALSE; 18     } 19     if (0 != WriteProcessMemory(hProcess,(PVOID)pszRemoteFileName,(PVOID)szDLLPath,dwSize*sizeof(TCHAR),NULL)) 20     { 21         HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwPID); 22         THREADENTRY32 te32; 23         te32.dwSize = sizeof(THREADENTRY32); 24         Thread32First(hSnap,&te32); 25         do  26         { 27             if (te32.th32OwnerProcessID == dwPID) 28             { 29                 HANDLE hThred =    OpenThread(THREAD_ALL_ACCESS,FALSE,te32.th32ThreadID); 30                 if (hThred == INVALID_HANDLE_VALUE) 31                 { 32                     wprintf(_T("thread cannot be opened,error code: %d \n"),GetLastError()); 33                     return FALSE; 34                 } 35                 if(QueueUserAPC((PAPCFUNC)LoadLibrary,hThred,(ULONG_PTR)pszRemoteFileName)) 36                     wprintf(_T("got it \n")); 37             }     38         } while (Thread32Next(hSnap,&te32)); 39 40     } 41 42     return FALSE; 43 }

自己实际编写的时候会遇到诸多问题,有助于加深对APC机制的理解,R3的东西会加深自己对内核感性上的认识,不懂应用就看原理实在是头痛~~

如果等待进程是控制台的话也搞不定~~

我坐在宿舍床上,屁股疼死了。。最近有点不开心,不过没关系,让傻逼们傻逼去吧。

这篇关于进程与线程(七)APC的实验,古老的Code的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/447457

相关文章

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

java 进程 返回值

实现 Callable 接口 与 Runnable 相比,Callable 可以有返回值,返回值通过 FutureTask 进行封装。 public class MyCallable implements Callable<Integer> {public Integer call() {return 123;}} public static void main(String[] args

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(五)——并发模型(生产者-消费者)

http://blog.csdn.net/Daybreak1209/article/details/51378055 三、生产者-消费者模式     在经典的多线程模式中,生产者-消费者为多线程间协作提供了良好的解决方案。基本原理是两类线程,即若干个生产者和若干个消费者,生产者负责提交用户请求任务(到内存缓冲区),消费者线程负责处理任务(从内存缓冲区中取任务进行处理),两类线程之

java线程深度解析(四)——并发模型(Master-Worker)

http://blog.csdn.net/daybreak1209/article/details/51372929 二、Master-worker ——分而治之      Master-worker常用的并行模式之一,核心思想是由两个进程协作工作,master负责接收和分配任务,worker负责处理任务,并把处理结果返回给Master进程,由Master进行汇总,返回给客

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的