1.背景
当业务需要反编译一个apk时,总是在AndroidManifest.xml等处拿到类似@ref/0x7f080182的资源符号,并未直接对接上文件名或者资源id名称。
例如,如下从云闪付app里边反编译得到的apduservices.xml中声明如下:
<?xml version="1.0" encoding="utf-8"?>
<offhost-apdu-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@ref/0x7f0f01c3"
android:apduServiceBanner="@ref/0x7f080182"><!--理论上0x7f080182应该是个图片,drawable-->
<aid-group
android:description="@ref/0x7f0f01c7"
android:category="payment">
<aid-filter
android:name="325041592E5359532E4444463031" />
<aid-filter
android:name="A0000003330101060003100000021000" />
<aid-filter
android:name="A0000003330101020003050001000000" />
<aid-filter
android:name="A0000003330101010014293300010000" />
<aid-filter
android:name="A0000003330101020001050001000000" />
<aid-filter
android:name="A0000003330101010001050001000000" />
<aid-filter
android:name="A0000003330101010003060000800000" />
<aid-filter
android:name="A0000003330101020063020000010000" />
<aid-filter
android:name="A0000003330101010004100000010000" />
<aid-filter
android:name="A0000003330101060001030000010000" />
<aid-filter
android:name="A0000003330101060048080000000000" />
</aid-group>
</offhost-apdu-service>
apduservices.xml
在AS中根据推测从drawable中尝试找到对应的id(0x7f080182),从而获取对应的id名称bg_my_banner(对应了bg_my_banner.png)。
如上方案,要结合经验,逐个查询比较繁琐,如果我们希望一次性全部导出资源id,可供快速查询。
2.解决方案
通过Sdk里边的aapt命令,可以一次性导出所有资源到一个文件,供快速查询。
关键命令
命令如下:
~/Android/Sdk/build-tools/34.0.0/aapt d resources unionpay-wallet-v2.apk
aapt + d + resources + [待解包的apk或者jar]
输出结果举例:
Package Groups (1)
Package Group 0 id=0x7f packageCount=1 name=com.unionpay
Package 0 id=0x7f name=com.unionpay
type 0 configCount=2 entryCount=126
spec resource 0x7f010000 com.unionpay:anim/abc_fade_in: flags=0x00000000
spec resource 0x7f010001 com.unionpay:anim/abc_fade_out: flags=0x00000000
spec resource 0x7f010002 com.unionpay:anim/abc_grow_fade_in_from_bottom: flags=0x00000000
spec resource 0x7f010003 com.unionpay:anim/abc_popup_enter: flags=0x00000000
spec resource 0x7f010004 com.unionpay:anim/abc_popup_exit: flags=0x00000000
spec resource 0x7f010005 com.unionpay:anim/abc_shrink_fade_out_from_bottom: flags=0x00000000
spec resource 0x7f010006 com.unionpay:anim/abc_slide_in_bottom: flags=0x00000000
spec resource 0x7f010007 com.unionpay:anim/abc_slide_in_top: flags=0x00000000
spec resource 0x7f010008 com.unionpay:anim/abc_slide_out_bottom: flags=0x00000000
spec resource 0x7f010009 com.unionpay:anim/abc_slide_out_top: flags=0x00000000
spec resource 0x7f01000a com.unionpay:anim/abc_tooltip_enter: flags=0x00000000
spec resource 0x7f01000b com.unionpay:anim/abc_tooltip_exit: flags=0x00000000
spec resource 0x7f01000c com.unionpay:anim/accelerate: flags=0x00000000
......省略若干行......
type 2 configCount=1 entryCount=7
spec resource 0x7f030000 com.unionpay:array/bind_card_certType: flags=0x00000000
spec resource 0x7f030001 com.unionpay:array/bind_card_certType_value: flags=0x00000000
spec resource 0x7f030002 com.unionpay:array/bind_card_type: flags=0x00000000
spec resource 0x7f030003 com.unionpay:array/language_type: flags=0x00000000
spec resource 0x7f030004 com.unionpay:array/sec_ques_selector: flags=0x00000000
spec resource 0x7f030005 com.unionpay:array/sort_type_code: flags=0x00000000
spec resource 0x7f030006 com.unionpay:array/sort_type_name: flags=0x00000000
config (default):
resource 0x7f030000 com.unionpay:array/bind_card_certType: <bag>
resource 0x7f030001 com.unionpay:array/bind_card_certType_value: <bag>
resource 0x7f030002 com.unionpay:array/bind_card_type: <bag>
resource 0x7f030003 com.unionpay:array/language_type: <bag>
resource 0x7f030004 com.unionpay:array/sec_ques_selector: <bag>
resource 0x7f030005 com.unionpay:array/sort_type_code: <bag>
resource 0x7f030006 com.unionpay:array/sort_type_name: <bag>
type 3 configCount=1 entryCount=832
spec resource 0x7f040000 com.unionpay:attr/DefaultDrawable: flags=0x00000000
spec resource 0x7f040001 com.unionpay:attr/RectAdius: flags=0x00000000
spec resource 0x7f040002 com.unionpay:attr/account_size: flags=0x00000000
spec resource 0x7f040003 com.unionpay:attr/actionBarDivider: flags=0x00000000
spec resource 0x7f040004 com.unionpay:attr/actionBarItemBackground: flags=0x00000000
spec resource 0x7f040005 com.unionpay:attr/actionBarPopupTheme: flags=0x00000000
spec resource 0x7f040006 com.unionpay:attr/actionBarSize: flags=0x00000000
spec resource 0x7f040007 com.unionpay:attr/actionBarSplitStyle: flags=0x00000000
spec resource 0x7f040008 com.unionpay:attr/actionBarStyle: flags=0x00000000
spec resource 0x7f040009 com.unionpay:attr/actionBarTabBarStyle: flags=0x00000000
......省略若干行......
据查得到结果下,得到的结果也是drawable/bg_my_banner:
最后再回到AS解压unionpay apk的地方找到对应的文件。
这里可以快速协助定位哪个drawable文件夹下有对应的原始文件。
从截图看,只有xhdpi文件夹下有,其他地方都没有;右边的箭头指示位置会提示原始文件夹路径(res/drawable-xhdpi-v4/bg_my_banner.png)。
点击对应的文件夹,可以预览到原始文件和文件大小。
扩展:
如果想要同步打印一个apk里边的字串id和对应的值,可以增加--values参数,并将其输出到一个文件中。
扩展命令
1 aapt dump --values
命令如下:
~/Android/Sdk/build-tools/34.0.0/aapt d --values resources unionpay-wallet-v2.apk >> unionpay_reource_id.txt2
得到结果如下:
resource 0x7f080169 com.unionpay:drawable/bg_mine_arc_view: t=0x03 d=0x00000622 (s=0x0008 r=0x00)
(string8) "res/drawable-xhdpi-v4/bg_mine_arc_view.png"
resource 0x7f080182 com.unionpay:drawable/bg_my_banner: t=0x03 d=0x00000623 (s=0x0008 r=0x00)
(string8) "res/drawable-xhdpi-v4/bg_my_banner.png"
resource 0x7f0801cd com.unionpay:drawable/bg_selection_hotapps_item_normal: t=0x03 d=0x00000624 (s=0x0008 r=0x00)
如果是个字串的话会更加明显:
以com.unionpay:string/system_default_channel为例,从AS解压的情况中来看,该字串中包含了多种语言翻译版本,即不止一个翻译版本,输出结果应该有多个:
命令执行后,并导入到一个文件文件中,发现匹配到了84个结果,即将多语言的结果全部输出来啦,从截图中可看到config te-rIN字样和对应的翻译版本。
以上是当那到离线版本的apk时,可以通过aapt命令来读取相关资源信息,这样会比jadx反编译查找来的快。
2 adb cmd overlay lookup
如果是apk已经安装到设备,是运行时状态,可以直接通过如下命令直接获取当前语言版本的翻译版本。
adb shell cmd overlay lookup com.unionpay com.unionpay:string/system_default_channel
# 系统默认通道
adb shell cmd overlay lookup com.unionpay com.unionpay:drawable/bg_my_banner
# res/drawable-xhdpi-v4/bg_my_banner.png
adb shell cmd overlay lookup 包名 包名:[资源类型]/[资源id名称]