crummie5/FreshyCalls
GitHub: crummie5/FreshyCalls
一个基于 C++17 的 Windows x64 系统调用封装库,通过动态解析调用号和掩码桩技术简化直接系统调用并规避 EDR 检测。
Stars: 357 | Forks: 38
## FreshyCalls:鲜榨系统调用!
**使用 C++17**
**仅支持 x64**
FreshyCalls 试图让系统调用的使用变得舒适且简单,同时避免生成过多的样板代码,并采用现代 C++ 风格!
你是否厌倦了必须在模块中定义每个系统调用桩或函数?或者不得不依赖 Windows 版本来确定系统调用?好吧,忘掉这一切吧。FreshyCalls 利用了 C++11 引入的特性(如变参模板)以及一些自定义的微型 Shellcode 来避免这些问题。
这个库是我们几个月来研究系统调用的产物。例如,系统调用号的提取是我们在研究系统调用工作原理时偶然发现的。我们注意到系统调用号和桩函数的地址之间存在某种联系。
而掩码桩函数的想法则是在研究 InstrumentationCallback(Ionescu 的杰出工作,[more info here](https://github.com/ionescu007/HookingNirvana))并观察 ScyllaHide 的实现方式后产生的。
我们意识到它们是 [detecting manual syscalls by checking the return address](https://github.com/x64dbg/ScyllaHide/blob/master/HookLibrary/HookedFunctions.cpp#L176-L187),所以我们认为 AV/EDR 解决方案可能也在这样做,因此我们实现了它。当然,这把双刃剑既可能是“好事”也可能是“坏事”,你避免了它们知道这是手动系统调用(至少对于 InstrumentationCallback 方法而言),但也让它们更容易检测到执行了哪个系统调用。
`CallSyscall`/`DirectCallSyscall` 返回一个代表调用结果的结构体 `FunctionResult`。这将有助于错误处理。请注意,其余函数会进行内部错误处理,并可能会抛出异常。
例如,PoC 中的一段代码:
```
syscall.CallSyscall("NtOpenProcessToken", HANDLE(-1), TOKEN_ADJUST_PRIVILEGES, &token_handle)
.OrDie("[ActiveSeDebug] An error happened while opening the current process token: \"{{result_msg}}\" (Error Code: {{result_as_hex}})");
```
请注意,我们发布这个库只是为了“好玩”,它绝非完美。你应该预料到会有一些 Bug。
你可以在 [here](https://github.com/Crummie5/Freshycalls_PoC) 找到使用示例,并在 [here](https://www.crummie5.club/freshycalls/) 找到对其进行更多解释的文章
标签:C++17, DNS 反向解析, DOM解析, Hpfeeds, HTTP头分析, Shellcode, Syscall, Web开发, Windows内核, XML 请求, YAML, 中高交互蜜罐, 免杀技术, 反调试, 安全库, 安全开发, 恶意软件开发, 技术调研, 暴力破解检测, 白帽子, 端点可见性, 系统调用, 高危端口监控