[置顶] 进击的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触发得要早,所以木马当然能优先截获到短信了。
基于这种对抗下,我们是否跟木马就只有打成平手呢?是否有更优的解决方案?答复是肯定的。
促进科技发展最有效的方法就是战争,在这种技术对抗中,同样也是最容易产生新的思想方案的。

基本思路

既然广播发送之后,我们有可能处于后次序。那是否有办法,可以在广播发送之前,做一下顺序调整呢?我们知道,Android的广播发送,都是由ActivityManagerService(AMS)做路由转发的,所以AMS里肯定保存了各个BroadcastReceiver的信息以及次序,我们如果有办法可以进入到AMS里头,再通过一些反射的技巧,是否就可以在每次发送广播之前,调整广播的发送顺序呢?

这个就是我要跟大家分享的技术方案——通过注入实现短信的绝对优先拦截。技术的基本思路是这样的,我们先注入到系统进程——system_process,然后截获AMS的broadcastIntent方法,加插我们的调整逻辑。

《二》里我会着重介绍注入的技术原理,然后通过一系列的DEMO讲解这个方案所涉及到的技术点。


你可能感兴趣的:(android,注入,短信,短信拦截,AIM)