使用 baksmali 和 smali 重新打包 APK 文件

逆向工程 安卓 apk
2021-07-09 03:23:11

我是一名对 Android 安全感兴趣的学生。我试图使用 baksmali 和 smali 修改 APK 文件。但是,我无法在我的手机上运行重新打包的应用程序。当我单击该图标时,它会显示“不幸的是,测试已停止”并存在。(即使应用程序的图标也发生了变化,现在我看到的是默认的 android 图标而不是应用程序的旧真实彩色图标)

这可能是什么原因?实际上我什至没有修改apk文件的代码。我只是解压 apk 以获取 dex 文件,然后使用 将其转换为 smali baksmali.jar,然后使用smali.jar. 最后拉上拉链并签名。

我详细做了什么:

  1. 解压apk文件

    $   Unzip test.apk
    
  2. 将 1classes.dex1 转换为 smali

    $ baksmali -x classes.dex -o smaliClasses
    
  3. 将类转换回classes.dex(替换旧的classes.dex,实际上我没有向 smali 文件添加任何新代码。我想知道这是否首先有效)。

    $ smali smaliClasses -o classes.dex
    
  4. 将所有文件压缩到 test.zip

    $ zip test.zip AndroidManifest.xml classes.dex res META-INF resourses.arsc
    
  5. 重命名test.ziptest.apk

    $ mv test.zip test.apk
    

现在我相信我必须再次签署APK,如果这里有错误,请纠正我。

编辑

  1. java -jar signapk.jar testkey.x509.pem testkey.pk8 test.apk test-patched.apk

  2. 我尝试安装新的重新打包的 APK。使用 adb 外壳。Adb shell 显示安装成功。但是,我无法在移动设备中运行重新打包的应用程序。当我点击它时应用程序崩溃。它说“不幸的是,测试已停止”。

为什么重新打包的应用程序没有运行?我不明白我在这里缺少什么?

编辑

我尝试使用 apktool 重新打包同一个应用程序。我使用它提取了 smali 文件并重新打包。但是为什么重新打包对 baksmali、smali、zip 和 signapk 不起作用。在这个过程中压缩是真正的问题吗?与原始 apk 文件相比,当我压缩应用程序并将其重命名为 .apk 时,我看到应用程序的大小大大减少:|

4个回答

apktool为此,我使用了一小对 shell 脚本来反编译和重新编译 APK:

  • 反编译apk

    #!/bin/bash -e
    if ! [ "$1" ]; then
        echo "usage: $0 <file.apk>"
        exit -1
    fi
    
    fn=${1%.apk}
    target_apk=$fn.apk
    apktool d -f "$target_apk" -o smali
    echo "Done."
    
  • 编译apk

    #!/bin/bash -e
    if ! [ "$1" ]; then
        echo "usage: $0 <original.apk>"
        exit -1
    fi
    
    fn=${1%.apk}
    
    rm -f $fn.unaligned.apk $fn.smali.apk
    rm -rf smali/build
    
    apktool b -f smali/ -o $fn.unaligned.apk
    jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore  -storepass android  $fn.unaligned.apk  androiddebugkey
    zipalign -v 4 $fn.unaligned.apk $fn.smali.apk
    rm -rf smali/build
    

使用apktool的优点是能够查看和编辑所有资源以及解码的清单文件。

在玩过 smali/baksmali 后,我开始工作了。我认为您在压缩时没有使用递归标志这导致 res 文件夹为空,从而导致崩溃。我也在签署 apk 后运行 zipalign。

脚步:

  1. 解压
    $ unzip test.apk
  2. 巴克斯马利
    $ baksmali classes.dex -o smaliClasses
  3. 斯马利
    $ smali smaliClasses -o classes.dex
  4. 邮编-r
    $ zip -r test.apk AndroidManifest.xml classes.dex res/ resources.arsc
  5. 贾西格
    $ java -jar signapk.jar testkey.x509.pem testkey.pk8 test.apk test-patched.apk
  6. 拉链对齐
    $ zipalign -v 4 test-patched.apk final-apk.apk
  7. 利润 :)

由于声誉,我无法发表评论,所以我会在这里发布。

由于使用 apktool 正确完成了这项工作,因此在我看来,zip 过程出了点问题。

重新打包应用后,您能否验证新APK的内容与原始APK的内容是否相同(就文件名和结构而言)?

编辑:此外,由于该文件是 .dex 文件,我认为您不需要 baksmali 中的 -x 选项。

EDIT2:重新打包时,您不需要在 zip 文件中包含 META-INF 目录。它将在签署文件时创建。

不需要使用 deodex 选项“-x”,因为您没有在 odex 上执行 baksmali。只需在 dex 文件上运行 baksmali。您还可以使用 apktool 解包/打包所有内容,我认为这更容易。