知识点
1、DLL劫持-自写&导入
2、DLL劫持-重写&分离
3、syscall-底层&项目
编译代码面-ShellCode-混淆
编译代码面-编辑执行器-编写
编译代码面-分离加载器-编写
程序文件面-特征码定位-修改
程序文件面-加壳花指令-资源
代码加载面-Dll反射劫持-加载
权限逻辑面-杀毒进程干扰-结束
工具数据面-通讯内存流量-动态
对抗目标:
X60 Defender 某绒 管家 VT等
编程语言:
C/C++ Python C
涉及技术:
ShellCode混淆,无文件落地,分离拆分,白名单,DLL加载,Syscall,加壳加花,
资源修改,特征修改,二次开发CS,内存休眠,进程注入,反沙盒,反调试,CDN解析等
演示案例:
1、C&Py-DLL劫持-语言-调用加载
2、C&C++-DLL劫持-白加黑-导入加载
3、C&C++-DLL劫持-白加黑-导出编译
4、C&C++-DLL劫持-白加黑-图片分离
5、C&C++-Syscall底层-加载器生成-项目
-dll.c生成dll
-dll.py调用dll
StudyPE导入DLL生成
导出源码:Dependencies
编译执行:dllmain.cpp
图片分离:https://github.com/Mr-Un1k0d3r/DKMC
gen
set shellcode xxxxxx
run
编译执行:dllmain-image.cpp
Windows下有两种处理器访问模式:用户模式(user mode)和内核模式(kernel mode)。用户模式下运行应用程序时,Windows 会为该程序创建一个新进程,提供一个私有虚拟地址空间和一个私有句柄表,因为私有,一个应用程序无法修改另一个应用程序的私有虚拟地址空间的数据;内核模式下,所有运行的代码都共享一个虚拟地址空间, 因此内核中驱动程序可能还会因为写入错误的地址空间导致其他驱动程序甚至系统出现错误。内核中包含了大部分操作系统的内部数据结构,所以用户模式下的应用程序在访问这些数据结构或调用内部Windows例程以执行特权操作的时候,必须先从用户模式切换到内核模式,这里就涉及到系统调用。
x86 windows 使用 sysenter 实现系统调用。
x64 windows 使用 syscall 实现系统调用。
https://github.com/icyguider/Shhhloader
https://j00ru.vexillium.org/syscalls/nt/64/
https://github.com/7BitsTeam/EDR-Bypass-demo
https://cloud.tencent.com/developer/article/1944012
总结
之前介绍的是exe,现在讲的是"dll加载",当然exe的免杀技巧也可以用到dll加载上,比如加密混淆、分离等
dll加载主要涉及以下几种方式:
1、自写DLL调用加载:
由于dll无法直接执行,所以可以写一个py文件打包成exe,其只是用来调用dll,而dll中写有shellcode
2、DLL劫持-白加黑-导入加载:
利用进程工具获取白应用执行要加载哪些dll,将其中某个dll导入pe工具添加恶意dll函数,然后替换原来的dll,最后运行白应用
3、DLL劫持-白加黑-导出编译:(适用某些会检测dll劫持的应用,或者不能用pe工具导入dll函数的)
利用进程工具获取白应用执行要加载哪些dll,将其中某个dll导入反编译工具重新编译并添加上线功能,然后替换原来的dll,最后运行白应用
4、DLL劫持-白加黑-图片分离:
和之前所讲的图片隐写差不读,也就是在2或者3的基础上进行了分离,shellcode从图片中获取,增强免杀性
5、C&C++-Syscall底层-加载器生成-项目
没有用syscall实现上线时,会调用很多dll,然后dll会调用底层的函数,然后上线
使用syscall上线时,会直接调用底层函数上线,可以绕过一些EDR基于行为的检测