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中。
补充于2014.11.19
手机助手中通常都须要用到这种功能,停用某个用户不使用的系统应用,或者为了禁止应用被后台唤起而停用应用中的某个组件。通过Root后有一种比較简单的办法就是在su下运行pm命令。但这种方式有几个比較大的缺陷:一个是效率低,由于须要新开进程。
二个是假设一个组件的类是个内部类,类名中包括$这种符号的话,pm命令会运行失败。三个是应用自身能够恢复自身组件的停用状态。
这里提供一个比較简单的实现方案。
我们研究PackageManagerService代码发现,调用setComponentEnabledSetting、setApplicationEnabledSetting这样方法假设是针对其他应用的话,检查的是system权限。所以我们仅仅要造一个具有system权限的进程,并在这个进程内部调用这两个方法就OK。这一点已经通过上面的Android进程注入方案中,通过注入到com.android.settings包中得到了验证。我们须要这几步:
一、參考pm、am等工具的实现方式,在源代码下编译一个Jar包。在代码中启动一个Socket服务。接收外部命令。进行校验后运行。
二、把Jar包拷贝到/system/framework下,并在system/bin下建立启动入口。然后使用app_process启动该服务。
三、在init.rc中添加一个services项。以system权限启动该Jar包,这样下次开机时也能自己主动启动。
补充于2014.11.24
进程注入的流程例如以下:
一、attach目标进程。
使用ptrace来attach目标进程,内核将发送 SIGSTOP 将目标进程挂起。我们使用waitpid接收到SIGSTOP以后。使用ptrace_getregs把当前寄存器的内容保存在regs_t中(regs_t这个数据结构的定义在ptrace.h)。再调用PTRACE_CONT使用进程继续运行。
二、在linker找到dlopen,dlsym,dlclose的地址。
搜索/proc/$pid/maps中/system/bin/linker在虚拟进程中的地址。然后在linker的地址范围内搜索分别找到dlopen,dlsym,dlclose的地址。存储在数据结构dl_fl_t中。
三、载入并运行本地SO。
Android中的动态载入与Linux中有些不同,是没有懒载入的,C代码中引用到的.so会在进程启动时载入完毕。假设C代码中用到dlopen等显式动态载入方法时,须要在编译时加上libdl.so,但代码实际运行中逻辑实现是在linker中的。所以我们在linker中就能够找到dlopen,dlsym,dlclose的handle。
通过第二步拿到dlopen,dlsym的地址之后。就能够通过ptrace改写远程进程的寄存器的PC寄存器地址(R15)到dlopen的地址,然后ptrace_cont,就能够载入本地的SO库了。
Android进程注入的更多相关文章
- Android中通过进程注入技术改动广播接收器的优先级
前言 这个周末又没有吊事,在家研究了怎样通过进程的注入技术改动广播接收器的优先级.关于这个应用场景是非常多的.并且也非常重要.所以就非常急的去fixed了. Android中的四大组件中有一个广播:B ...
- Android中通过进程注入技术修改广播接收器的优先级
前言 这个周末又没有吊事,在家研究了如何通过进程的注入技术修改广播接收器的优先级,关于这个应用场景是很多的,而且也很重要,所以就很急的去fixed了. Android中的四大组件中有一个广播:Broa ...
- Android中通过进程注入技术修改系统返回的Mac地址
致谢 感谢看雪论坛中的这位大神,分享了这个技术:http://bbs.pediy.com/showthread.php?t=186054,从这篇文章中学习到了很多内容,如果没有这篇好文章,我在研究的过 ...
- Android进程的so注入--Poison(稳定注入版)
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53869796 Android进程的so注入已经是老技术了,网上能用的Android ...
- Android进程so注入Hook java方法
本文博客链接:http://blog.csdn.net/qq1084283172/article/details/53769331 Andorid的Hook方式比较多,现在来学习下,基于Android ...
- Android 进程常驻----开机广播的简单守护以及总结
这是一个轻量级的库,配置几行代码,就可以实现在Android上实现进程常驻,也就是在系统强杀下,以及360获取root权限下,clean master获取root权限下都无法杀死进程 支持系统2.3到 ...
- Android so注入(inject)和Hook技术学习(三)——Got表hook之导出表hook
前文介绍了导入表hook,现在来说下导出表的hook.导出表的hook的流程如下.1.获取动态库基值 void* get_module_base(pid_t pid, const char* modu ...
- Android 进程常驻(5)----开机广播的简单守护以及总结
这是一个轻量级的库,配置几行代码.就能够实如今android上实现进程常驻,也就是在系统强杀下,以及360获取root权限下.clean master获取root权限下都无法杀死进程 支持系统2.3到 ...
- Android so注入( inject)和Hook(挂钩)的实现思路讨论
本文博客:http://blog.csdn.net/qq1084283172/article/details/54095995 前面的博客中分析一些Android的so注入和Hook目标函数的代码,它 ...
随机推荐
- 聊聊JVM的年轻代(转)
聊聊JVM的年轻代 本文转自http://ifeve.com/jvm-yong-generation/ 1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代 ...
- 值得借鉴的Objective-C编程规范
Daniel's Objective-C Coding Style Guidelines http://google-styleguide.googlecode.com/svn/trunk/objcg ...
- 如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)
如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)1.首先要下载我提供的软件包(里面已经包含所有所需软件); 2.把它解压到D盘根目录下(如果需要安装在其它的地方,请注意设好路径); ...
- Selenium2+python自动化35-获取元素属性
前言 通常在做断言之前,都要先获取界面上元素的属性,然后与期望结果对比.本篇介绍几种常见的获取元素属性方法. 一.获取页面title 1.有很多小伙伴都不知道title长在哪里,看下图左上角. 2.获 ...
- Java-JDBC调用批处理、存储过程、事务
一.使用Batch批量处理数据库 当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率.; 1.实现批处理有两种方式,第一种方式: S ...
- Android 面试题集 包含答案
作者:guoxiaoxing 链接: https://github.com/guoxiaoxing/android-interview 本文基于作者采用的MIT协议分发. 手画一下Android系统架 ...
- 启动Memcached报错:/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-2.1.so.6: cannot open shared object file: No such file or directory
1.查找文件放在哪里 sudo find / -name libevent-2.1.so.6 发现放在/usr/local/lib/libevent-2.1.so.6下. 2.创建软链接 sudo l ...
- Informatica 常用组件Aggregator之一 聚合表达式
转换类型:已连接.主动 聚合转换允许您执行聚合计算,比如平均值和总和.聚合转换与表达式转换不同,您可以使用聚合转换对多组执行计算.而表达式转换只允许您逐行地执行计算. 使用 ...
- hdu1226 超级密码 (BFS,里面用了大数取余原理)
Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进 ...
- Objective-C面向对象之实现类
一般涉及到面向对象都会C#,Java都不可避免的涉及到类,C#中类的后缀名是.cs,Java中是.java,Object-C中一般用两个文件描述一个类,后缀名为.h为类的声明文件,用于声明成员变量和方 ...