查看原文
其他

Android ro.debuggable属性调试修改(mprop逆向)

IamHuskar 看雪学院 2019-05-26

大家都知道如果需要调试android 的程序,以下两个条件满足一个就行。第一是apk的配置文件内的AndroidManifest.xml的 android:debuggable=”true”,第二就是/default.prop中ro.debuggable=1。

两种方式第一种通常是解包添加属性再打包,随着加壳软件以及apk校验等,容易出现安装包异常。第二种由于一般的手机发布时ro.debuggable一般是0 也就是不允许调试,通过修改rom的办法在手机上比较麻烦,需要刷机等等,模拟器上一般是vmdk的虚拟机,也没法修改rom。这样我们就无法调试应用了,比如使用DDMS时,只能看到手机,看不到进程信息。

后来发现有人提供了一个软件叫做mprop,但是只有二进制的文件arm架构的,没有源码,一个问题是在有些手机上测试是无效的,第二个问题是在X86模拟器上调试就不可能了。所以尝试一下逆向mprop并且解决这个调试问题。

打开mprop发现主要是附加了1号进程也就是init进程。通过对/dev/__properties__属性段执行修改来修改对应的数值。

针对于android4.4版本的x86模拟器。

我们进入源码中看看为何在init进程这里修改就可以了。在

system/core/init/property_service.c

system/core/init/init.c

Main执行时

property_init->init_property_area-> __system_property_area_init函数(位于bionic/libc/bionic/system_properties.c)->map_prop_area_rw  fd = open(property_filename, O_RDWR | O_CREAT | O_NOFOLLOW | O_CLOEXEC | O_EXCL, 0444)

打开了/dev/__properties__

随后调用property_load_boot_defaults加载了default.prop调用load_properties 通过property_set(key, value);将对应的键值设置好。

在 property_set 函数中 ro.开头的函数只能设置一次。否则就返回失败。所以我们后续调用setprop就是无效的。否则将调用__system_property_update执行更新。因此我们可以模拟__system_property_find 得到prop_info结构

__system_property_update prop_info结构中的数据

(bionic/libc/bionic/system_properties.c)实现。

关键就是 这个结构。name中是ro.debuggable value中是0

struct prop_info 

{

unsigned volatile serial; 

char value[PROP_VALUE_MAX]; 

char name[0]; 

};

因此我们只要在 /dev/__properties__ 段中找到对应的name然后向上移动PROP_VALUE_MAX(android4.4中是96)个字节。修改value为对应的值即可。我们dump可以看出来。

剩下就是编码 主要是通过ptrace进入init然后修改memory具体可以下代码

后续的操作如下:

编译modprop

Push到/data/local/tmp

修改可执行

查看当前值

执行修改

修改完毕


获取修改后的值

运行微信。可以调试了

进程需要杀掉重启才行。



看雪ID:IamHuskar

bbs.pediy.com/user-528829




本文由看雪论坛 IamHuskar 原创

转载请注明来自看雪社区







热门技术文章推荐:








戳原文,看看大家都是怎么说的?

    您可能也对以下帖子感兴趣

    鸿蒙中是如何实现UI自动刷新的?
    Android H5页面性能分析策略
    一文搞懂Window、PhoneWindow、DercorView、WindowManager
    Android Gradle Plugin插件详解
    Spring Boot 配置日志输出的正确姿势!

    文章有问题?点此查看未经处理的缓存