ShellCode注入程序

程序功能是利用NtQueueApcThreadEx注入ShellCode到一个进程中,程序运行后会让你选择模式,按1为普通模式,所需的常规API接口都是使用Windows原本正常的API;在有游戏保护的进程中Windows原本正常的API无法使用,这时候需要选择内核模式,按2选择内核模式。

内核模式下使用的一些关键API都是我自己在ring0从0实现的,本帖仅开源普通模式下的代码。内核模式下使用的关键API以及调用框架不开源。

选择模式之后需要输入被注入进程的PID

项目包含三个源代码文件:1.源.cpp
2.fun.asm
3.fun.h

首先是源.cpp文件代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

插入代码

```/*

* 函数原型:

NTSTATUS NtQueueTHreadApcEx(

_in HANDLE thread,

_in UCHAR flags,0:常规用户APC,1:特殊用户APC

_in PAPCFUNC apcRoutine,

_in PVOID context1,

_in PVOID arg1,

_in PVOID arg2

);

需要从Ntdll.dll模块显式导出(GetProcAddress)

*/

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<Windows.h>

#include<Tlhelp32.h>

#include"fun.h"

HWND hwndG = 0;

BOOL CALLBACK EnumWindowsProc(

    HWND hwnd,

    LPARAM lParam)

{

    WCHAR path[MAX_PATH] = 0 };

    WCHAR* text = (WCHAR*)lParam;

    GetWindowText(hwnd, path, MAX_PATH);

    if (lstrcmpW(text, path) == 0)

    {

        hwndG = hwnd;

        return FALSE;

    }

    else

    {

        hwndG = 0;

        return TRUE;

    }

}

DWORD WINAPI GetThreadIdByProcessId(DWORD dwProcessId)

{

    THREADENTRY32 th32;

    th32.dwSize = sizeof(THREADENTRY32);

    DWORD dwThreadId = 0;

    HANDLE hdTool = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwProcessId);

    if (Thread32First(hdTool, &th32))

    {

        do

        {

            if (th32.th32OwnerProcessID == dwProcessId)

            {

                dwThreadId = th32.th32ThreadID;

                //printf("%d\n", dwThreadId);

                break;

            }

        while (Thread32Next(hdTool, &th32));

    }

    else

    {

        DWORD dwErro = GetLastError();

        //printf("遍历进程失败!——%d", dwErro);

        return dwErro;

    }

     

    return dwThreadId;

}

BOOL WINAPI PrivilegeAdjust()

{

    BOOL flag;

    HANDLE token;

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token))

    {

        //printf("打开令牌失败!\n");

        flag = FALSE;

    }

    LUID pid;

    if (!LookupPrivilegeValueA(NULL, "SeDebugPrivilege", &pid))

    {

        //printf("查看特权ID失败\n");

        flag = FALSE;

    }

    TOKEN_PRIVILEGES tp;

    tp.PrivilegeCount = 1;

    tp.Privileges[0].Luid = pid;

    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if (!AdjustTokenPrivileges(token, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL))

    {

        //printf("提升特权失败!\n");

        flag = FALSE;

    }

    return TRUE;

}

typedef BOOL(*MYTYPE)(HANDLE, LPVOID, LPVOID, SIZE_T, SIZE_T*);

typedef HANDLE(*OPPS)(DWORD, BOOL, DWORD);

typedef BOOL(*WRMEMEX)(HANDLE, LPVOID, LPVOID, SIZE_T, SIZE_T*);

typedef HANDLE(*OPTS)();

typedef ULONG64(*GETPEB)(DWORD);

typedef NTSTATUS(*NTQUEAPC)(HANDLE, UCHAR, PVOID, PVOID, PVOID, PVOID);

WRMEMEX Read;

WRMEMEX Write;

OPPS OpenPro;

OPTS OpenThr;

NTQUEAPC NtQueueUserApcEx;

VOID InitFrmak()

{

    printf("内核\n");

    NtQueueUserApcEx = NULL;

    HMODULE mod = LoadLibraryA("ApiSystemCall.dll");

    Read = (WRMEMEX)GetProcAddress(mod, "YhReadProcessMemory");

    Write = (WRMEMEX)GetProcAddress(mod, "YhWriteProcessMemory");

    OpenPro = (OPPS)GetProcAddress(mod, "YhOpenProcess");

    OpenThr = (OPTS)GetProcAddress(mod, "YhOpenThread");

    NtQueueUserApcEx = (NTQUEAPC)GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtQueueApcThreadEx");

    if (NtQueueUserApcEx == NULL)

    {

        MessageBoxA(NULL, "获取函数失败"00);

    }

}

VOID InitFrmakEx()

{

    NtQueueUserApcEx = NULL;

     

    printf("普通\n");

    Read = ReadProcessMemory;

    Write = WriteProcessMemory;

    OpenPro = OpenProcess;

    OpenThr = OpenThread;

    NtQueueUserApcEx = (NTQUEAPC)GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtQueueApcThreadEx");

    if (NtQueueUserApcEx == NULL)

    {

        MessageBoxA(NULL, "获取函数失败"00);

    }

}

typedef VOID(*FUN)();

int main()

{

    DWORD pid;

    SIZE_T size=0;

    CONTEXT text;

    VirtualProtect(fun, 0x60, PAGE_EXECUTE_READWRITE, &pid);

    *(ULONG64*)(&(((UCHAR*)fun2)[0x34])) = MessageBoxA;

    *(ULONG64*)(&(((UCHAR*)fun2)[0x9f])) = SetWindowsHookExA;

    //fun(NULL,NULL,NULL);

    printf("请输入模式:\n1.普通模式\n2.内核模式\n");

    scanf("%d", &size);

    (size==1)? InitFrmakEx(): InitFrmak();

    printf("请输入进程PID:\n");

    scanf("%d", &pid);

    PrivilegeAdjust();

     

    HANDLE hd = OpenPro(PROCESS_ALL_ACCESS, FALSE, pid);

    PVOID mem = VirtualAllocEx(hd, NULL, 0X1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

    DWORD tid = GetThreadIdByProcessId(pid);

    HANDLE td;

    if (size == 1)

    {

        td = OpenThr(THREAD_ALL_ACCESS,FALSE,tid);

    }

    else

    {

        td = OpenThr(tid, hd, THREAD_ALL_ACCESS, FALSE);

    }

    if (!Write(hd, mem, fun2, 0x100, &size))

    {

        MessageBoxA(0"写入失败"00);

    }

    SuspendThread(td);

    NTSTATUS code = NtQueueUserApcEx(td, 1, (PVOID)(((ULONG64)mem)+0x53), tid, 00);

    if(code!=0)

    {

         

        printf("%x\n", code);

        MessageBox(0000);

    }

    ResumeThread(td);

    system("pause");

    return 0;

}

fun.asm文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

.code

MessageBoxA proto

fun2 proc

    push rbp;

    mov rbp,rsp;

    sub rsp,060h;

    xor rax,rax;

    cmp rcx,rax;

    jnz sub_1;

    cmp rdx,09h;;虚拟键代码0x9为键盘的TAB键

    jnz sub_1;

    xor rcx,rcx;

    lea rdx,qword ptr[lab_2];

    xor r8,r8;

    xor r9,r9;

    mov rax,qword ptr[lab_1];

    call rax;

sub_1:

    mov rsp,rbp;

    pop rbp;

    ret;

fun2 endp

lab_1:

    db 00h;

    db 00h;

    db 00h;

    db 00h;

    db 00h;

    db 00h;

    db 00h;

    db 00h;

lab_2:

    db 0c2h;

    db 0edh;

    db 0bbh;

    db 0afh;

    db 0cch;

    db 0dah;

    db 0cah;

    db 0c7h;

    db 0c9h;

    db 0b5h;

    db 0b1h;

    db 0c6h;

    db 0a3h;

    db 0a1h;

    db 00ah;

    db 00h;

    db 00h;

    db 00h;

    db 00h;

    db 00h;

    db 00h;

    db 00h;

    db 00h;

fun proc

     

    push rbp;

    mov rbp,rsp;

    sub rsp,080h;

    mov r9,rcx;

    mov rcx,02h;

    lea rdx,qword ptr [fun2];

    xor r8,r8;

    mov rax,qword ptr [sub_2];

    call rax;

    cmp rax,0;

    jnz lab_3;

    xor rcx,rcx;

    xor rdx,rdx;

    xor r8,r8;

    mov r9,02h;

    mov rax,qword ptr [lab_1];

    call rax;

lab_3:

    mov rsp,rbp;

    pop rbp;

    ret;

sub_2:

    db 00h;

    db 00h;

    db 00h;

    db 00h;

    db 00h;

    db 00h;

    db 00h;

    db 00h;

fun endp

end

fun.h文件

1

2

3

#pragma once

#include<Windows.h>

void fun(PVOID a, PVOID b, PVOID c);

shellCode的功能是给被注入进程设置一个键盘钩子,TAB键。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/224325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Stable Diffusion】在windows环境下部署并使用Stable Diffusion Web UI---通过 Conda

本专栏主要记录人工智能的应用方面的内容&#xff0c;包括chatGPT、AI绘图等等&#xff1b; 在当今AI的热潮下&#xff0c;不学习AI&#xff0c;就要被AI淘汰&#xff1b;所以欢迎小伙伴加入本专栏和我一起探索AI的应用&#xff0c;通过AI来帮助自己提升生产力&#xff1b; 订阅…

[SSD 测试 1.2] SerialTek PCIe/NVMe协议分析仪

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解SSD》 <<<< 返回总目录 <<<< 全文 3800 字 前言 NVMe SSD权威组织UNH IOL官方网站指定的三个测试/分析工具给大家做一个测试技术普及,这些产品和工具出现在UNH IOL组织的Plugfest就会碰到这…

Oracle创建定时任务——-job

授权 说明&#xff1a; grant create job to xxx; grant manage scheduler to xxx; 必须授这两个用户权限 SQL> grant create job to zxin_jzfp;授权成功。SQL> grant manage scheduler to zxin_jzfp;授权成功。SQL> grant update any table to zxin_jzfp;授权成功。…

计算机网络:物理层(三种数据交换方式)

今天又学到一个知识&#xff0c;加油&#xff01; 目录 前言 一、电路交换 二、报文交换 三、分组交换 1、数据报方式 2、虚电路方式 3、比较 总结 前言 为什么要进行数据交换&#xff1f; 一、电路交换 电路交换原理&#xff1a;在数据传输期间&#xff0c;源结点与…

无机物及分析化学3d虚拟实验室软件提高教学效果

VR化学虚拟仿真实验室软件可以解决以下难题&#xff1a; 实验场地限制&#xff1a;传统的化学实验室需要占用大量的物理空间&#xff0c;并且需要严格的安全措施。而VR技术可以提供一个虚拟的实验室环境&#xff0c;不受空间限制&#xff0c;可以同时容纳更多的学生参与实验。 …

分类信息网商业运营版源码系统:适合各类行业分类站点建站 带安装部署教程

随着互联网的快速发展&#xff0c;信息分类网站在各个行业中得到了广泛应用。为了满足不同行业的需求&#xff0c;罗峰给大家分享一款适合各类行业分类站点建站的商业运营版源码系统。该系统旨在提供一套完整的解决方案&#xff0c;帮助用户快速搭建自己的分类信息网站&#xf…

深入分析ClassLocader工作机制

文章目录 一、ClassLoader简介1. 概念2. ClassLoader类结构分析 二、ClassLoader的双亲委派机制三、Class文件的加载流程1. 简介2. 加载字节码到内存3. 验证与解析4. 初始化Class对象 四、常见加载类错误分析1. ClassNotFoundException2. NoClassDefFoundError3. UnsatisfiledL…

jmeter,动态参数之随机数、随机日期

通过函数助手&#xff0c;执行以下配置&#xff1a; 执行后的结果树&#xff1a; 数据库中也成功添加了数据&#xff0c;对应字段是随机值&#xff1a;

『番外篇三』Swift “乱弹”之带索引遍历异步序列(AsyncSequence)

概览 在 Swift 开发中,我们往往在遍历集合元素的同时希望获得元素对应的索引。在本课中,我们将向小伙伴们展示除 enumerated() 方法之外的几种实现思路。在玩转普通集合之后,我们将用“魔法棒”进一步搞定异步序列带索引遍历的实现。 在本篇博主中,您将学到以下内容: 概…

国标级联/流媒体音视频平台EasyCVR设备录像下载异常该如何解决?

视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#xff0c;也能支…

7. 异常、断言及日志

1.异常 1).什么是异常 异常&#xff0c;就是不正常的意思。指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。 在Java等面向对象的编程语言中&#xff0c;异常本身是一个类&#xff0c;产生异常就是创建异常对象并抛出了一个异常…

2023年度总结:3个常用代理IP服务商实测对比

转眼到了2023年末&#xff0c;即将踏入2024新年&#xff0c;业务也即将走过年底冲刺暂告一段落。在这一年&#xff0c;为了保证公司项目的稳定运行&#xff0c;我们花费了大量的精力与费用测试在全球范围内的多家代理IP服务商&#xff0c;综合实测各家产品与服务后&#xff0c;…

Android 长按电源键弹出的GlobalActions菜单

长按事件动作的配置 frameworks\base\core\res\res\values\config.xml 选择1会弹出Global actions menu <!-- Control the behavior when the user long presses the power button.0 - Nothing1 - Global actions menu2 - Power off (with confirmation)3 - Power off…

【Flink on k8s】- 15 - 将 flink on yarn 迁移到 flink on k8s

目录 1、集群现状 2、与 Flink on yarn 对比 2.1 Flink on yarn 的一些痛点 2.2 Flink on k8s 的一些优点

uniApp 中实现一个骰子动效

代码如下 <template><!-- 骰子组件 --><view class"dice-wrap" tap"throwDice"><!-- 筛子运动时候的展示的图片 --><image v-if"isDicing" :src"diceAnimationImages[aniIndex]" class"dice-icon&qu…

mybatis-plus雪花算法自动生成ID到前端后精度丢失问题

问题发生 前端接收到后端的数据出现异常&#xff0c;异常如下&#xff1a; 如图这是后端正常返回的数据&#xff0c; 但是点击预览时发现这个id的数据被改变了 这就导致了我通过id去修改相关数据时无法成功 问题原因 id的长度过长&#xff08;19位&#xff09;&#xff0c;前…

前端(一):HTML+CSS

参考课程&#xff1a;23最新版web前端开发_哔哩哔哩_bilibili 文档&#xff1a;GitHub - codeNiuMa/HTML-md-file: 学习HTML课程时的资料 目录 1 HTML 1.1 骨架 DOCTYPE html标签 head标签 body标签 title标签 meta标签 1.2 标签标题h1 1.3 段落p 1.4 水平线 1.5 图片img 1.6 …

MacOS下载配置OpenCV

主要参考的是OpenCV官方的这篇文章&#xff1a;OpenCV: Installation in MacOS 安装OpenCV需要下载一些安装包&#xff1a;CMake3.9、Git、Python这些我之前已经下载好&#xff0c;这里就不过多阐述了&#xff0c;自行百度安装即可 1.从Git库获取OpenCV&#xff1a; git clon…

[NAND Flash] 3.3 Flash闪存工艺知识深度解析

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 全文 3800 字。 1. Wafer 1.1 什么是 Wafer Wafer即晶圆&#xff0c;是半导体组件“晶片”或“芯片”的基材&#xff0c;从沙子里面…

Java医院信息化建设云HIS系统源码

云HIS提供标准化、信息化、可共享的医疗信息管理系统&#xff0c;实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。优化就医、管理流程&#xff0c;提升患者满意度、基层首诊率&#xff0c;通过信息共享、辅助诊疗等手段&#xff0c;提高基层医生的服务能力构建和…