datochan 发表于 2023-7-21 08:57

请教Themida带壳调试时OD无法接收到调试事件的问题

本帖最后由 datochan 于 2023-8-19 21:23 编辑

本菜鸡最近在分析一款软件,查壳信息是:
> Themida & WinLicense 2.0 - 2.4.6

由于本人的菜鸡属性,没信心将这个壳脱掉。所以想着带壳分析。可是分析效果如下:

1 如果用调试器加载启动,没有任何问题。内存断点、硬件断点等等随便折腾。
2 如果用调试器附加的方式进行调试,问题就比较多了,比如: 附加时程序直接退出、附加后运行程序直接退出、运行后下任何断点都出发系统异常: 比如 `int3断点就是单步异常`,内存断点就是`0xC0000005`之类的的异常。


这差异就触发了我的好奇心,就想好好研究一下是怎么回事儿。将`StrongOD`和`ScyllaHide`的配置调了再调,改了再改,感觉作用不大...
于是,我就自己研究,成果如下:

1. 程序 HOOK 了`DbgBreakPoint`、`CheckRemoteDebuggerPresent`、`SetUnhandledExceptionFilter` 调试器附加之前会将这些hook都还原掉,如此附加程序,在调试器中运行程序,程序不会退出了。
> 这里我就有个疑问,这些常见的处理,`ScyllaHide`插件应该都可以搞定的呀,为啥不起作用还得我自己手工unkook?

2. 此时调试器不能下任何断点,否则就会触发异常,感觉就是调试器无法拦截调试事件了。直接系统报异常。
> 我检查了 NtQueryInfomationProcess的DebugPort, 也Hook了ZwSetInformationThread 防止程序设置 ThreadHideFromeDebugger 可是都没有效果。

于是就有两个问题一直困扰着我,所以起来请教各位大牛:
1. 上面两个都是很常规的反调试、防止附加的手段。为啥`StrongOD`和`ScyllaHide`会不起作用?
2. 还有什么可以让调试器收不到调试事件的手段吗?现在程序可以在调试器中运行,但是只要下断点(任何断点: int3、内存读写、硬件断点)都会触发相应的异常,然后被操作系统拦截。

这里补一张我下内存断点之后内存非法访问的图:


内存读写以及设置内存访问权限的API都没有被挂钩,不知道它是怎么做到的,如果有后台线程在扫描,这内存非法访问的异常至少也应该先被调试器拦截到呀?

还望各位大佬给指点迷津,不胜感激~

魔弑神 发表于 2023-7-21 10:21

正常的附加创建的线程会走到DbgBreakPoint

然后就是HideFromDebugger,他会让调试器接受不到调试消息,至于你SetInformationThread,或许tmd dump了一份ntdll 又或者使用了系统调用,你都拦截不到
    if (PsGetCurrentThread()->CrossThreadFlags&PS_CROSS_THREAD_FLAGS_HIDEFROMDBG) {
      Port = NULL;
    } else {
      Port = Process->DebugPort;
    }

ring3下让调试器收不到调试事件 一个就是设置HideFromDebugger,另一种就是去搞调试句柄,也就是调试器进程创建的DebugObject句柄,修改句柄权限 关闭句柄也好都能让调试器调试事件失效

一般附加上去 中断后崩溃都是HideFromDebugger,更直观的话你可以设置个异常处理函数接受异常看看是不是你断点的异常code

datochan 发表于 2023-7-21 11:59

魔弑神 发表于 2023-7-21 10:21
正常的附加创建的线程会走到DbgBreakPoint

然后就是HideFromDebugger,他会让调试器接受不到调试消息,至 ...

哇哦~,多谢~
我按照你说的试试~

datochan 发表于 2023-8-19 21:22

本帖最后由 datochan 于 2023-8-19 21:25 编辑

魔弑神 发表于 2023-7-21 10:21
正常的附加创建的线程会走到DbgBreakPoint

然后就是HideFromDebugger,他会让调试器接受不到调试消息,至 ...
前些天一直在忙,这周末有时间就折腾了一下。问题解决了,过来结贴。

这个问题并不是 Themida 的问题,一开始我还以为是调试器被检测到了。后来我hook了ssdt才发现,程序启动后不论什么环境都各种调用 SetInformationThread 来设置 HideFromDebugger标记。

所以,无法收到调试信号的原因就是:SetInformationThread设置了 HideFromDebugger, 至于调试句柄并没有被动过。

我通过特征搜索过 ntdll再内存中并没有其它copy。至于我hook没有生效应该是 程序直接调用了更底层的系统调用。

ring3层我仍然没搞定,最后是hook了ssdt搞的。

再次感谢~

huaiman 发表于 2023-8-20 11:22

最终你脱掉了没

datochan 发表于 2023-8-22 15:54

huaiman 发表于 2023-8-20 11:22
最终你脱掉了没

兄台,我真没信心脱掉它。所以带壳分析的。
抱歉哈,让您失望了
页: [1]
查看完整版本: 请教Themida带壳调试时OD无法接收到调试事件的问题