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. C++第四十六篇 -- C++将int转换成宽字符串

    int rate = 60; int score = 80 TCHAR Temp[64] = TEXT(""); _stprintf_s(Temp, TEXT("pass ...

  2. 第十六篇 -- SuperIO学习

    一.SuperIO 这次主要研究SuperIO读取以及控制风扇转速的问题. 参考文章:https://huchanghui123.github.io/Linux/Linux-Superio-CPU-F ...

  3. Java逻辑运算符&与&&

    & 和&&的区别 && 短路与 ,一个条件不成立,跳出判断 & 与 , 全部判断 boolean b1 = false; int num = 9; if ...

  4. Python - 赋值运算符

    前置知识 先了解下变量: https://www.cnblogs.com/poloyy/p/15042257.html 再了解下算术运算符: https://www.cnblogs.com/poloy ...

  5. 浏览器不支持promise的finally

    IE浏览器以及edge浏览器的不支持es6里面promise的finally 解决方法: 1.npm install axios promise.prototype.finally --save 2. ...

  6. FastAPI:一个测试人员视角的教程

    前言 教程肯定谈不上了,主要还是就自己的理解分享内容而已 内容是连官方文档的基础教程都没涵盖起的 建议直接看官方文档 以个人视角来分享,希望各位通过这个可以写接口了 需要自取 完整视频链接:https ...

  7. noip模拟29[简单的板子题](虽然我不会)

    \(noip模拟29\;solutions\) 这次考试给我最大的伤害,让我意识到了差距 这场考试可以说是非常的简单,就是简单到,看两眼,打个表就有结果了 但是呢?我考得非常的完蛋,只有30pts 据 ...

  8. webRTC的标准与发展

    Web实时通信(WebRTC)是标准,协议和JavaScript API的集合,两者的组合可实现浏览器(对等)之间的对等音频,视频和数据共享.WebRTC无需依赖第三方插件或专有软件,而是将实时通信转 ...

  9. JAVAWEB的基本入门(JSP、Tomcat)>从零开始学JAVA系列

    目录 JAVAWEB的基本入门(JSP.Tomcat) 使用idea创建web项目的两种方式 1.直接创建一个web项目(这样创建好的项目可以直接运行) 2.创建一个普通的java项目并配置web模块 ...

  10. Spring Cloud 专题之六:bus

    书接上回: SpringCloud专题之一:Eureka Spring Cloud专题之二:OpenFeign Spring Cloud专题之三:Hystrix Spring Cloud 专题之四:Z ...