先简单陈述两个概念:
反调试:应用程序为了保护自己不被调试器调试限制进程调试自身
SMC:动态代码加密技术,指通过修改代码或数据,阻止别人直接静态分析,然后在动态运行程序时对代码进行解密,达到程序正常运行的效果
例题讲解
以NewStarCTF 2023 SMC为例
知识点1
IsDebuggerPresent:一种常见的反调试保护方法,检查当前程序是否在调试器环境下运行
函数返回一个布尔值,如果当前程序正在被调试,则返回True,否则返回False
函数通过检查特定的内存地址来判断是否有调试器在运行。具体来说,该函数检查了PEB(进程环境块)
数据结构中的_PEB_LDR_DATA
字段,该字段标识当前程序是否处于调试状态。如果该字段的值为1,则表示当前程序正在被调试,否则表示当前程序没有被调试。
如何解决:
进入动调界面,其中阴影处下断点(不会的看Re:从零开始的逆向生活03day-CSDN博客)
在右上角界面双击ZF修改为0x1
即可继续动态调试
知识点2
这道题的关键点在于loc_403040,即SMC处理过的函数
F7/F8单步步过直至进入该函数,此时代码已经自解密完成
点击creat function,F5代码分析
这就是需要逆向的真实代码了
参考资料:
4.4 x64dbg 绕过反调试保护机制_过保护调试器-CSDN博客
CTF Reverse逆向学习之SMC动态代码加密技术,题目复现(NSSCTF)([网鼎杯 2020 青龙组]jocker)-CSDN博客