转:android ro.debuggable属性调试修改(mprop逆向)

2024-09-08 06:58

本文主要是介绍转:android ro.debuggable属性调试修改(mprop逆向),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

android ro属性调试修改(mprop逆向)

     大家都知道如果需要调试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

 

1

2

3

4

5

6

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

修改可执行

 

查看当前值

执行修改

修改完毕\

获取修改后的值

运行微信。可以调试了

进程需要杀掉重启才行。

 

 

这篇关于转:android ro.debuggable属性调试修改(mprop逆向)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147442

相关文章

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期