系统安全二进制安全C/C++汇编 [2020]微软windows defender研究.pdf 主要说了微软的defender是如何做虚拟执行的 反cpuid反虚拟机 ![](https://key08.com/usr/uploads/2021/10/2461615230.png) 虚拟文件系统(注意这是不可见的,平时也没这些目录,但是在杀毒的时候defender就会生成) ![](https://key08.com/usr/uploads/2021/10/1349146434.png) 虚拟注册表 ![](https://key08.com/usr/uploads/2021/10/1427939148.png) JavaScript引擎 ![](https://key08.com/usr/uploads/2021/10/2711418115.png) vmp、net 脱壳/jit解析 ![](https://key08.com/usr/uploads/2021/10/2836626296.png) pdf文件 链接:https://pan.baidu.com/s/15msYM6Ye1Bu5mJdr_vpMow 提取码:7nua 阅读全文 2021-10-23 huoji 0 条评论
系统安全二进制安全 [2021]微软的两处内存泄露 ### Microsoft Kernel Memory Leak ***Please note that this is only a brief code bug. It is not a security problem and will not cause any security problems*** There are memory leaks in two Microsoft APIs: ``` win32kbase!NtDCompositionCommitSynchronizationObject win32kbase!NtGdiGetCertificate ``` 阅读全文 2021-10-14 huoji 0 条评论
系统安全二进制安全C/C++ [2021]R0驱动内对Windows数字签名验证的大概流程 因为某些原因我不得不抛弃wintrust机制而自己在内核实现驱动数字签名验证,因此有了这篇文章: 首先PE文件有两种信息,一个是catalog一个是pe自带签名,目前文章只介绍PE自带签名,catalog签名较为简单,不做论述 数字签名验证分为几步: 1. 解析pe拿到security data 2. 通过asn1解析"signed security data"拿到证书信息(最为复杂) 3. 交叉验证证书链上的证书,拿到root证书,这个过程中还需要对证书是否被窜改进行确认,这个过程中确认时间戳 4. 检查root证书是否可信 5. 拿到证书hash算法,并且计算PE的hash,再拿PE的hash跟证书hash进行匹配,这一步确认PE是否有效 由于某些问题,不能直接开源代码,但是能稍微的介绍一下这个过程: 阅读全文 2021-09-23 huoji 0 条评论
系统安全 [2021]windows 11 :TPM 和数字主权 你可能已经注意到,也可能没有注意到,很多人都想知道 Microsoft 针对 Windows 11 的新的强制性 TPM 2.0 硬件要求。如果你环顾新闻稿、浅显的技术文档以及诸如“安全性”、“设备健康”、“固件漏洞”和“恶意软件”,你仍然没有得到一个关于为什么你需要这项技术的直接答案。 ![](https://key08.com/usr/uploads/2021/07/950461748.png) 阅读本文的许多人可能在房子或办公室周围都有机器,它们是用甚至不到七年的硅制造的。这些仍然可以玩当今的最新游戏而不会出现故障或问题,除非你最近让你的祖母或 6 岁的侄子在机器上,否则你可能也没有恶意软件。 那么,你会问,为什么我的机器上突然需要一个 TPM 2.0 设备?嗯,答案很简单。这与你无关;是关于他们的。 阅读全文 2021-07-02 huoji 0 条评论
C/C++一线开发 [2021]微软ApiSetMap的MEME windows ApiSetMap机制是win7以后最奇怪的机制之一,老外在博客上评论是"but no one really know why its useful.".特征就是在你编译你的dll后你的一些导入表的api的dll本来是kernel32.dll的会变成api-min-xxxxx.dll 这会导致很多问题,**比如沙箱解析、和内存注入失败** ## 为什么会存在这个机制 微软目标是将“API”功能(堆分配、字符串操作等)与子系统实现(枚举进程、注册服务等)分离,因此使用ApiSetMap机制,准备分离这些api. 但是写到一半估计是不想继续写了,于是烂尾了.然后导致各种api-ms-xxxxx丢失 ## 解析 详细解析可以在先知社区查看: https://xz.aliyun.com/t/7019 对于沙箱,我用如下代码解析这个东西: ```cpp /* 解决掉api-ms-xxxxx */ typedef enum _WinVer { WINVER_7 = 0x0610, WINVER_7_SP1 = 0x0611, WINVER_8 = 0x0620, WINVER_81 = 0x0630, WINVER_10 = 0x0A00, WINVER_10_RS1 = 0x0A01, // Anniversary update WINVER_10_RS2 = 0x0A02, // Creators update WINVER_10_RS3 = 0x0A03, // Fall creators update WINVER_10_RS4 = 0x0A04, // Spring creators update WINVER_10_RS5 = 0x0A05, // October 2018 update WINVER_10_19H1 = 0x0A06, // May 2019 update 19H1 WINVER_10_19H2 = 0x0A07, // November 2019 update 19H2 WINVER_10_20H1 = 0x0A08, // April 2020 update 20H1 } WinVer; std::string get_dll_name_from_api_set_map(const std::string& api_set) { std::wstring wapi_set(api_set.begin(), api_set.end()); typedef LONG(__stdcall* fnRtlGetVersion)(PRTL_OSVERSIONINFOW lpVersionInformation); fnRtlGetVersion pRtlGetVersion = (fnRtlGetVersion)GetProcAddress(LoadLibraryA("ntdll.dll"), "RtlGetVersion"); RTL_OSVERSIONINFOEXW verInfo = { 0 }; verInfo.dwOSVersionInfoSize = sizeof(verInfo); pRtlGetVersion((PRTL_OSVERSIONINFOW)&verInfo); ULONG ver_short = (verInfo.dwMajorVersion << 8) | (verInfo.dwMinorVersion << 4) | verInfo.wServicePackMajor; if (ver_short >= WINVER_10) { auto apiSetMap = (API_SET_NAMESPACE_ARRAY_10*)((X64PEB*)__readgsqword(0x60))->ApiSetMap; auto apiSetMapAsNumber = reinterpret_cast(apiSetMap); auto nsEntry = reinterpret_cast((apiSetMap->Start + apiSetMapAsNumber)); for (ULONG i = 0; i < apiSetMap->Count; i++) { UNICODE_STRING nameString, valueString; nameString.MaximumLength = static_cast(nsEntry->NameLength); nameString.Length = static_cast(nsEntry->NameLength); nameString.Buffer = reinterpret_cast(apiSetMapAsNumber + nsEntry->NameOffset); std::wstring name = std::wstring(nameString.Buffer, nameString.Length / sizeof(WCHAR)) + L".dll"; if (_wcsicmp(wapi_set.c_str(), name.c_str()) == 0) { auto valueEntry = reinterpret_cast(apiSetMapAsNumber + nsEntry->ValueOffset); if (nsEntry->ValueCount == 0) return ""; valueString.Buffer = reinterpret_cast(apiSetMapAsNumber + valueEntry->ValueOffset); valueString.MaximumLength = static_cast(valueEntry->ValueLength); valueString.Length = static_cast(valueEntry->ValueLength); auto value = std::wstring(valueString.Buffer, valueString.Length / sizeof(WCHAR)); //note: there might be more than one value, but we will just return the first one.. return std::string(value.begin(), value.end()); } nsEntry++; } } else { __debugbreak(); } return ""; } ``` 阅读全文 2021-06-07 huoji 0 条评论
APT研究系统安全 [2021]windows威胁猎捕 (二) 继上一篇 [[2021]windows威胁猎捕 (一)](https://key08.com/index.php/2021/05/30/1118.html "[2021]windows威胁猎捕 (一)") 后,本篇介绍如下内容: 1.BloodHound检测 2.office宏后门检测 3.注册表可疑字符串检测 4.RDPWrapp劫持 5.系统时间变化 ## 1.BloodHound检测 BloodHound是一个域渗透分析工具.BloodHound以用图与线的形式,将域内用户、计算机、组、Sessions、ACLs以及域内所有相关用户、组、计算机、登陆信息、访问控制策略之间的关系更直观的展现在Red Team面前进行更便捷的分析域内情况,更快速的在域内提升自己的权限。它也可以使Blue Team成员对己方网络系统进行更好的安全检测及保证域的安全性。 具体可看: https://www.freebuf.com/sectool/179002.html 特征: 别人扫你的时候,srvsvc、lsarpc、samr会有管道连接 检测: ETW ID为18的事件(pipe connect)和ETW ID为3的(network connect)事件中: > ipport:389 or ipport:636 and ipport:445 and filemod:srvsvc and filemod:lsass EventID-5145 and RelativeTargetName={srvcsvc or lsarpc or samr} 阅读全文 2021-06-05 huoji 0 条评论
二进制安全C/C++汇编Shellcode [2021]微软存在的一处内存泄露 在做EFI驱动的时候,会发现有疑似内存泄露,但不知道为什么.经过很久的调试,发现并不是EFI的代码的问题.而是微软自己的问题! 微软自己存在一处内存泄露.只不过EFI驱动多次调用这个API进行通讯导致从不明显的泄露成了明显的泄露 阅读全文 2021-05-21 huoji 0 条评论