概述:
最近的工作中开始接触Android逆向相关的知识,但接触的更多是友商的加密和反调试逻辑很少接触脱壳,在此之前只接触过数字家的壳,也脱了好久了,所以这次找个免费版的加密壳练习下脱壳。
用到的工具:jadx-gui、ida pro、unicorn
样本:2019-08-10加密的自开发的demo
新手刚开始接触逆向,如果分析有不足或改进之处还请各位提出,提前感谢各位~
一、分享些小窍门
1.Android so绝大部分是C语言实现的,在绝大多数C编译器实现的函数调用中通过BL*指令(返回地址放入LR中)进行跳转,函数入参翻入R0-R3寄存器中如果入参数量多于4个则把入参放入栈中
2.在反调试中so在判定有调试器或hook工具后大多数会选择直接退出所属进程,常见的方式有两种一种是raise(9)这种方式与kill -9 <pid>的方式相同,另一种exit(0),当你在调试so时发现进程无故退出了.可以考虑在这两个函数的入口处下断点,然后通过LR找到上下文
二、首先出张分析结果的流程图(概况)
如果你已经对我们今天的对象特别了解了那请看下我整理的流程图,如果发现哪里与你的印象不同欢迎讨论:
三、分享上手分析过程
首先查看Manifest.xml
Manifest没被改太多只修改了Application我们看一下它
还挺明显的,后面我们来看一下其他类吧,主要是Helper有一些配置信息和native方法,DexInstall类如其名
所以主要还是要处理动态链接库果断连上IDA pro因为我是Android 6.0手机,还自己编译了内核来过反调试,所以先openMemory下断点,啥?脱出来了...好尴尬..我们来分析下它的行为吧。
首先看下各个函数,应该做了些基于switch的流程控制不过没关系,我们先头铁的分析下
首先确定没有init.array 和init所以我们再Jni_Onload下断点在openMemory等系统函数下断点然后执行.我这边借一个小例子解释下开头的分享1:
看一个函数调用
我们长话短说想看具体流程请去看开头的流程图我下面只分享些重要的代码位置
这里对应流程块7
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-8-22 21:53
被AlickX编辑
,原因: 图片显示不出来