制作一个PoC DLL这个PoC DLL的目标非常简单 。我想记录一些关于加载它的进程的关键信息:命令行、当前用户名、PID和PPID 。所有这些都会被记录到C:tempdll.log中 。
首先 , 我想出了以下代码 。TrackCall()函数负责收集和记录信息 。它会被DllMain()和QueryDeviceInformation()执行 , 用来跟踪它的调用者 。
#include <Windows.h>#include <IOStream>#include <Lmcons.h> // UNLEN + GetUserName#include <tlhelp32.h> // CreateToolhelp32Snapshot()int TrackCall(const wchar_t * callingFrom){WCHAR strSt[4096], strUsername[UNLEN + 1];WCHAR * strComandLine;SYSTEMTIME st;HANDLE hFile, hToolhelpSnapshot;PROCESSENTRY32 stProcessEntry;Dword dwPcbBuffer = UNLEN, dwBytesWritten, dwProcessId, dwParentProcessId;BOOL bResult;strComandLine = GetCommandLine(); // Get Command line of the current processbResult = GetUserName(strUsername, &dwPcbBuffer); // Get current user namedwProcessId = GetCurrentProcessId(); // Get PID// Get PPIDhToolhelpSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAppROCESS, 0);stProcessEntry = { 0 };stProcessEntry.dwSize = sizeof(PROCESSENTRY32);dwParentProcessId = 0;if (Process32First(hToolhelpSnapshot, &stProcessEntry)) {do {if (stProcessEntry.th32ProcessID == dwProcessId) {dwParentProcessId = stProcessEntry.th32ParentProcessID;break;}} while (Process32Next(hToolhelpSnapshot, &stProcessEntry));}CloseHandle(hToolhelpSnapshot);// Create log entryGetLocalTime(&st);wsprintfW(strSt, L"[%.2u:%.2u:%.2u] - PID=%d - PPID=%d - USER='%s' - CMD='%s' - METHOD='%s'n", st.wHour, st.wMinute, st.wSecond, dwProcessId, dwParentProcessId, strUsername, strComandLine, callingFrom);// Save to log filehFile = CreateFile(L"C:Tempdll.log", FILE_APPEND_DATA, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile != INVALID_HANDLE_VALUE)bResult = WriteFile(hFile, strSt, lstrlenW(strSt)*sizeof(WCHAR), &dwBytesWritten, NULL);CloseHandle(hFile);return S_OK;}HRESULT __stdcall QueryDeviceInformation(){TrackCall(L"QueryDeviceInformation()");return S_OK;}BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:TrackCall(L"DllMain()");break;case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;}然后 , 作为管理员 , 我把这个DLL复制到C:/Windows/System32 , 然后 , 等待它被调用…
文章插图
过了一会儿 , windowscoredeviceinfo.dll的调用终于出现在Process Monitor中 。所有的CreateFile操作都成功返回 。但是 , 在C:temp中没有创建日志文件的迹象 。当然 , 这意味着DLL没有被正确加载 , 问题是:为什么?我猜测 , 我创建的DLL没有导出进程所需的所有函数 。

文章插图
此时 , 我不知道该如何继续 , 但是 , 当我回到Process Monitor时 , 我看到了一些以前没有看到的事件 。
文件windowscoredeviceinfo.dll也被一个名为usocoreworker.exe的进程加载 , 这个进程的权限为NT AUTHORITY/System 。这时 , 一些信息被记录到C:Tempdll.log中 , 这说明代码此时已经正确执行了 。
这看起来更有希望 , 所以我决定抛开DiagTrack服务 , 看看这个新目标 。
转移到新目标我们又回到了起点 。我们需要找出usocoreworker.exe进程是如何创建的 。为此 , 我们可以寻找与写入日志文件的PPID对应的进程 。根据任务管理器 , 它是svchost.exe的一个实例 , 就像大多数Windows服务一样 , 所以PPID对我们的帮助不大 。

文章插图
对应的服务是 BrokerInfrastructure , 它的描述是 “处理后台任务” 。好吧 , 这也没什么用…… 。
推荐阅读
- 英雄联盟特权服务15个皮肤有哪些?
- 哪些高速公路收费站和服务区关闭关停?何时开放?怎样绕行?公示汇总信息在这儿查
- 微服务核心技术——负载均衡
- 超简单本地备份服务器搭建攻略
- 花了17年!微软修复Windows DNS服务器漏洞
- 对DBA、开发、测试、产品同时友好 大规模多存储场景的数据库选型与服务平台建设
- 现代服务业包括哪些行业?
- linux下多线程与并发服务器设计方案及常见问题
- kali linux之应用层Dos
- 服务器|中科院回应停用知网:近千万续订费太贵 将用万方和维普替代
