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; 订阅…

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

今天又学到一个知识&#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;…

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;提高基层医生的服务能力构建和…

喜讯连连捷报传,文章累累创佳绩,平均IF 18分!!!

爱基百客专注于提供领先的表观组学服务&#xff0c;目前已在表观组学、单细胞时空组学和高通量测序等方向积累了大量的项目经验。近期&#xff08;11月23日-12月4日&#xff09;&#xff0c;高分项目文章频出&#xff0c;涉及物种有梨、腰果、蘑菇、青枯雷尔氏菌和心肌细胞&…

系统的安全性设计

要设计一个安全的系统&#xff0c;除了要了解一些前面讲到的常用的保护手段和技术措施外&#xff0c;还要对系统中可能出现的安全问题或存在的安全隐患有充分的认识&#xff0c;这样才能对系统的安全作有针对性的设计和强化&#xff0c;即“知己知彼&#xff0c;百战百胜”。 下…

【Oracle】创建表

目录 方法一&#xff1a;CREATE TABLE 语法 创建表示例1&#xff1a;创建stuinfo(学生信息表) 创建表示例2&#xff1a;添加stuinfo(学生信息表)约束 方法二&#xff1a;CREATE TABLE AS 语法 创建表示例3&#xff1a; 创建表示例4&#xff1a;实现对select查询的结果进行…

什么是数据可视化?数据可视化的优势、方法及示例

前言 在当今的数字时代&#xff0c;数据是企业和组织的命脉&#xff0c;生成的数据量呈指数级增长。这种被称为大数据的海量数据在洞察力和决策方面具有巨大的潜力。然而&#xff0c;如果没有一种有效的方法来分析和理解这些数据&#xff0c;它就会变得毫无意义和难以管理。这就…

四十六、Redis哨兵

目录 一、哨兵的作用及原理 1、哨兵的结构和作用如下&#xff1a; 2、服务状态监控 3、选举新的master 4、小结 二、RedisTemplate的哨兵模式 一、哨兵的作用及原理 Redis提供了哨兵&#xff08;Sentinel&#xff09;机制来实现主从集群的自动故障恢复。 1、哨兵的结构和作…