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)的更多相关文章

  1. 【webpack系列】从零搭建 webpack4+react 脚手架(四)

    经过三个章节的学习,你已经学会搭建了一个基于webpack4的react脚手架.如果要更改配置,比如,你希望把编译后的js文件和css文件等单独放dist下的static目录下,你想想,是不是有点麻烦 ...

  2. 一个Unix内核级别漏洞(一)

    翻译原创稿件,prison整理翻译,首发ichunqiu,原地址:http://lsd-pl.net/kernelvuln.pdf 这是一篇关于Unix内核级别漏洞的paper,由某团队发布在一次黑客 ...

  3. [转帖]select提高并发,select和poll、epoll的区别(杂)

    同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. https://www.2cto.com/kf/20161 ...

  4. APC注入(Ring3层)

    /* 步骤: 1.提权(GrantDebugPrivileges) (1)获得令牌token,OpenThreadToken(),OpenProcessToken () WINADVAPI BOOL ...

  5. (转载)APC支持php5.4了

    (转载)http://www.neatstudio.com/archives/?article-2061.html 时隔一年多,APC终于又更新了,这次更新最大的就是支持PHP5.4:- Add PH ...

  6. Android so注入(inject)和Hook技术学习(三)——Got表hook之导出表hook

    前文介绍了导入表hook,现在来说下导出表的hook.导出表的hook的流程如下.1.获取动态库基值 void* get_module_base(pid_t pid, const char* modu ...

  7. Android so注入(inject)和Hook技术学习(二)——Got表hook之导入表hook

    全局符号表(GOT表)hook实际是通过解析SO文件,将待hook函数在got表的地址替换为自己函数的入口地址,这样目标进程每次调用待hook函数时,实际上是执行了我们自己的函数. GOT表其实包含了 ...

  8. APC注入(Ring3)

    首先简单介绍一下APC队列和Alertable. 看看MSDN上的一段介绍(https://msdn.microsoft.com/en-us/library/ms810047.aspx): The s ...

  9. 高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)

    [0]写在前面 0.1)本代码旨在演示 从 ring0 转移到 ring3(即,从高特权级 转移到 低特权级) 0.2)本文 只对 与 门相关的 代码进行简要注释,言简意赅: 0.3)文末的个人总结是 ...

随机推荐

  1. 痞子衡嵌入式:了解i.MXRTxxx系列ROM中灵活的串行NOR Flash启动硬复位引脚选择

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRTxxx系列ROM中灵活的串行NOR Flash启动硬复位引脚选择. 关于 i.MXRT 系列 BootROM 中串行 NOR ...

  2. box-shadow详解

    今天课堂上有学生问到box-shadow这个属性,那么下面我们就来详细的解说下这个属性它的用法,box-shadow是css3中的一个属性,它可以向框添加一个或多个阴影. 首先我们来看它的语法: bo ...

  3. Ubuntu 18.04 开启 root 账号并允许远程连接

    转载:https://blog.csdn.net/u010766726/article/details/105376461 以普通用户登录系统 通过 "终端" 操作 普通用户 – ...

  4. Pytorch系列:(八)学习率调整方法

    学习率的调整会对网络模型的训练造成巨大的影响,本文总结了pytorch自带的学习率调整函数,以及其使用方法. 设置网络固定学习率 设置固定学习率的方法有两种,第一种是直接设置一些学习率,网络从头到尾都 ...

  5. Python - 基础数据类型 tuple 元组

    元组简单介绍 元组是一个和列表和相似的数据类型,也是一个有序序列 两者拥有着基本相同的特性,但是也有很多不同的地方 声明元组 var = (1, 2, 3) var = ("1", ...

  6. 前后端数据交互利器--Protobuf

    Protobuf 介绍 Protocol Buffers(又名 protobuf)是 Google 的语言中立.平台中立.可扩展的结构化数据序列化机制. https://github.com/prot ...

  7. 深入刨析tomcat 之---第7篇 这个是链接,如果使用idea 创建servlet工程

    recoded by 张艳涛 使用IDEA创建Servlet项目 使用IDEA创建Servlet项目

  8. MP4命令行处理

    MP4Box可用于生成符合MPEG-DASH规范的内容,也就是ISO / IEC 23009-1在ISO公共可用标准中可用的内容. dash切片命令: mp4box -dash 5000 -frag ...

  9. ClickHouse入门笔记

    ClickHouse笔记 目录 ClickHouse笔记 第 1 章 ClickHouse 入门 列式储存的好处: 第 2 章 ClickHouse 的安装 第 3 章 数据类型 整型 浮点型 布尔型 ...

  10. Lambda--Optional、Collectors高级进阶方法

    Lambda--Collectors.optional高级使用 偶然看到了同事groupingBy用法,然后百度衍生出了optional,collectors,map等各种用法.突然发现自己之前写的代 ...