首页 > 代码库 > Android进程注入
Android进程注入
所有代码在这里下载:http://download.csdn.net/detail/a345017062/8133239
里面有两个exe,inj是一个C层进程注入的例子。inj_dalvik是我写的Java注入。
C层的进程注入借直接拉的洗大师的开源项目(https://code.google.com/p/libandroidinjector/)
Android的基础服务大部分都是使用Java写的,只是C层的注入,想要直接访问的话还是比较麻烦。所以需要在远端加载一个dex包(代码中写死了加载/data/local/inj目录下的dex)。加载dex需要Dalvik虚拟机的Context,也就是JNIEnv,这个稍微遇到了一些麻烦,直接在源码上面编译的话,构建源码的编译环境就比较费时间了,最后还是从源码中拉出Header文件,又从我的手机(ZTE N5 4.1.2)中adb pull下来了android_runtime和nativehelper这两个.so才解决了编译、链接的问题。
C层加载dex之后,可以调用Java的main方法执行Java代码了,但是想做一些访问系统服务的事情的话,没有Context是不行的,所以通过反射调用ActivityThread,拿到Application。
我最初的想法是使用inj_dalvik注入到system_server进程,然后访问里面所有的Android系统服务,但后来发现这样有两个问题,dex在system_server进程执行时不能使用PackageManager这样的远端服务代理,只能使用ServiceManager.getService("package")直接获取PackageManagerService实例。而且发现PackageManagerServer这样的服务,接口变动比较频繁,版本适配上比较麻烦。所以最后还是决定注入到一个user为system的客户进程,比如com.android.settings。然后整个流程就跑通了。
现在面临的一个未解决的问题是com.android.setting这样的进程并不是系统Daemon,不是常驻进程,我们的代码注入后不能永远存活。但其它像/system/bin/surfaceflinger这样的进程,因为本身是C程序,启动时并没有AndroidRuntime,无法加载我们的Dex并Java代码。所以,要么在需要执行远端代码时后台偷偷启动com.android.settings进程,要么自己fork出一个具有AndroidRuntime的进程来,并把它注册到init.rc中。
期待大家能给出个建议或者方案。
资源下载时设置的分数比较高,实在是因为我太穷了。如果亲没有分了,可以关注微信公共账户联系我,留下邮箱,我会发给亲的。
Android进程注入