从0到1:CTFer成长之路
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.3 APK逆向之反调试

为了保护应用关键代码,开发者需要采用各种方式增加关键代码逆向难度。调试技术是逆向人员理解关键代码逻辑的重要手段,对应的反调试技术则是应用开发者的“铠甲”。Android下的反调试技术大多从Windows平台衍生而来,可以分为以下几类。

1.检测调试器特征

检测调试器端口,如IDA调试默认占用的23946端口。

检测常用调试器进程名,如android_server、gdbserver等。

检测/proc/pid/status、/proc/pid/task/pid/status下的Tracepid是否为0。

检测/proc/pid/stat、/proc/pid/task/pid/stat的第2个字段是否为t。

检测/proc/pid/wchan、/proc/pid/task/pid/wchan是否为ptrace_stop。

2.检测进程自身运行状态

检测父进程是否为zygote。

利用系统自带检测函数android.os.Debug.isDebuggerConnected。

检测自身是否被ptrace。

检测自身代码中是否包含软件断点。

主动发出异常信号并捕获,如果没有被正常接收说明被调试器捕获。

检测某段程序代码运行时间是否超出预期。

攻击者绕过上述各类检测方式最便捷的方式是定制Android ROM,从Android源码层面隐藏调试器特征。比如,通过ptrace函数检测是否被ptrace时,可以修改源码,让ptrace函数永远返回非调试状态,即可绕过ptrace检测;对系统自带的isDebuggerConnected函数,也可以通过修改源码绕过。总之,熟悉Android源码,准备一套专门针对反调试定制的系统,能大大加速逆向进程。