背景
最近对华为智能手表(HarmonyOS 2)应用商店中的程序进行了提取、解包、修改以及修改包名后重新安装,而全程没有找到这方面的教程,故稍作记录。
本文全程未用到DevEco Studio
,并且仅在Windows 10系统下尝试可行。理论上其它操作系统也可完成本文全部流程。
目标应用包名为com.company.victim
,修改后的新包名为moe.person.attack
使用的工具(依赖)
- Java (JDK)
- Android SDK Platform-Tools
- Apktool
- smali/baksmali
- jadx-gui
- hapsigntoolv2.jar (GitHub) (Gitee)
- jarsigner(默认随JDK安装)
正文
开启 adb
首先,你的电脑与智能手表必须位于同一个局域网下。
设置 -> 关于 中,连续点击7次版本号;返回上一页,可以见到“开发人员选项”。
进入开发人员选项,开启“HDC调试”与“通过WLAN调试”,等待下方显示IP地址与端口号。电脑端使用adb连接到此地址即可。
获取系统UDID
使用adb shell bm get -u
获取系统的UDID,保留备用。
提取hap文件
依次进行以下操作:
adb shell pm path com.company.victim
,返回形如package:/data/app/com.company.victim-yu1SJL5IHfrs8QMjbVnaYw==/base.apk
的内容- 根据返回内容微调以下命令并执行:
adb pull /data/app/com.company.victim-yu1SJL5IHfrs8QMjbVnaYw==/*.hap .
- 此时,你应当可以在当前目录下找到对应的
.hap
文件。
解包
解包.hap
文件
就一个zip压缩包而已,解压一下就行。
解包后文件列表如下:
assets/
org/jbox2d/JBox2D.gwt.xml
entry_release_signed_entry.apk
config.json
pack.info
classes.dex
解包.apk
文件
apktool d entry_release_signed_entry.apk
,得到entry_release_signed_entry
目录
解包.dex
文件
java -jar baksmali.jar d classes.dex
,得到out
目录
修改
允许备份与调试
将AndroidManifest.xml
里的application
标签的属性android:allowBackup
与android:debuggable
设为"true"
修改包名
总的来说,你需要进行两组文本替换:
com.company.victim
-> moe.person.attack
com/company/victim
-> moe/person/attack
(此处指的是smali
中的语法)
需要修改的文件
如果只是修改包名而不修改类名,那么需要修改的文件有:
entry_release_signed_entry
目录里的AndroidManifest.xml
文件(仅manifest
标签中的package
属性)config.json
文件(.app.bundleName
与.module.package
)pack.info
文件(.summary.app.bundleName
)
如果还需要修改类名,那么需要修改的文件有:
entry_release_signed_entry
目录里smali
目录与AndroidManifest.xml
文件config.json
文件pack.info
文件out
目录中的smali
文件assets
目录中的部分文件(比如entry/resources.index
)out/com/company/victim
目录下的所有文件移动至out/moe/person/attack
下entry_release_signed_entry/com/company/victim
目录下的所有文件移动至entry_release_signed_entry/moe/person/attack
下
修改程序代码
由于entry_release_signed_entry.apk
里有一些.js
和.bin
文件,根据相关分析是QuickJS编译后的字节码,所以花了一些时间在这里,后来才发现这个只是依赖框架一类的东西……
实际的逻辑代码位于classes.dex
,也就是解包后的out
目录下。修改out
目录下的相关.smali
文件即可达到修改程序运行逻辑的目的。
(这里我的做法是用jadx-gui
对classes.dex
分析,同时用文本编辑器改smali
代码)
打包&签名
签名申请
首先,你需要生成.p12
与.csr
文件。使用以下命令:
keytool -genkeypair -alias "naMe" -keyalg EC -sigalg SHA256withECDSA -dname "C=CN,O=name,OU=name1,CN=name2" -keystore a.p12 -storetype pkcs12 -validity 9125 -storepass ST1RE -keypass kEy
keytool -certreq -alias "naMe" -keystore a.p12 -storetype pkcs12 -file a.csr
接着,在网页完成新建证书、新建应用、绑定设备等步骤,最终下载得到.cer
与.p7b
文件。具体步骤参见这篇文章。注意注册设备时“设备类型”应选择“智能手表”。注意此处设定的包名必须与你修改后的包名一致。
需要注意的是,此处的开发证书有效期仅为一年。
完成这一步后,你得到了数个文件,后续步骤中使用以下文件名表示:
- 密钥库:
a.p12
- 证书请求文件:
a.csr
- 应用调试证书:
a.cer
- HAP Provision Profile:
a.p7b
同时,你也应当记录以下三项内容,并在接下来的过程中用你实际输入的值替换它们:
- 密钥库密码:
ST1RE
- 密钥别名:
naMe
- 密钥密码:
kEy
打包、签名.apk
文件
apktool b entry_release_signed_entry
del entry_release_signed_entry.apk
jarsigner -verbose -keystore a.p12 -storepass ST1RE -keypass kEy -storetype pkcs12 -signedjar entry_release_signed_entry.apk entry_release_signed_entry\dist\entry_release_signed_entry.apk naMe
完成后,得到已签名的entry_release_signed_entry.apk
文件。
打包classes.dex
java -jar smali.jar a out -o classes.dex
将得到的classes.dex
覆盖原有的classes.dex
打包、签名.hap
文件
首先,在hap解压后的目录中把所有文件选中并以“仅存储”的压缩级别压缩为.zip
压缩包。将压缩包重命名为sth.hap
。请确保压缩包打开后可以直接看见classes.dex
、config.json
、entry_release_signed_entry.apk
、pack.info
等文件,而不是文件外面套着一层目录。
对应的命令如下(可能需要按需更改):zip -r0 sth.hap assets org classes.dex config.json entry_release_signed_entry.apk pack.info
接着,使用以下命令签名:
java -jar hapsigntoolv2.jar sign -mode localjks -privatekey naMe -inputFile sth.hap -outputFile sign.hap -signAlg SHA256withECDSA -keystore a.p12 -keystorepasswd ST1RE -keyaliaspasswd kEy -profile a.p7b -certpath a.cer -profileSigned 1
最终,得到一个签名后的sign.hap
文件。
安装
使用adb连接手表,依次执行以下命令:
- 推送安装包:
adb push sign.hap /sdcard/sign.hap
- 安装:
adb shell bm install -p /sdcard/sign.hap
(注意此处的安装必须保证文件名后缀是.hap
) - 删除手表中的安装包:
adb shell rm /sdcard/sign.hap
如果“安装”这一步执行完成后输出Success
,则完成安装。