本篇文章是Bypass思路系列文章的第一篇,后续会持续更新有关Bypass的思路
因为工作原因,文章断断续续,时间线上会存在差异,思路及代码可行性仅供参考。
若文章中存在说的不清楚或者错误的地方 欢迎师傅们指正 感激不尽!!!
前言
本文将从杀软监测敏感函数进行操作,以达到Bypass的效果。
测试编译器:VS全版本
测试Demo:Win32应用程序,MFC应用程序:
在测试Demo的时候,某些杀软会杀编译器,下面附上我测试Demo时的查杀效果:
Win32应用程序 | MFC应用程序 | |
---|---|---|
VC++6.0 | 5/69 | 6/69 |
VS2008 | 0/68 | 0/69 |
VS2010 | 3/69 | 0/68 |
VS2012 | 1/69 | 2/69 |
VS2013 | 3/69 | 0/68 |
VS2015 | 1/68 | 1/68 |
VS2017 | 0/69 | 1/69 |
VS2019 | 1/68 | 1/69 |
VS2022 | 2/66 | 1/67 |
由此可以看到,尽管代码没有特征,但是某些杀软还是会报,最新的编译器也不例外,以此引入:杀软会查杀编译器的特性。
针对杀编译器特性,我们可以选用一些较为小众的语言或者杀软对语言较为友好(eg:Golang,nim)来达到Bypass的效果,或者选用较老的编译器(eg:VS2008)去达到Bypass的效果。
在这里,我们选用Win32应用程序,一是因为VT杀软较全面查杀的结果,二是可以直观验证代码被杀与否。
下面进入到我们本次的主题:基于敏感函数去实现Bypass。
一、窗口隐藏
BOOL ShowWindow(
HWND hWnd,
int nCmdShow
);
最简单的用法,SW_HIDE参数下是被杀的,利用虚拟键即可达到隐藏窗体的效果。
更多详情请参考:https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
这里用到的编译器是VS2019,下面附上一段笔者测试的代码:
int main()
{
HWND hWnd = GetForegroundWindow();//读取窗口信息
bool f = 0;
while (1) {
if (GetAsyncKeyState(VK_SPACE)) ShowWindow(hWnd, f), Sleep(100), f = !f;//VK_SPACE==点击空格显示窗体
}
}
二、文件执行
UINT WinExec(
LPCSTR lpCmdLine,
UINT uCmdShow
);
该函数,换个编译器可实现Bypass,Pass的编译器是VS2019,Bypass的编译器是VS2017。
=========================================分割线===========================================================
HINSTANCE ShellExecute(
[in, optional] HWND hwnd,
[in, optional] LPCSTR lpOperation,
[in] LPCSTR lpFile,
[in, optional] LPCSTR lpParameters,
[in, optional] LPCSTR lpDirectory,
[in] INT nShowCmd
);
最简单的用法,用法我就不过多描述。Bypass的编译器是VS2019,下面附上一段笔者测试的Bypass代码:
#include <windows.h>
#include <stdio.h>
int main()
{
CONST char cmd[] = "calc.exe";
ShellExecute(0, "open", cmd, NULL, NULL, 1);
}
=========================================分割线===========================================================
BOOL CreateProcess(
LPCWSTR pszImageName,
LPCWSTR pszCmdLine,
LPSECURITY_ATTRIBUTES psaProcess,
LPSECURITY_ATTRIBUTES psaThread,
BOOL fInheritHandles,
DWORD fdwCreate,
LPVOID pvEnvironment,
LPWSTR pszCurDir,
LPSTARTUPINFOW psiStartInfo,
LPPROCESS_INFORMATION pProcInfo
);
下面附上一段笔者测试得Bypass代码,用到的编译器是VS2010MFC应用程序:
STARTUPINFO si;
PROCESS_INFORMATION
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi
CreateProcess(
NULL
, "calc.exe"//替换要控制的新进程
, NULL
, NULL
, TRUE
, 0
, NULL
, NULL
, &si
, &pi
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CreateProcess可完全控制新进程,在后续文章中将深入介绍CreateProcess函数,包括父进程欺骗、傀儡进程等相关知识。
执行由简到繁:Winexec ==> ShellExecute ==> CreateProcess
Winexec主要运行exe文件 ==> ShellExecute不仅可以运行exe文件还可运行已关联文件 ==> CreateProcess可完全控制新进程
总结
本文内容较为简单,主要是围绕常用的敏感函数来实现Bypass,其中运用到的小技巧可以结合实际场景将其融合,最后写出适合自己的的Loader。笔者后续将会继续分享Bypass思路,希望大家有兴趣的私我,共同进步。
发表评论
您还未登录,请先登录。
登录