点击上方蓝字关注我们
现在只对常读和星标的公众号才展示大图推送,建议大家能把星落安全团队“设为星标”,否则可能就看不到了啦!
背景介绍
使用方式
推荐使用方式二
方式一:
static void* lpNtdllBuffer = NULL;ULONG_PTR CustomNtFunction(const char* functionName){ULONG_PTR functionAddress = 0;char dllPath[MAX_PATH];GetSystemDirectoryA(dllPath, MAX_PATH);strcat_s(dllPath, MAX_PATH, "\ntdll.dll");//拼接系统目录ntdll.dll路径HMODULE dllHandle = LoadLibraryA(dllPath);ULONG_PTR apiAddress = (ULONG_PTR)GetProcAddress(dllHandle, functionName);//读取ntdll.dll到内存,程序运行时只读一次if (lpNtdllBuffer == NULL){HANDLE hFile = CreateFileA(dllPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL);if (hFile != INVALID_HANDLE_VALUE){DWORD dwBytesRead = 0;DWORD dwSize = GetFileSize(hFile, NULL);if (dwSize == INVALID_FILE_SIZE || dwSize == 0) return functionAddress;lpNtdllBuffer = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);ReadFile(hFile, lpNtdllBuffer, dwSize, &dwBytesRead, NULL);CloseHandle(hFile);}}//通过apiAddress地址获取函数的foa地址PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)lpNtdllBuffer;//取出PE头结构PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)(pDosHeader->e_lfanew + ((ULONG_PTR)pDosHeader));//取出节头结构PIMAGE_SECTION_HEADER pSectionHeader = (PIMAGE_SECTION_HEADER)((ULONG_PTR)pNtHeaders + sizeof(IMAGE_NT_HEADERS));ULONG_PTR foaAddress = 0;//Nt函数地址 - ntdll基址 = rvaULONG_PTR rva = apiAddress - (ULONG_PTR)dllHandle;for (WORD i = 0; i < pNtHeaders->FileHeader.NumberOfSections; ++i){if (rva >= pSectionHeader[i].VirtualAddress && rva <= pSectionHeader[i].VirtualAddress + pSectionHeader[i].SizeOfRawData){//找到foa地址foaAddress = rva - pSectionHeader[i].VirtualAddress + pSectionHeader[i].PointerToRawData;break;}}memcpy((PVOID)((ULONG_PTR)lpNtdllBuffer + foaAddress + 6), (PVOID)(apiAddress + 6), 6);functionAddress = (ULONG_PTR)lpNtdllBuffer + foaAddress;printf("函数名称: %s, 地址:%Ix, 偏移:%Ixn", functionName, functionAddress, foaAddress);//VirtualFree(lpNtdllBuffer, 0, MEM_RELEASE); lpNtdllBuffer = NULL;return functionAddress;}//NtGetContextThreadtypedef BOOL(NTAPI* PNtGetContextThread)(HANDLE hThread, LPCONTEXT lpContext);PNtGetContextThread pNtGetContextThread;//NtSetContextThreadtypedef BOOL(CALLBACK* PNtSetContextThread)(HANDLE hThread, LPCONTEXT lpContext);PNtSetContextThread pNtSetContextThread;//NtProtectVirtualMemorytypedef BOOL(NTAPI* PNtProtectVirtualMemory)(HANDLE hProcess, PVOID* lpAddress, PSIZE_T dwSize, ULONG flNewProtect, PULONG lpflOldProtect);PNtProtectVirtualMemory pNtProtectVirtualMemory;int main(){CustomNtFunction("ZwResumeThread");CustomNtFunction("NtSuspendThread");HANDLE hThread = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());CONTEXT context;memset(&context, 0, sizeof(CONTEXT));context.ContextFlags = CONTEXT_DEBUG_REGISTERS;//NtGetContextThreadpNtGetContextThread = (PNtGetContextThread)CustomNtFunction("NtGetContextThread");pNtGetContextThread(hThread, &context);//NtSetContextThreadpNtSetContextThread = (PNtSetContextThread)CustomNtFunction("ZwSetContextThread");pNtSetContextThread(hThread, &context);//NtProtectVirtualMemorySIZE_T size = 1;ULONG OldProtect = 0;PVOID addr = (PVOID)GetModuleHandle(nullptr);pNtProtectVirtualMemory = (PNtProtectVirtualMemory)CustomNtFunction("NtProtectVirtualMemory");pNtProtectVirtualMemory((HANDLE)-1, &addr, &size, PAGE_EXECUTE_READWRITE, &OldProtect);system("pause");return 0;}
方式二:
#include <iostream>#include <windows.h>static void* lpNtdllBuffer = NULL;ULONG_PTR GetFunctionAddressByName(const char* functionName){ULONG_PTR functionAddress = 0;//读取ntdll.dll到内存,程序运行时只读一次if (lpNtdllBuffer == NULL){char dllPath[MAX_PATH];GetSystemDirectoryA(dllPath, MAX_PATH);strcat_s(dllPath, MAX_PATH, "\ntdll.dll");//拼接系统目录ntdll.dll路径HANDLE hFile = CreateFileA(dllPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL);if (hFile != INVALID_HANDLE_VALUE){DWORD dwBytesRead = 0;DWORD dwSize = GetFileSize(hFile, NULL);if (dwSize == INVALID_FILE_SIZE || dwSize == 0) return functionAddress;lpNtdllBuffer = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);ReadFile(hFile, lpNtdllBuffer, dwSize, &dwBytesRead, NULL);CloseHandle(hFile);}}//取出导出表//DLL内存数据转成DOS头结构PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)lpNtdllBuffer;//取出PE头结构PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((ULONG_PTR)lpNtdllBuffer + pDosHeader->e_lfanew);//判断PE头导出表表是否为空if (pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress == 0) return functionAddress;//取出导出表偏移ULONG_PTR FileOffset = pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;//取出节头结构PIMAGE_SECTION_HEADER pSectionHeader = (PIMAGE_SECTION_HEADER)((ULONG_PTR)pNtHeaders + sizeof(IMAGE_NT_HEADERS));PIMAGE_SECTION_HEADER pOldSectionHeader = pSectionHeader;//遍历节结构进行地址运算for (WORD Index = 0; Index < pNtHeaders->FileHeader.NumberOfSections; Index++, pSectionHeader++){if (pSectionHeader->VirtualAddress <= FileOffset && FileOffset <= pSectionHeader->VirtualAddress + pSectionHeader->SizeOfRawData){FileOffset = FileOffset - pSectionHeader->VirtualAddress + pSectionHeader->PointerToRawData;break;}}//导出表地址PIMAGE_EXPORT_DIRECTORY pExportDirectory = (PIMAGE_EXPORT_DIRECTORY)((ULONG_PTR)lpNtdllBuffer + FileOffset);//取出导出表函数地址FileOffset = pExportDirectory->AddressOfFunctions;//遍历节结构进行地址运算pSectionHeader = pOldSectionHeader;for (WORD Index = 0; Index < pNtHeaders->FileHeader.NumberOfSections; Index++, pSectionHeader++){if (pSectionHeader->VirtualAddress <= FileOffset && FileOffset <= pSectionHeader->VirtualAddress + pSectionHeader->SizeOfRawData){FileOffset = FileOffset - pSectionHeader->VirtualAddress + pSectionHeader->PointerToRawData;break;}}PLONG AddressOfFunctions = (PLONG)((ULONG_PTR)lpNtdllBuffer + FileOffset);//这里注意一下foa和rva......int main(){CustomNtFunction2("ZwResumeThread");CustomNtFunction2("NtSuspendThread");HANDLE hThread = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());CONTEXT context;memset(&context, 0, sizeof(CONTEXT));context.ContextFlags = CONTEXT_DEBUG_REGISTERS;//NtGetContextThreadpNtGetContextThread = (PNtGetContextThread)CustomNtFunction2("NtGetContextThread");pNtGetContextThread(hThread, &context);//NtSetContextThreadpNtSetContextThread = (PNtSetContextThread)CustomNtFunction2("ZwSetContextThread");pNtSetContextThread(hThread, &context);NtProtectVirtualMemorySIZE_T size = 1;ULONG OldProtect = 0;PVOID addr = (PVOID)GetModuleHandle(nullptr);pNtProtectVirtualMemory = (PNtProtectVirtualMemory)CustomNtFunction2("NtProtectVirtualMemory");pNtProtectVirtualMemory((HANDLE)-1, &addr, &size, PAGE_EXECUTE_READWRITE, &OldProtect);system("pause");return 0;}
圈子介绍
博主介绍:
目前工作在某安全公司攻防实验室,一线攻击队选手。自2022-2024年总计参加过30+次省/市级攻防演练,擅长工具开发、免杀、代码审计、信息收集、内网渗透等安全技术。
目前已经更新的免杀内容:
一键击溃360+核晶
一键击溃windows defender
一键击溃火绒进程
CobaltStrike4.9.1二开
CobaltStrike免杀加载器
数据库直连工具免杀版
aspx文件自动上线cobaltbrike
jsp文件自动上线cobaltbrike
哥斯拉免杀工具 XlByPassGodzilla
冰蝎免杀工具 XlByPassBehinder
冰蝎星落专版 xlbehinder
正向代理工具 xleoreg
反向代理工具xlfrc
内网扫描工具 xlscan
CS免杀加载器 xlbpcs
Todesk/向日葵密码读取工具
导出lsass内存工具 xlrls
绕过WAF免杀工具 ByPassWAF
等等...
往期推荐
1.
3
4
5.
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……




还没有评论,来说两句吧...