-
-
[原创]安卓逆向的核心流程
-
发表于:
2025-9-16 15:49
8256
-
安卓逆向的东西比较多,刚接触容易不知道怎么入手。如果知道安卓逆向的核心流程有哪些,对安卓逆向有一个整体的认知,就能比较清晰地知道自己缺什么和学什么。这篇文章梳理一下安卓逆向的要点,方便学习安卓逆向的小伙伴参考对照。
一开始先准备好手机和电脑这些硬件设备。安卓系统是从linux系统过来的,进程之间互相隔离,想突破隔离就需要有root权限。手机root目前有三种方案:Magisk、KernelSU和APatch。
1、Magisk:上手比较简单,只需要修改启动文件boot.img,插件也比较多。
2、KernelSU:修改内核,相对Magisk更加稳定,但门槛高,插件比较少。
3、APatch:结合上面两个的优势,只需要修改boot.img+支持加载内核模块。
安卓系统或linux系统分为用户层和内核层,APK只能运行在用户层。如果有内核插件的能力,就可以从更底层进行拦截修改。就逆向分析来说,比较推荐的是APatch:既能够使用上层的安卓插件AndroidPatch Modules(APM),也能够用底层的内核插件KernelPatch Modules(KPM)。
拿到一个APK,先看看这个APK有没有加壳。加壳的原理是把原本的代码资源进行加密保护,等到运行的时候再解密释放出来。而脱壳就是把解密释放的代码资源拷贝出来。查壳可以用ApkCheckPack,脱壳可以用frida_dump。
得到没有保护壳的APK之后,就可以进行静态分析,先看看整个APK都有哪些文件资源。APK本身也分为两层:Java层和Native层(C/C++层),对应两种工具:
1、Java层的静态分析工具:jadx
2、Native层的静态分析工具:IDA Pro
静态分析一开始只是看个大概,之后还得进行动态调试,才能知道APK运行的细节。动态调试对应的工具有两种:
1、单步调试:lldb,适合下断点之后跟踪数据和逻辑
2、拦截打印:frida,适合拦截看参数和整体调用
如果一用工具进行分析,就提示环境异常或者直接闪退,那就意味着工具被检测到了。
检测要么基于原理,比如lldb正在进行动态调试,status会有TracerPid的信息,APK只要检查TracerPid字段,就能知道是不是被动态调试。而反检测就是根据原理,检查的时候修改返回正常的值,比如抹掉TracerPid字段。
要么是基于特征进行检测,比如frida的默认端口是27042,APK只要检查端口27042是不是存在,就能知道是不是被frida工具入侵了。而反检测就是修改特征值,比如修改frida的端口号;或者直接换魔改版的工具Florida。
有了工具,接下来就是进行具体的功能分析,这个时候需要具备两种能力:
1、正向开发的能力:比如点一个按钮,弹一个提示框。起码要知道正向开发的时候,代码正常是怎么写的,这样逆向分析的时候才能找到切入点。
2、代码反编译的能力:正向开发是清晰明了的源代码,编译之后看到的是汇编。java编译成smail,Native(C/C++)编译成ARM汇编。而逆向分析就得从底层的这些汇编看出原本代码的逻辑。
在进行分析代码的时候,也会遇到很多保护手段,给逆向分析带来更多的麻烦:
1、代码混淆:Java或者Navite(JNI)清晰的名字被替换成abc这些代替符号。这种只能根据代码的逻辑去猜测。
2、字符串加密:静态分析看到的是混乱的密文,运行的时候才解密成明文。要么运行的时候把明文拷贝出来,要么根据解密算法用脚本去还原。
3、控制流扁平化:原本结构清晰的ifelse,被打乱成一个状态机不断跳转。现在比较多的是OLLVM的扁平化、对应的可以写脚本去还原原本的结构。
4、代码变异:原本的代码变异成相同语义的多条代码,一眼看上去不那么直观易懂。这种得走代码优化,或者脚本识别之后的还原。
5、代码虚拟化:原本的一句代码,变成了一套虚拟代码和虚拟机器,虽然运行的结果一样,但分析难度特别高。这种就得跟踪代码的执行过程,然后根据虚拟机的原理去还原。
[培训]传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2025-9-22 09:41
被GhHei编辑
,原因: 纠错