华为hap安装包逆向记录

 

背景

最近对华为智能手表(HarmonyOS 2)应用商店中的程序进行了提取、解包、修改以及修改包名后重新安装,而全程没有找到这方面的教程,故稍作记录。

本文全程未用到DevEco Studio,并且仅在Windows 10系统下尝试可行。理论上其它操作系统也可完成本文全部流程。

目标应用包名为com.company.victim,修改后的新包名为moe.person.attack

使用的工具(依赖)

正文

开启 adb

视频教程

首先,你的电脑与智能手表必须位于同一个局域网下。

设置 -> 关于 中,连续点击7次版本号;返回上一页,可以见到“开发人员选项”。

进入开发人员选项,开启“HDC调试”与“通过WLAN调试”,等待下方显示IP地址与端口号。电脑端使用adb连接到此地址即可。

获取系统UDID

使用adb shell bm get -u获取系统的UDID,保留备用。

提取hap文件

依次进行以下操作:

  1. adb shell pm path com.company.victim,返回形如package:/data/app/com.company.victim-yu1SJL5IHfrs8QMjbVnaYw==/base.apk的内容
  2. 根据返回内容微调以下命令并执行:adb pull /data/app/com.company.victim-yu1SJL5IHfrs8QMjbVnaYw==/*.hap .
  3. 此时,你应当可以在当前目录下找到对应的.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:allowBackupandroid: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-guiclasses.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.dexconfig.jsonentry_release_signed_entry.apkpack.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,则完成安装。