Android全局可调试(ro.debuggable = 1)的一种另类改法
网上流传比较多的,是重打包boot.img。读aosp的init进程源码,发现通过patch init进程也可以实现相同目的。
首先看一下init进程对ro只读属性的检查:
/* property_service.c */
int property_set(const char *name, const char *value)
{
...
pi = (prop_info*) __system_property_find(name);
if(pi != 0) {
/* ro.* properties may NEVER be modified once set */
if(!strncmp(name, "ro.", 3)) return -1; /* 如果是只读属性,不允许set,返回-1 */
__system_property_update(pi, value, valuelen);
}
...
从上面代码看出,如果将“ro.”改为“\0”即空字符串,即可绕过property_set对可读属性的检查。
同时为了防止误修改,我们查看init进程是否还有其它使用“ro.”字符串的地方,只找到一处,位于check_perms函数中:
/*
* Checks permissions for setting system properties.
* Returns 1 if uid allowed, 0 otherwise.
*/
static int check_perms(const char *name, unsigned int uid, unsigned int gid, char *sctx)
{
int i;
unsigned int app_id;
if(!strncmp(name, "ro.", 3))
name +=3;
if (uid == 0)
return check_mac_perms(name, sctx);
...
分析init进程的汇编代码,发现property_set函数地址位于check_perms函数之前,因此只要修改搜索到的第一处内存即可。
使用ptrace实现,代码如下:
kiiim@ubuntu:~/Android_prj/patch_init_process$ cat 1.c
#include <stdio.h>
#include <sys/ptrace.h>
#include <errno.h>
#include <memory.h>
#include <string.h>
int main(int argc, char **argv) {
int rc;
unsigned long maps, mape, addr, test, fake;
FILE *fp;
char line[512];
char *buffer, *ro;
fp = fopen("/proc/1/maps", "r");
if (!fp) {
perror("fopen");
return 1;
}
memset(line, 0, sizeof(line));
fgets(line, sizeof(line), fp);
fclose(fp);
rc = sscanf(line, "%08x-%08x", &maps, &mape);
if (rc < 2) {
perror("sscanf");
return 1;
}
buffer = (char *) malloc(mape - maps);
if (!buffer) {
perror("malloc");
return 1;
}
rc = ptrace(PTRACE_ATTACH, 1, 0, 0);
if (rc < 0) {
perror("ptrace");
return rc;
}
for (addr = maps; addr < mape; addr += 4) {
test = ptrace(PTRACE_PEEKTEXT, 1, (void *) addr, 0);
*((unsigned long *)(buffer + addr - maps)) = test;
}
ro = memmem(buffer, mape - maps, "ro.", 3);
if (ro) {
printf("Patching init.\n");
fake = 0;
rc = ptrace(PTRACE_POKETEXT, 1, (void *)(maps + ro - buffer), &fake);
if (rc < 0) {
perror("ptrace");
}
}
free(buffer);
rc = ptrace(PTRACE_DETACH, 1, 0, 0);
return rc;
}
编译并在Nexus 5中运行:
$ arm-linux-androideabi-gcc 1.c -o patch_init
运行后kill掉zygote进程:
root@hammerhead:/data/local/tmp # ps |grep zygote
ps |grep zygote
root 18887 1 860616 56352 ffffffff 400e26d8 S zygote
root@hammerhead:/data/local/tmp # kill -9 18887
zygote进程结束后,会自动被init进程拉起。待zygote重启后,执行:
root@hammerhead:/data/local/tmp # setprop ro.debuggable 1
setprop ro.debuggable 1
root@hammerhead:/data/local/tmp # getprop ro.debuggable
getprop ro.debuggable
1
以上,ro.debuggable属性已经被修改。只要手机不重启,此修改一直生效,手机重启后需重新patch。
Android全局可调试(ro.debuggable = 1)的一种另类改法的更多相关文章
- 简单实现Android手机“全局可调试”(ro.debuggable = 1)的方法【锤子坚果3】
在Android真机上调试程序有一个前提,就是这个apk包必须有 debuggable=true 的属性才行.而除了自己开发的apk能够控制打包属性之外,其他的程序发行之后显然不会设这个值为 true ...
- android加载大量图片内存溢出的三种方法
android加载大量图片内存溢出的三种解决办法 方法一: 在从网络或本地加载图片的时候,只加载缩略图. /** * 按照路径加载图片 * @param path 图片资源的存放路径 * @para ...
- android中退出当前应用程序的四种方法
android中退出当前应用程序的四种方法 [IT168 技术]Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A.在B中如何 ...
- Xamarin for android:为button设置click事件的几种方法
原文:Xamarin for android:为button设置click事件的几种方法 在Xamarin中一个最基础的事情,就是为一个button指定click事件处理方法,可是即使是这么一件事也有 ...
- 怎样在Android开发中FPS游戏实现的两种方式比较
怎样在Android开发中FPS游戏实现的两种方式比较 如何用Android平台开发FPS游戏,其实现过程有哪些方法,这些方法又有哪些不同的地方呢?首先让我们先了解下什么是FPS 英文名:FPS (F ...
- Android平台中实现对XML的三种解析方式
本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...
- Android图表库MPAndroidChart(十四)——在ListView种使用相同的图表
Android图表库MPAndroidChart(十四)--在ListView种使用相同的图表 各位好久不见,最近挺忙的,所有博客更新的比较少,这里今天说个比较简单的图表,那就是在ListView中使 ...
- [Android] Android ViewPager 中加载 Fragment的两种方式 方式(二)
接上文: https://www.cnblogs.com/wukong1688/p/10693338.html Android ViewPager 中加载 Fragmenet的两种方式 方式(一) 二 ...
- [Android] Android ViewPager 中加载 Fragment的两种方式 方式(一)
Android ViewPager 中加载 Fragmenet的两种方式 一.当fragment里面的内容较少时,直接 使用fragment xml布局文件填充 文件总数 布局文件:view_one. ...
随机推荐
- centos命令行系列之centos查看磁盘空间大小
df -h 扩展: 1.查看当前文件夹所有文件大小 du -sh 2.查看指定文件下所有文件大小 du -h /data/ 3.查看指定文件大小 du -h install.log 4.查指定文件夹大 ...
- 一、I/O操作(中文问题)
一.编码概念 计算机存放数据只能存放数字,所有的字符都会被转换为不同的数字. 常见的编码有:ISO-8859-1 ASCII数字和西欧字母 GBK:简体中文和繁体,以及日文 GB2312:简体中文 B ...
- qt资源加载出错
-1: error: No rule to make target '../InteractivePlayer/style.qss', needed by 'debug/qrc_res.cpp'. ...
- eclipse安装springboot插件
1.工具栏->Help->Eclise Marketplace打开应用市场 2.在应用市场中搜索sts,选择Spring Tools 4紧张安装 3.按提示进行安装
- linux文件管理 文件搜索
文件搜索命令find 'find [搜索范围] [搜索条件]' 搜索文件 find / -name install.log #避免大范围搜索,会非常消耗系统资源 #find是在系统当中搜索符合条件的文 ...
- hdu3377
题解: 简单的插头dp 加上一个代价即可 代码: #include<cstdio> #include<cmath> #include<cstring> #inclu ...
- git-github-TortoiseGit综合使用教程(二)快速入门
:建立版本库 在github网站上创建一个版本库,并复制clone地址. git@github.com:jackadam1981/Flask_Base.git https://github.com/j ...
- 外部点击链接,登陆后,直接跳转到该链接(过滤器 + Cookie实现)
一.web.xml (1)指定过滤的Servlet类 (2)配置过滤规则,过滤以.mail结尾的链接 <?xml version="1.0" encoding="U ...
- python nltk 安装及配置说明
本教程采用pip安装方式,前期需要在本机安装setuptools 及pip 网上铺天盖地的说了很多关于nltk的说明,特别是后期nltk_data 手动下载操作,多数都不好使,这里整理 用pip安装n ...
- debian系统下安装ssh
SSH 为 Secure Shell 的缩写,SSH 为建立在应用层基础上的安全协议.SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用 SSH 协议可以有效防止远程管理过程中 ...