杀软对抗 --->Bypass Ring3 Hook的魅力

这几天在看Bypass Ring3 Hook的时候看到一些不错的文章以及学习到一些不错的技术,下面就来给大家分享一下ByPass对抗中的魅力!!

1.Ring3 Hook 

首先,我们得先来了解一下3环的钩子

像我们调用一些像VirtualAlloc CreateThread 这种敏感API的时候,大部分都是找到Ntdll中的ZW或者NT函数,然后通syscall进入0环的,那么有一些杀软(Bit Defender),和一些EDR就会对NT函数进行HOOK

就像上面这样,本来我们调用NtCreateThreadEx的时候是通过这样进入Ring 0 的

    mov r10,rcx; 
    mov eax,ssn;
    syscall
    ret

但是如果在Ring3 被Hook之后,就会变成这样的代码,直接jmp到了他们自己的代码段

2.EDR Hook  

首先,一些EDR或者AV会往你的跑起来的程序里面注入一个他们自己的DLL(Bit Defender为例)

当你进行一些敏感的操作的时候像什么 线程注入,OpenProcess,dumplsass,强杀进程的时候就会对你进行监控或者拦截,这就是Ring3 Hook! 

3.Bypass Ring3 Hook的方式

我们这里讲几种比较常用的去bypassHook的方式

1.Unhook

对于Unhook,我们有很多的办法,其中最常见的就是一个重载ntdll.dll,通过重载Ntdll,我们就能拿到一份干净的,没有被AV或者EDR进行Hook的Ntdll,通过重载Ntdll,我们就能绕过AV或者EDR在Ring3 的Hook!!! (Bit Defender就能这么绕过!!)  具体代码实现后续会更新!!

2.Syscall 

这里我们先不分他是间接还是直接syscall,我们来看看Syscall为什么能绕过Ring 3的Hook!

首先,我们前面讲过动态调用! 下面我就拿NtCreateThread的动态调用来举例子

Fn_NtCreateThreadEx	 eva_NtCreateThreadEx;
nt.eva_NtCreateThreadEx	= (Fn_NtCreateThreadEx)GetFunctionAddress(hNt32,"NtCreateThreadEx");

通过NT动态调用NT函数,我们能成功隐藏导入表中的CreateThread这个API,但是!!  

这样能绕过Hook吗 ???

 ::肯定不可以啊!!!!

就算你是动态的调用Nt函数,你的Ntdll已经是被Hook的了,你获取到的NtCreateThreadEx这个地址,早已经是被替换成jmp去他们杀软/EDR自己的dll中了!!! 这个是绝对Bypass 不了Hook的!(这个一定要搞清楚) 

也就是说,调用Nt函数(无论是你动态调用,还是走常规的调用链),都是绕不过Ring3的Hook的!!  而且 动态调用Nt函数不等于Syscall !!!!!!这个是重中之重

所以我们的syscall是怎么实现的呢,基本上是这样的(我那sys whispers3举例)

首先去写一个汇编文件 其中Sw3NtCreadThreadEx 就是我们的syscall函数

然后我们去导出这个函数

然后当我们直接调用这个函数的时候就是其实就是进行Syscall!!!

(当然中间还得一些ssn获取等等函数实现我省略了)

通过Syscall,我们就能实现很好的和杀毒软件对抗的效果!!!

4.杀软&&免杀的对抗

1.Reload Ntdll的对抗

从杀软层面:

可以添加规则,如果你一旦获取到了ntdll的句柄(无论是什么路径下的NTDLL,规则都加上),我立刻查杀或者重点监控

从免杀对抗层面:

  

自己传一个NTDLL,或者把他改一个名字传上去!!(防止匹配NTDLL的字样)

甚至还可以内存加载直接无文件落地拿到NTDLL的句柄

2.Syscall的对抗

从杀软层面:

 

当你文件落地的时候我就去扫描你的文件,看下你的静态有无syscall这种字样!!

从免杀对抗层面:

  

静态我填充垃圾字符,当我运行的时候再把syscall改回去,(Sys Whisper的实现!!)

unsigned char egg[] = { 0x77, 0x00, 0x00, 0x74, 0x77, 0x00, 0x00, 0x74 }; 
//w00tw00t
unsigned char replace[] = { 0x0f, 0x05, 0x90, 0x90, 0xC3, 0x90, 0xCC, 0xCC
}; // syscall; nop; nop; ret; nop; int3; int3

 再来!!!!

从杀软层面:

 

我通过栈回溯,看一下你返回的进程链有无问题(检测ret是不是在ntdll,然后再往回走,防止你在代码段直接syscall!)

从对抗层面:

   

