171211 逆向-高级反调试技术
2017-12-13 00:52
330 查看
1625-5 王子昂 总结《2017年12月11日》 【连续第437天总结】
A. 《逆向工程核心原理》-高级反调试技术
B.
简单的只是在代码块之间放置一些垃圾代码,通过jmp跳过,使得反汇编不正确,进而影响F5的反编译
只需要清除干扰指令,或者动态调试跟一下就能很轻松的解决
复杂的则会随机插入大量的花指令,与正确代码混杂在一起,很难辨识
基本上只能靠动态调试来理清执行顺序,再进一步分析了
(其实是没见识过多少壳,不敢碰。看完这本去读《加密与解密》和52的教程再说吧)
简单来说就是将OEP的部分代码转移到另一个地方,使得很难Dump;另一方面对OEP的查找也会变得困难,陷入懵逼的境地
(当然知道了这种方法的存在也许会好点儿……吧)
OEP被转移的代码有时还会被处理,例如加花,动态解密,甚至运行完就删除……
安全人员的操作真是骚的不行OTZ
由于逆向人员可以直接将断点下在系统Dll中,从而断到关键API
于是安全人员就想出了针对其的方法—将APIdump出来并修改IAT,使得不会再调用系统Dll的API
(其实就相当于重写个系统库,不过动态dump的方法会更加难以追踪)
这种方法看起来挺简单的,但是能破解很多技巧……
我就想起了之前识别VEH的方法,目前仅有对该API下断来判断……
解决方法书上没提,感觉可以参考反API HOOK的技术,提前对IAT或者系统Dll的访问进行监控?
自我创建技术就是父进程重新开启一个子进程,在其中进行关键部分的执行,父进程可以修改子进程的内存(代码)、EP地址等等
自我创建的破法是直接附加子进程,然后参考父进程的代码来变换代码,进而推出流程
Debug Blocker对这一点进行了补足,直接设置父进程对子进程进行调试。由于子进程已经处于被调试的状态了,原则上我们的调试器就无法附加其上了。(书中后文有讲解解决办法,但我还没看到)
另一方面父进程可以接受子进程的异常,来控制子进程的执行流程
之前“JarvisOJ-软件密码破解(2)”的题目就是DebugBlocker,不过子进程的开启方法就是添加参数,而且父进程所做的修改很少,所以我很容易的调试了子进程,并仿造父进程改变了子进程的内存
Debug Blocker还有一个变种:“Nanomite”
它会查找子进程内部所有的条件跳转指令都改为Int 3或其他触发异常的代码,然后在父进程中维护一个跳转表。将每次跳转都通过父进程的异常处理来执行,调试将会变得极为困难。
解法是通过自动化脚本将子进程恢复为原样,对脚本编写能力有一定的要求
C. 明日计划
加密与解密 理论
A. 《逆向工程核心原理》-高级反调试技术
B.
花指令
这种反调的难度可高可低,不过对于只靠F5的萌新们都是无解的简单的只是在代码块之间放置一些垃圾代码,通过jmp跳过,使得反汇编不正确,进而影响F5的反编译
只需要清除干扰指令,或者动态调试跟一下就能很轻松的解决
复杂的则会随机插入大量的花指令,与正确代码混杂在一起,很难辨识
基本上只能靠动态调试来理清执行顺序,再进一步分析了
加壳
保护壳这个东西很恐怖(:з」∠)只会ESP这种级别的我就不多说了(其实是没见识过多少壳,不敢碰。看完这本去读《加密与解密》和52的教程再说吧)
Stolen Bytes(Remove OEP)
这个反调方法是第一次见…简单来说就是将OEP的部分代码转移到另一个地方,使得很难Dump;另一方面对OEP的查找也会变得困难,陷入懵逼的境地
(当然知道了这种方法的存在也许会好点儿……吧)
OEP被转移的代码有时还会被处理,例如加花,动态解密,甚至运行完就删除……
安全人员的操作真是骚的不行OTZ
API重定向
这个也第一次见由于逆向人员可以直接将断点下在系统Dll中,从而断到关键API
于是安全人员就想出了针对其的方法—将APIdump出来并修改IAT,使得不会再调用系统Dll的API
(其实就相当于重写个系统库,不过动态dump的方法会更加难以追踪)
这种方法看起来挺简单的,但是能破解很多技巧……
我就想起了之前识别VEH的方法,目前仅有对该API下断来判断……
解决方法书上没提,感觉可以参考反API HOOK的技术,提前对IAT或者系统Dll的访问进行监控?
Debug Blocker(Self Debugging)
这种反调方法我觉得是最恐怖的…是自我创建技术的演进形式自我创建技术就是父进程重新开启一个子进程,在其中进行关键部分的执行,父进程可以修改子进程的内存(代码)、EP地址等等
自我创建的破法是直接附加子进程,然后参考父进程的代码来变换代码,进而推出流程
Debug Blocker对这一点进行了补足,直接设置父进程对子进程进行调试。由于子进程已经处于被调试的状态了,原则上我们的调试器就无法附加其上了。(书中后文有讲解解决办法,但我还没看到)
另一方面父进程可以接受子进程的异常,来控制子进程的执行流程
之前“JarvisOJ-软件密码破解(2)”的题目就是DebugBlocker,不过子进程的开启方法就是添加参数,而且父进程所做的修改很少,所以我很容易的调试了子进程,并仿造父进程改变了子进程的内存
Debug Blocker还有一个变种:“Nanomite”
它会查找子进程内部所有的条件跳转指令都改为Int 3或其他触发异常的代码,然后在父进程中维护一个跳转表。将每次跳转都通过父进程的异常处理来执行,调试将会变得极为困难。
解法是通过自动化脚本将子进程恢复为原样,对脚本编写能力有一定的要求
C. 明日计划
加密与解密 理论
相关文章推荐
- iOS高级调试&逆向技术-汇编寄存器调用
- iOS高级调试&逆向技术-汇编寄存器调用
- iOS高级调试&逆向技术-汇编寄存器调用约定教程
- 一种基于TLS的高级反调试技术
- 180311 逆向-反调试技术(4)SystemKernelDebuggerInformation
- 高级调试技术(一)
- VC++高级调试技术
- 一种基于TLS的高级反调试技术
- 高级调试技术
- VC高级调试技术
- 180307 逆向-反调试技术(2)CheckRemoteDebuggerPresent
- VC高级调试技术
- 动态调试与静态反汇编合一,运用虚拟机技术创建可逆向运行的调试器
- 180306 逆向-反调试技术(1)BeingDebugged
- 180310 逆向-反调试技术(3)DebugObject
- <逆向工程核心原理> 静态反调试技术总结
- 【Ajax技术】JQuery的应用与高级调试技巧
- <逆向工程核心原理> 动态反调试技术总结
- 一种基于TLS的高级反调试技术
- 调试逆向分为动态分析技术和静态分析技术(转)