承接上文第二届网鼎杯 Writeup,使用DexExtractor进行脱壳。作者在 github 上的说明不太详细,就百度找到了操作向-DexExtractor的使用这篇文章。依据文章和作者的介绍开始配置环境。

AVD 配置

DexExtractor 的使用需要替换 sdk 中的system-images\android-19\default\armeabi-v7a\system.img为作者版本,如果需要在其他安卓版本使用,需要自行编译对应版本的system.img

有现成轮子就直接用了,DexExtractor作者编译的system.imgandroid 4.4 、api-19版本。但是 AS API-19 的有三个版本,README 中没指明。操作向-DexExtractor的使用里面写着用非 google api 版本,就尝试性使用。

创建 AVD 完成后,未修改任何文件,测试虚拟机可用性。提示报错有两条,其中一条是:

1
cannot find avd system path please define android sdk root

sdk 的系统变量我是配置正确的,重启 AS 错误解决。再次运行报错:

1
2
Emulator: emulator: ERROR: This AVD's configuration is missing a kernel file! Please ensure the file "kernel-ranchu" is in the same location as your system image.
Emulator: emulator: ERROR: ANDROID_SDK_ROOT is defined (D:\Android\Sdk) but cannot find kernel file in D:\Android\Sdk\system-images\ sub directories

报错没有找到 kernel-ranch 内核文件。百度谷歌后有几种解决方法:

  1. 将位于Sdk\system-images\android-19\default\armeabi-v7a 的kernel-qemu 重命名为 kernel-ranchu 。

    实测无效,重命名后报错:

    1
    2
    PANIC: Unknown AVD name [Pixel], use -list-avds to see valid list.
    HOME is defined but there is no file Pixel.ini in $HOME\.android\avd
  2. 将 sdk 镜像下的Sdk\system-images\android-19\default\armeabi-v7a 全部文件复制到 AVD 的目录.android\avd\Pixel_2_API_19_2.avd下。

    实测无效,报错与复制前一样。

最后在 stackoverflow 找到两篇帖子 Emulator error: This AVD’s configuration is missing a kernel fileMac and “PANIC: Missing emulator engine program for ‘arm’ CPU.”,解决方法:在启动 AVD 时,指定 kernel-qemu 为内核则可以启动。

原文如下:
author:shizhen
See my answer for the Android Studio environment, Mac and “PANIC: Missing emulator engine program for ‘arm’ CPU.”.

To solve this problem, you need to specify the -kernel path manually. i.e.

$ ~/Library/Android/sdk/emulator/emulator @Galaxy_Nexus_Jelly_Bean_API_16 -kernel ~/Library/Android/sdk/system-images/android-16/default/armeabi-v7a/kernel-qemu
Remember to change the emulator name Galaxy_Nexus_Jelly_Bean_API_16 to your own emulator name.

Below command is to check the emulators available for command line.

$ ~/Library/Android/sdk/emulator/emulator -list-avds
And also, ensure that your emulator path is correct, i.e. the one located at ~/Library/Android/sdk/emulator/

然后查阅 android 官方的开发手册,找到关于参数 kernel 的描述:

使用特定的模拟内核。如果您未指定路径,则模拟器将在系统目录中查找。如果您未指定此选项,则默认为 kernel-ranchu。如需了解详情,请参阅 AVD 系统目录。使用 ‑show‑kernel 选项查看内核调试消息。

当没有指定 kernel 参数时就默认使用 kernel-ranchu 。而 armeabi-v7a 里面只有 kernel-qemu 。而如果下载的镜像有 google-api 的标签,则有 kernel-ranchu 。(在同一页文档中也找到 kernel-ranchu 是最新版本的 QEMU 2 模拟器。)

但是使用镜像带有 google-api 的镜像,没有 dump dex 的 logcat,脱壳不成功。

手动指定 AVD 的启动内核:

1
emulator -avd avd_name -kernel kernel-qemu

报错如下:

1
PANIC: Missing emulator engine program for 'arm' CPU.

原因可能是 sdk/tools 下缺少某些文件,我的解决方法是将 sdk/emulator 全部文件(夹),复制到 sdk/tools,重名文件都选择替换。

成功启动 AVD 。

添加读写权限

apktools 反编译后,在 AndroidManifest.xml manifest 标签内添加:

1
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

保存后回编译 apk 。

dump dex

按照DexExtractor readme 描述当在 logcat 中查看到类似于:(x为包名)

1
E/dalvikvm(4396): --pacthed-- , /sdcard/xxxxxxxxxxxxxxxxx.dex

将 dex 文件拷贝到本机,然后用DexExtractor里面的 Decode.jar 对 dex 解码。

再用 baksmail.jar 将 dex 转 smali 。

计划设想很美好,但是 apk 怎么都运行不了, 错误提示 no support xxxx 。

猝~

梆梆加固脱壳实战文章