进程与线程(七)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

相关文章

Java中如何正确的停掉线程

《Java中如何正确的停掉线程》Java通过interrupt()通知线程停止而非强制,确保线程自主处理中断,避免数据损坏,线程池的shutdown()等待任务完成,shutdownNow()强制中断... 目录为什么不强制停止为什么 Java 不提供强制停止线程的能力呢?如何用interrupt停止线程s

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

SpringBoot实现虚拟线程的方案

《SpringBoot实现虚拟线程的方案》Java19引入虚拟线程,本文就来介绍一下SpringBoot实现虚拟线程的方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录什么是虚拟线程虚拟线程和普通线程的区别SpringBoot使用虚拟线程配置@Async性能对比H

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监