修改(添加新逻辑)反编译的 apk 以记录导致问题的不同类型的数据(崩溃/蓝牙连接)

逆向工程 安卓 apk 达尔维克
2021-06-19 11:49:12

我已经分别将 apk 反编译为 smali/dalvik 和 java 类。由于 apk 没有被混淆,java 代码非常好读,我可以很容易地看到相应的 smali 代码。到目前为止,我能够成功地做到:

  • 修改检查许可文件的代码(更改年份比较)
  • 将日志记录添加到一些基本数据中。记录器功能已经在 apk 中,我只是调用它,一切正常。我使用 adb 来读取日志。

我接下来要添加的是为字节数组添加日志记录。为什么?因为这个 apk 连接到蓝牙设备,它从中接收数据。我想知道它收到什么数据。因为我不知道该怎么做,这就是我所做的:

我用静态函数制作了简单的 Android 应用程序,它获取字节数组并返回字符串(复制了一些片段)。它使用的是 BigInteger。然后我编译它并使用apktool反编译。

    .method public static ByteArrayToString([B)Ljava/lang/String;
    .locals 2
    .param p0, "data"    # [B

    .line 16
    new-instance v0, Ljava/math/BigInteger;

    const/4 v1, 0x1

    invoke-direct {v0, v1, p0}, Ljava/math/BigInteger;-><init>(I[B)V

    const/16 v1, 0x10

    invoke-virtual {v0, v1}, Ljava/math/BigInteger;->toString(I)Ljava/lang/String;

    move-result-object v0

    .line 17
    .local v0, "hexaString":Ljava/lang/String;
    return-object v0
    .end method

我将整个函数复制到我的反编译 apk(我想从中调用它/日志数据的同一个类)并调用该函数。

    invoke-static {v0}, Lxx/xxxx/xxxxx/xx/xxxx/xxxxxx;->ByteArrayToString([B)Ljava/lang/String;
    const-string v5, ":: MY RAW DATA: "
    invoke-static {v5}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
    move-result-object v4
    invoke-static {v4}, Lorg/apache/log4j/helpers/LogLog;->debug(Ljava/lang/String;)V

不幸的是它没有奏效。应用程序编译成功,安装和运行没有崩溃。但是它没有连接到我的蓝牙设备(蓝牙通信是必不可少的)。

所以这里有一些问题(已编辑):

  • 我的方法正确吗?
  • 应用程序不再使用蓝牙的原因可能是什么?
  • 我应该在哪里放置额外的逻辑?同一个班好吗?
  • 进口呢?例如,在我的新逻辑中,我必须导入 java.math.BigInteger; 我的函数会以某种方式将这个导入嵌入到它的逻辑中吗?
  • 有没有比我更好的方法?

编辑:

我已经解决了我最初的问题,现在我正在尝试解决其余的问题。答案是:

  • 是的,我的方法是正确的,并且有效。我只是使用了错误的日志功能(正如在下面的评论中提到的那样)。

  • 可能使用这个函数(而不是添加新方法)就足够了:

invoke-static {v0}, Ljava/util/Arrays;->toString([B)Ljava/lang/String;
  • 奇怪的是,通过启用 GPS 解决了我发现蓝牙设备的问题。不是 100% 肯定,但看起来是这样。我也在日志中看到了这一点:
BluetoothUtils: packagename is xx.xxxxx.xxxx ,and its permission is false
1个回答

我认为您的方法通常是正确的。您可能无法连接到蓝牙,因为您的附加代码在某处抛出异常。最好的办法是在动态分析期间检查它。您可以使用例如 Android Studio 和smalidea插件来完成。

据我所知,您不存储ByteArrayToString函数调用的结果您也只将一个参数传递给android.util.Log.d函数(在您的情况下v5),但它实际上需要两个参数。

您可以使用例如动态检测在 android 应用程序中挂钩和拦截函数。用于此目的的好工具名为frida借助此工具,您可以在运行时挂钩各种功能并更改行为(例如添加日志记录功能),而无需重新打包应用程序。你不需要弄乱 smali 代码,相反你可以使用他们简单的 JavaScript API。

如果您对蓝牙数据记录感兴趣,还有更好的方法。您可以使用内置的 Android 函数,称为Bluetooth HCI snoop log. 您可以在手机的开发者选项中启用它。启用该选项后,这些设备之间进行的所有蓝牙通信都将被记录并保存到内部存储器中。您可以稍后复制btsnoop_hci.log带有.cfa扩展名的文件以及可能的所有文件以进行进一步检查。这些文件可以加载到例如名为WireShark 的流行程序中,并类似于 PCAP 文件进行检查。