不直接syscall,而是通过伪造一个完整的进程调用链,也就是说不直接syscall,而是在获取到ntdll中syscall的地址之后jmp过去 (Hell's Hall的原理!)地狱之门的诞生!!!

不服??? 我还能继续!!! 

从对抗层面:

  

我还可以玩VEH!!在调用产生异常的时候通过veh异常来接管,构造stub然后用我们找到的syscall的地址来进行调用。这样栈回溯的时候也是ntdll的合法地址,规避了检测。

不服?? 还能再来??

从杀软层面:

 

我检测 mov eax, ssn 这种代码,检测到之后直接给你杀死!!

从对抗层面:

  

我通过替换,打乱调用规则(有点绕WAF的感觉了)

mov  rcx ,  ssn
mov  eax ,  rcx

等等等等......  总之道高一尺魔高一丈,对抗一直都是很多的!!! 

  ::也正是从这对抗中我们除了能学习到红队人员的强大对抗思路以外,我们还能感受到红蓝对抗的乐趣与魅力!!!  

  • 29
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这句话的意思是:husky > pre-commit hook 失败了(添加 --no-verify 来过)。 其中,husky 是一个 Git 钩子管理工具,pre-commit hook 是其中的一个钩子,用于在提交代码前执行一些操作,比如代码格式化、代码检查等。如果 pre-commit hook 失败了,就会出现这个提示。 提示中提到了一个 --no-verify 参数,可以用来过 pre-commit hook 的检查。但是,这并不是一个好的做法,因为 pre-commit hook 的目的就是为了保证代码的质量和规范性,过它可能会导致代码质量下降。所以,我们应该尽量避免使用 --no-verify 参数,而是要修复 pre-commit hook 的问题。 ### 回答2: 此问题涉及到git中的pre-commit钩子(hook),可以通过加入--no-verify命令来过验证。 在git中,pre-commit钩子是用于在代码提交前运行脚本的钩子。它用于在代码提交之前进行某些操作,如代码规范检查、语法检查和单元测试。如果pre-commit钩子在运行期间发现问题,则会防止代码提交。 然而,在某些情况下,因为某些原因,pre-commit钩子可能会失败。当您尝试提交代码时,您可能会看到如下错误消息:“husky > pre-commit hook failed (add --no-verify to bypass)”。 在这种情况下,可以使用--no-verify命令来过这个问题,如下所示: ``` git commit --no-verify -m "commit message" ``` 这将过pre-commit钩子并执行提交。但是请注意,这只会在特殊情况下使用,如果pre-commit钩子出现问题,最好不要轻易过它,而是需检查并解决问题。 解决pre-commit hook失败通常需要检查pre-commit脚本中的代码以确定具体错误,例如检查代码中的错误、语法错误等等。通过解决这些问题,可以解决pre-commit hook失败的问题。 总之,当您在git中遇到husky > pre-commit hook failed (add --no-verify to bypass)问题时,您可以使用--no-verify命令来过它,但是最好的解决方法是检查并解决pre-commit脚本中的问题。 ### 回答3: 这个问题通常发生在使用git管理代码时出现的错误,可能有几种情况导致这个错误的出现。首先,Husky是一个流行的Git Hook库,它能够在Git操作的不同阶段自动运行脚本。这个错误通常涉及到Husky的“pre-commit hook”,也就是在提交代码前验证代码质量的钩子。 什么是Git钩子? Git钩子是一些自动运行的脚本,它们被设置在特定的Git事件上,例如提交代码、合并代码等。Git钩子路径存放在.git/hooks目录下,你可以在这个目录下查看和编辑所有可用的Git钩子。 原因一:Husky pre-commit hook 校验失败 当你将代码提交到Git仓库的时候,Husky pre-commit hook 会自动运行验证脚本来保证代码的质量。如果这些验证脚本出现了问题,Husky会报错并禁止提交代码,出现“husky > pre-commit hook failed”这个错误。这时需要检查校验代码的脚本是否有问题,例如是否有语法错误或者程序错误等。 原因二:Git 钩子脚本出现错误 除了Husky pre-commit hook校验失败之外,还有可能是Git钩子脚本出现了错误。例如,某些开发者可能会自己编写Git钩子脚本,如果这个脚本出现了问题,就会导致上述错误的出现。这时,需要检查Git钩子脚本的路径是否正确、脚本是否有语法错误或程序错误等。 如何解决 为了解决这个错误,你可以使用”–no-verify”参数来过Git钩子的校验。但这并不是一个好的解决方案,因为这意味着你无法保证你提交的代码符合你自己或你团队的代码质量标准。正确的解决方案是修复你的Husky pre-commit hook验证脚本或者Git钩子脚本错误,并再次尝试提交提交你的代码。如果你不确定如何修复这些错误,可以向你的团队或社区寻求帮助。如果你遇到了严重的错误,你可能需要卸载和重新安装Husky。 总之,当你遇到“husky > pre-commit hook failed”这个错误时,你应该在修复验证脚本或Git钩子脚本之后再次尝试提交你的代码,而不是仅仅“过”钩子的校验。这将帮助你加强你的代码质量和保持团队的开发标准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值