系统安全工具软件C/C++一线开发 [2021]不用hook在R3实现全局捕获syscall调用 在R3下ETW实现了一套接口允许你拿到一些syscall调用信息 在cmd下,输入如下代码: ```cpp logman start "NT Kernel Logger" -p "Windows Kernel Trace" (syscall) -o sys.etl -ets ``` 一段时间后停止 ```cpp logman stop "NT Kernel Logger" -ets ``` 接着转换成可读的格式: ```cpp tracerpt sys.etl ``` 你就看到对应的syscall了: ![](https://key08.com/usr/uploads/2021/10/2047136662.png) **但是,看情况我们目前只能拿得到两个信息: ** 1. syscall的index 2. syscall的处理器id 3. syscall的地址 **我们没办法拿到的信息并且是关键信息的有: ** 1. syscall的进程id 2. syscall的具体名字/内容 **我将会在这篇文章介绍一种非常巧妙的移花接木的方法来获取这些必要信息并且实现r3的dll注入检测 ** ### 线程切换 我们需要第一步推导出syscall的调用者是谁,但是etw并没有给我们更多的详细信息,因此我们需要做一个hack去获取它,那就是通过线程切换事件 线程切换事件ETW也会给我们消息,我们能知道: 1.老线程id 2.新线程id 3.老线程的状态 4.当前处理器id 阅读全文 2021-10-19 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 条评论
系统安全二进制安全C/C++汇编一线开发 [2021]漫游微软屎山 win32kfull.sys (一) ssdt和shadow ssdt 微软的win32kfull.sys这玩意绝对是,微软整个操作系统上漏洞最多的驱动之一,因为他的代码是从win3.1一路贴屎山贴过来的,在如今windows 20h2最新系统上,你任然可以看到某些莫名其妙的函数 ![](https://key08.com/usr/uploads/2021/09/322474017.png) lszzz zzz qqqqzzzqx等奇怪的看起来就像是屎山的代码 过去二十年,微软这玩意一直是漏洞报告的重头戏,各种本地提权、rce层出不穷,其恶劣程度堪比rpc和wmi.因此我准备单独开一系列介绍这个win32kfull.sys(本人也在持续逆向他中) ## ssdt和shadow ssdt 总所周知,x64后大部分常规API进内核的方式是syscall,当有syscall指令后,cpu会把rip指向amd64_lstar这个寄存器里面的地址,操作系统则把这个寄存器改成自己的进内核的函数,微软windows下这个r3和内核交互的函数名字叫做 kisystemcall64 而操作系统的大部分跟R3交互的API 都是一套叫做SSDT的机制控制的,并且如果是涉及到图形的api 则是放在shadow ssdt也就是sssdt,为什么要这样放,因为内核实在是没办法塞下win3.1的垃圾屎山代码.也没办法重构,所以干脆分开 阅读全文 2021-09-04 huoji 0 条评论
C/C++游戏安全一线开发 [2021]TEA加密 在游戏项目中,一般需要对资源或数据进行加密保护,最简单高效的加密算法就是采用位与或之类的,但是比较容易被人分析出来。 TEA加密算法不但比较简单,而且有很强的抗差分分析能力,加密速度也比较快。可以根据项目需求设置加密轮数来增加加密强度。 1.加密核心函数 阅读全文 2021-08-21 huoji 0 条评论
系统安全C/C++汇编 [2021]Windows PatchGuard KiErrata671Present 在一次偶然中我发现了KiErrata671Present,它这个看起来长这样: ![](https://key08.com/usr/uploads/2021/08/1055346649.png) 人畜无害 但是看调用: ![](https://key08.com/usr/uploads/2021/08/1257889702.png) 第一眼看不出什么 让我们慢慢解释一下: ![](https://key08.com/usr/uploads/2021/08/1678044808.png) 请注意,ida反汇编的代码是没有try和catch的,在汇编里面,你可以看得到如下的代码: ![](https://key08.com/usr/uploads/2021/08/1437456579.png) 通俗的解释一下 1.去掉页面保护 2.给KiErrata671Present + 0x2的位置写0xC3 让其从1返回为0 3.执行KiErrata671Present 4.恢复页面保护 这样做会有什么效果: 一些hypervisor中的EPT/NPT hook技术会让页面读写执行分离实现无痕hook,如果在有EPT/NPT HOOK的情况下并且这个函数正好与某些保护页面在同一页的情况下,第2步(给KiErrata671Present + 0x2的位置写0xC3 让其从1返回为0)不会被写入执行页面,导致执行结果依然是1,从而让其检测到hypervisor,不过这也只是猜测,因为目前有几个不确定: 1. 这个是1809的东西,为什么目前没有1809的ept hook出错的报告 2. 这个东西是如何调用的,会在哪调用,哪些页面会有这个东西,目前来说并不知道 阅读全文 2021-08-18 huoji 5 条评论
系统安全工具软件二进制安全C/C++一线开发 [2021]检测Cobalt Strike只使用40行代码 无文件落地的木马主要是一段可以自定位的shellcode组成,特点是没有文件,可以附加到任何进程里面执行。一旦特征码被捕获甚至是只需要xor一次就能改变特征码.由于传统安全软件是基于文件检测的,对目前越来越多的无文件落地木马检查效果差. **基于内存行为特征的检测方式,可以通过检测执行代码是否在正常文件镜像区段内去识别是否是无文件木马.由于cobaltstrike等无文件木马区段所在的是private内存,所以在执行loadimage回调的时候可以通过堆栈回溯快速确认是否是无文件木马** 检测只需要40行代码: 1. 在loadimagecallback上做堆栈回溯 2. 发现是private区域的内存并且是excute权限的code在加载dll,极有可能,非常有可能是无文件木马或者是shellcode在运行 核心代码如下: 阅读全文 2021-07-25 huoji 0 条评论
C/C++ [2021]一些非常常见的Native API结构 一些非常常见的Native API结构 包含object type、thread、pe等: 阅读全文 2021-07-16 huoji 0 条评论