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)文末的个人总结是 ...
随机推荐
- .netcore第三方登录授权:10分钟急速接入
前言 很多对外应用的开发都考虑接入第三方登录来提高用户的体验感,避免用户进行繁琐的注册登录(登录后的完善资料必不可免). 而QQ.微信.支付宝.淘宝.微博等应用就是首选目标(无他,用户群体大,支持发开 ...
- ESCMScript6(3)Promise对象
1. Promise的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了P ...
- 【对线面试官】CountDownLatch和CyclicBarrier的区别
<对线面试官>系列目前已经连载31篇啦,这是一个讲人话面试系列 [对线面试官]Java注解 [对线面试官]Java泛型 [对线面试官] Java NIO [对线面试官]Java反射 &am ...
- Dijkstra和堆优化
Dijkstra算法 由于我之前一直记的迪杰斯特拉的翻译导致我把dijkstra写成了dijstra--所以下文#define dijstra dijkstra 我以后叫她迪杰克斯歘! Dijskra ...
- Python自动化测试面试题-Selenium篇
目录 Python自动化测试面试题-经验篇 Python自动化测试面试题-用例设计篇 Python自动化测试面试题-Linux篇 Python自动化测试面试题-MySQL篇 Python自动化测试面试 ...
- 第一篇 -- 下载并安装IDEA
此篇讲的是安装IDEA企业版,社区版是免费的,就不多说了. 参考链接:https://www.exception.site/essay/how-to-free-use-intellij-idea-20 ...
- 微信小程序工具下载与安装
下载 第一步:百度搜索"微信公众平台" 第二步:登录微信公众平台 第三步:点击微信开发者工具 第四步:按照自己的操作系统下载对应的版本的开发者工具,我的是Windows10 64位 ...
- (python函数03)zip()函数
(python函数03)zip()函数 zip是用来压缩的,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个元组(tuple),然后返回有这些tuples组成的对象,可强制转化为列表和 ...
- C++派生类的拷贝构造
一. 概述 通过几个简单的实验,回顾下派生类中拷贝构造的相关知识. 环境:Centos7 64位, g++ 4.8.5 在继承中,构造器与析构器均没有被继承下来.拷贝构造,也是一种构造,也没有被继承下 ...
- SaltStack 水平权限绕过漏洞(CVE-2020-11651)
影响版本 SaltStack < 2019.2.4 SaltStack < 3000.2 poc git clone https://github.com/jasperla/CVE-202 ...