解析framework-res.apk中resources.arsc, 更改值实现修改屏幕最低亮度

x屏幕最低亮度的值在apk项目的res/values/integers.xml中定义:
有一行:

<integer name="config_screenBrightnessSettingMinimum">10integer>

里面设置的10,就是最低亮度,可以改成1或者2. 但是有人说调太低会出事。。。不管,xposed的GravityBox模块中也有调整最低亮度的设置, 设成最低没出问题。

没成功的方法:

尝试了用apktool反编译apk去修改

反编译能出来东西,但是报错:
W: Config flags size > 52. Size = 56. Exceeding bytes: 0x16662214.
W: Invalid config flags detected. Dropping resources: string-mcc204-mnc4-ERR0

b在反编译出来的文件中找到res/values/integers.xml, 修改好值之后回编译回去。 替换到手机里面,重启开机,黑屏,logcat看到报错说找不到某个资源。 不行。

成功了的方法

直接修改resources.arsc中的二进制值

找到文章尼古拉斯_赵四- Android逆向之旅,里面讲解了解析resources.arsc文件的内容。看完。

验证性尝试:

1、找出res/values/integers.xml中config_screenBrightnessSettingMinimum的值在resources.arsc中的位置

apktool反编译修改再回编译是可以输出新apk的,所以,修改config_screenBrightnessSettingMinimum的值,回编译,从apk中拿出resources.arsc文件。再修改一次,使用不同的值,得到两个resources.arsc,resources1.arsc和resources2.arsc。
z在命令行中(ubuntu,下同):

$xxd resources1.arsc > dump1.txt   #用16进制的格式输出resources1.arsc文件
$xxd resources2.arsc > dump2.txt
$diff dump1.txt dump2.txt          #对比两个文件的不同

因为回编译之前只修改了一个文件的一个地方,所以最后输出的不同的地方都是改了那个地方的锅。
w我的输出是这样的(我改的两次的值是1和10),只有一行不同:

288868c288868
< 00468630: 0800 0200 561f 0000 0800 0010 0100 0000  ....V...........
---
> 00468630: 0800 0200 561f 0000 0800 0010 0a00 0000  ....V...........

b不同的这行的地址偏移量是00468630。咬定config_screenBrightnessSettingMinimum的值就放在这行,将00468630这个偏移地址确定为正确值。

2、解析resources.arsc,找config_screenBrightnessSettingMinimum的值

z使用尼古拉斯_赵四- Android逆向之旅的代码,谢谢!,找config_screenBrightnessSettingMinimum的值。

x(下面讲的东西涉及尼古拉斯_赵四兄的文章内容)
z我们要找的这个资源的值在代码的ParseResourceUtils.parseResTypeInfo(srcByte);这个方法里输出。

y因为config_screenBrightnessSettingMinimum的值是Res_value类型,不是复杂的类型。所以赵四兄的代码中ParseResourceUtils.parseResTypeInfo(srcByte);这个方法里面System.out.println("map entry:" + mapEntry);System.out.println("map:" + resMap);这两行输出可以注释掉,(可以干掉一大部分的输出。。真心多)。
j将输入的文件名改为参数输入(args[0])。

z改好之后用eclipse导出个可执行的jar包。命令行中运行:
(我导的包文件名叫ParseAndroidRes.jar)

java -jar ParseAndroidRes.jar resources.arsc> ParseResult.txt

y这个txt有85m,随便打开小心会卡,用sublime打开,搜索config_screenBrightnessSettingMinimum,找到几个匹配的地方,像这样:

======================================
resId:01 0e 00 5b 
valueOffset:00 46 86 30 
entry:size:8,flags:2,key:index:8022,str:config_screenBrightnessSettingMinimum
value:size:8,res0:0,dataType:TYPE_FIRST_INT,data:1
======================================

s虽然除了这个之外,很多个地方都匹配,但是valueOffset的值都是一样的。
valueOffset = 0x00468630,跟用第一步中用diff找到的偏移值一毛一样!

s所以就咬定这个方法是对的。

3、修改系统中直接拿到的framework-res.apk的resources.arsc

b步骤就是:
1、$ java -jar ParseAndroidRes.jar resources.arsc > ParseResult.txt , 再sublime打开,搜索config_screenBrightnessSettingMinimum,找到valueOffset。记下来。
2、vim打开resources.arsc,用:%!xxd改成16进制格式,找到偏移为刚刚记下的valueOffset的地方,改那个值!改!,改好之后 :%!xxd -r将格式转回去,:X保存退出。
3、就这样改好了resources.arsc啦,用它替换掉原来apk里面的resources.arsc。扔进手机里面,改好权限(chmod 644和chown root:root)。就可以啦,我都没重启就生效了。

s虽然这样改东西很又局限性,而且hi麻烦,但是这样有成就感啊!

你可能感兴趣的:(记录)