Inject-APC (Ring3)
1 // APCInject.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include "APCInject.h"
6
7 #include <windows.h>
8 #include <TlHelp32.h>
9
10 #include <iostream>
11 #include <string>
12
13
14
15 #define _WIN32_WINNT 0x0400
16
17 #define DEF_BUF_SIZE 1024
18
19
20 #ifdef _DEBUG
21 #define new DEBUG_NEW
22 #endif
23
24
25 // 唯一的应用程序对象
26
27 CWinApp theApp;
28
29 using namespace std;
30
31
32 typedef long(__fastcall *pfnRtlAdjustPrivilege64)(ULONG, ULONG, ULONG, PVOID);
33 pfnRtlAdjustPrivilege64 RtlAdjustPrivilege;
34 BOOL InjectModuleToProcessById(DWORD dwProcessId);
35 // 用于存储注入模块DLL的路径全名
36 char szDllPath[DEF_BUF_SIZE] = { 0 };
37 int main()
38 {
39 int nRetCode = 0;
40 // 取得当前工作目录路径
41 GetCurrentDirectoryA(DEF_BUF_SIZE, szDllPath);
42
43 // 生成注入模块DLL的路径全名
44 strcat(szDllPath, "\\MessageBox32.dll");
45
46 DWORD dwProcessId = 0;
47 // 接收用户输入的目标进程ID
48 while (cout << "请输入目标进程ID:" && cin >> dwProcessId && dwProcessId > 0)
49 {
50 BOOL bRet = InjectModuleToProcessById(dwProcessId);
51 cout << (bRet ? "注入成功!" : "注入失败!") << endl;
52 }
53
54 return nRetCode;
55 }
56
57
58
59 // 使用APC机制向指定ID的进程注入模块
60 BOOL InjectModuleToProcessById(DWORD dwProcessId)
61 {
62 DWORD dwRet = 0;
63 BOOL bStatus = FALSE;
64 LPVOID lpData = NULL;
65 UINT uLen = strlen(szDllPath) + 1;
66 LPTHREAD_START_ROUTINE FuncAddress = NULL;
67 DWORD dwRetVal = 0;
68 #ifdef _WIN64 // x64 OpenProcess提权操作
69 //RtlAdjustPrivilege = (pfnRtlAdjustPrivilege64)GetProcAddress((HMODULE)(FuncAddress(L"ntdll.dll")), "RtlAdjustPrivilege");
70
71 //if (RtlAdjustPrivilege == NULL)
72 //{
73 // return FALSE;
74 //}
75 ///*
76 //.常量 SE_BACKUP_PRIVILEGE, "17", 公开
77 //.常量 SE_RESTORE_PRIVILEGE, "18", 公开
78 //.常量 SE_SHUTDOWN_PRIVILEGE, "19", 公开
79 //.常量 SE_DEBUG_PRIVILEGE, "20", 公开
80 //*/
81 //RtlAdjustPrivilege(20, 1, 0, &dwRetVal); //19
82 #endif
83 // 打开目标进程
84 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
85 if (hProcess)
86 {
87 // 分配空间
88 lpData = VirtualAllocEx(hProcess, NULL, uLen, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
89 if (lpData)
90 {
91 // 写入需要注入的模块路径全名
92 bStatus = WriteProcessMemory(hProcess, lpData, szDllPath, uLen, NULL);
93 }
94 CloseHandle(hProcess);
95 }
96
97 if (bStatus == FALSE)
98 return FALSE;
99
100 // 创建线程快照
101 THREADENTRY32 te32 = { sizeof(THREADENTRY32) };
102 HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
103 if (hThreadSnap == INVALID_HANDLE_VALUE)
104 return FALSE;
105
106 bStatus = FALSE;
107 // 枚举所线程
108 if (Thread32First(hThreadSnap, &te32))
109 {
110 do {
111 // 判断是否目标进程中的线程
112 if (te32.th32OwnerProcessID == dwProcessId)
113 {
114 // 打开线程
115 HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, te32.th32ThreadID);
116 if (hThread)
117 {
118 // 向指定线程添加APC
119 DWORD dwRet = QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (ULONG_PTR)lpData);
120 if (dwRet > 0)
121 bStatus = TRUE;
122 CloseHandle(hThread);
123 }
124 }
125
126 } while (Thread32Next(hThreadSnap, &te32));
127 }
128
129 CloseHandle(hThreadSnap);
130 return bStatus;
131 }
Inject-APC (Ring3)的更多相关文章
- 【webpack系列】从零搭建 webpack4+react 脚手架(四)
经过三个章节的学习,你已经学会搭建了一个基于webpack4的react脚手架.如果要更改配置,比如,你希望把编译后的js文件和css文件等单独放dist下的static目录下,你想想,是不是有点麻烦 ...
- 一个Unix内核级别漏洞(一)
翻译原创稿件,prison整理翻译,首发ichunqiu,原地址:http://lsd-pl.net/kernelvuln.pdf 这是一篇关于Unix内核级别漏洞的paper,由某团队发布在一次黑客 ...
- [转帖]select提高并发,select和poll、epoll的区别(杂)
同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. https://www.2cto.com/kf/20161 ...
- APC注入(Ring3层)
/* 步骤: 1.提权(GrantDebugPrivileges) (1)获得令牌token,OpenThreadToken(),OpenProcessToken () WINADVAPI BOOL ...
- (转载)APC支持php5.4了
(转载)http://www.neatstudio.com/archives/?article-2061.html 时隔一年多,APC终于又更新了,这次更新最大的就是支持PHP5.4:- Add PH ...
- Android so注入(inject)和Hook技术学习(三)——Got表hook之导出表hook
前文介绍了导入表hook,现在来说下导出表的hook.导出表的hook的流程如下.1.获取动态库基值 void* get_module_base(pid_t pid, const char* modu ...
- Android so注入(inject)和Hook技术学习(二)——Got表hook之导入表hook
全局符号表(GOT表)hook实际是通过解析SO文件,将待hook函数在got表的地址替换为自己函数的入口地址,这样目标进程每次调用待hook函数时,实际上是执行了我们自己的函数. GOT表其实包含了 ...
- APC注入(Ring3)
首先简单介绍一下APC队列和Alertable. 看看MSDN上的一段介绍(https://msdn.microsoft.com/en-us/library/ms810047.aspx): The s ...
- 高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)
[0]写在前面 0.1)本代码旨在演示 从 ring0 转移到 ring3(即,从高特权级 转移到 低特权级) 0.2)本文 只对 与 门相关的 代码进行简要注释,言简意赅: 0.3)文末的个人总结是 ...
随机推荐
- [刘阳Java]_精选20道Java多线程面试题
1. 多线程使用的优缺点? 优点: (1)多线程技术使程序的响应速度更快 (2)当前没有进行处理的任务可以将处理器时间让给其它任务 (3)占用大量处理时间的任务可以定期将处理器时间让给其它任务 (4) ...
- Raspberry pi 3b+ 安装dotnet5 VSCode Remote-SSH 远程开发
前言 VSCode 安装Remote-SSH 配置好树莓派 VSCode 自带SSH控制台 终端输入命令 下载&安装 net5 下载wget https://dotnetcli.azureed ...
- POJ3048
素数筛,数据范围不大,直接暴力筛. 坑:有个数据是 1 1,答案是1.差点没把我卡去世. 我的三观哪去了. #include<iostream> #include<cstdio> ...
- Python自动化测试面试题-经验篇
目录 Python自动化测试面试题-经验篇 Python自动化测试面试题-用例设计篇 Python自动化测试面试题-Linux篇 Python自动化测试面试题-MySQL篇 Python自动化测试面试 ...
- 第九篇 -- 对数据库mysql进行连接并压测(二)
上一节介绍了对mysql查询语句的压测,这一节来进一步的了解. 还是先把数据库的图放上来. 接下来打开Jmeter. 1. 回顾一下上一节学的查询语句 JDBC Request配置 结果 2. 条件查 ...
- 开源基于docker的任务调度器pipeline,比`quartzs` 更强大的分布式任务调度器
pipeline 分布式任务调度器 目标: 基于docker的布式任务调度器, 比quartzs,xxl-job 更强大的分布式任务调度器. 可以将要执行的任务打包为docker镜像,或者选择已有镜像 ...
- xampp搭建开源项目iwebshop后,服务器重启后再启动xampp显示组件都启动ok,但是实际启动失败解决办法
最近用xampp搭建了开源商城项目iwebshop,刚搭建完没问题,可是周一来因为服务器重启了,我再启动xampp,显示组件都启动ok了,但是用linux命令查看相关组件的进程时,发现实际没启动起来, ...
- Qt+腾讯IM开发笔记(一):腾讯IM介绍、使用和Qt集成腾讯IM-SDK的工程模板Demo
前言 开发一个支持全国的IM聊天,可以有基本的功能,发送文本.图片.文件等等相关内容. 腾讯IM产品 概述 腾讯即时通信IM是腾讯推出的即时聊天程序,当前时间为2020年3月(腾讯IM的优 ...
- vue中this.$router.push()路由传值和获取的两种常见方法
1.路由传值 this.$router.push() (1) 路由跳转使用router.push()方法,这个方法会向history栈添加一个新纪录,所以,当用户点击浏览器后退按钮时,会回到之前的 ...
- 使用Fileupload完成文件的上传下载
目录 使用Fileupload完成文件的上传下载 为什么需要进行文件上传下载? 引入jar包 文件上传 注意事项 编写一个简单的文件上传jsp页面 编写Servlet Student类用于封装数据,后 ...