进击的Android注入术《一》
写在前面
这个系列本来是在公司的一个分享。内容比較多,所以就把这个PPT又一次组织整理成博客,希望对大家学习有所帮助。我会先以一个”短信拦截“作为样例,抛出问题,并提出了一种基于”注入“的技术方案达到提高拦截优先级,接着再重点解说注入的技术细节。
最后,我会跟大家分享一个我业余时间开发注入框架——AIM(Android IPC Manager)。
当然了,这个框架跟眼下的XPosed、CydiaStructe的側重点不太一样。
短信拦截
场景
假设某款安全支付类应用和一个未知木马安装在同一台手机,木马会截获全部的验证码短信。
问题
有什么办法能够保证安全支付类的应用能够比木马更优先截获到验证码短信呢?
解决方式
事实上这类优先级抢占问题,做短信功能开发的朋友,都应该比較清楚,由于老板都关注的就是这个了,呵呵。一般的可行方案例如以下:
- 提高BroadcastReceiver的优先级;
- 採用动态的方式注冊BroadcastReceiver;
- 注冊时间要越早越好;
基于上述三点,我们的能够做例如以下优化:
- 监听Android的开机广播事件BOOT_COMPLETED。提早注冊时间。
- 启动后,开启一个Service。并在里面以动态的注冊BroadcastReceiver;
- 注冊的优先级调整至最高——Integer.MAX_VALUE;
关键代码例如以下所看到的:
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); filter.setPriority(Integer.MAX_VALUE); registerReceiver(new SmsReceiver(), filter);
问题来了
通过上面这个方法。是能够解决部分问题了,但这样的方式全然没有技术含量。对处于技术第一线的黑客们根本不是问题。他们不但也採用了同样的技术,并且做得更好,在”注冊时间越早越好“这一点上,他们加入几个额外的触发点。分别例如以下:
- WIFI_STATE_CHANED
- CONNECTIVITY_CHANGE
- ACCESS_NETWORK_STATE
- ACCESS_WIFI_STATE
这几个系统事件。都比BOOT_COMPLETED触发得要早。所以木马当然能优先截获到短信了。
基于这样的对抗下,我们是否跟木马就仅仅有打成平手呢?是否有更优的解决方式?答复是肯定的。
促进科技发展最有效的方法就是战争。在这样的技术对抗中,相同也是最easy产生新的思想方案的。
基本思路
既然广播发送之后,我们有可能处于后次序。
那是否有办法,能够在广播发送之前。做一下顺序调整呢?我们知道,Android的广播发送,都是由ActivityManagerService(AMS)做路由转发的,所以AMS里肯定保存了各个BroadcastReceiver的信息以及次序,我们假设有办法能够进入到AMS里头,再通过一些反射的技巧,是否就能够在每次发送广播之前,调整广播的发送顺序呢?
这个就是我要跟大家分享的技术方案——通过注入实现短信的绝对优先拦截。技术的基本思路是这种,我们先注入到系统进程——system_process,然后截获AMS的broadcastIntent方法,加插我们的调整逻辑。
《二》里我会着重介绍注入的技术原理。然后通过一系列的DEMO解说这个方法所涉及到的技术点。