本帖最后由 datochan 于 2023-8-19 21:23 编辑
本菜鸡最近在分析一款软件,查壳信息是:
Themida & WinLicense 2.0 - 2.4.6
由于本人的菜鸡属性,没信心将这个壳脱掉。所以想着带壳分析。可是分析效果如下:
1 如果用调试器加载启动,没有任何问题。内存断点、硬件断点等等随便折腾。
2 如果用调试器附加的方式进行调试,问题就比较多了,比如: 附加时程序直接退出、附加后运行程序直接退出、运行后下任何断点都出发系统异常: 比如 int3断点就是单步异常 ,内存断点就是0xC0000005 之类的的异常。
这差异就触发了我的好奇心,就想好好研究一下是怎么回事儿。将StrongOD 和ScyllaHide 的配置调了再调,改了再改,感觉作用不大...
于是,我就自己研究,成果如下:
-
程序 HOOK 了DbgBreakPoint 、CheckRemoteDebuggerPresent 、SetUnhandledExceptionFilter 调试器附加之前会将这些hook都还原掉,如此附加程序,在调试器中运行程序,程序不会退出了。
这里我就有个疑问,这些常见的处理,ScyllaHide 插件应该都可以搞定的呀,为啥不起作用还得我自己手工unkook?
-
此时调试器不能下任何断点,否则就会触发异常,感觉就是调试器无法拦截调试事件了。直接系统报异常。
我检查了 NtQueryInfomationProcess的DebugPort, 也Hook了ZwSetInformationThread 防止程序设置 ThreadHideFromeDebugger 可是都没有效果。
于是就有两个问题一直困扰着我,所以起来请教各位大牛:
- 上面两个都是很常规的反调试、防止附加的手段。为啥
StrongOD 和ScyllaHide 会不起作用?
- 还有什么可以让调试器收不到调试事件的手段吗?现在程序可以在调试器中运行,但是只要下断点(任何断点: int3、内存读写、硬件断点)都会触发相应的异常,然后被操作系统拦截。
这里补一张我下内存断点之后内存非法访问的图:
内存读写以及设置内存访问权限的API都没有被挂钩,不知道它是怎么做到的,如果有后台线程在扫描,这内存非法访问的异常至少也应该先被调试器拦截到呀?
还望各位大佬给指点迷津,不胜感激~ |