我已经分别将apk反编译为smali / dalvik和java类。由于apk不会混淆,所以Java代码非常易于阅读,我可以很容易地看到相应的smali代码。
到目前为止,我能够成功完成操作:


修改用于检查许可证文件的代码(年度更改比较)
将日志记录添加到一些基本数据中。 Logger函数已经在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。

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

评论


感谢您的输入。我混合了两个功能,一个接受1个参数,另一个接受2个参数。另外-奇怪的是,启用GPS时蓝牙自身的问题已修复。但是我不是100%肯定是这种情况。在日志中,我是这样的:“ BluetoothUtils:程序包名称为xx.xxxxx.xxxx,其权限为false”。我还找到了我的旧代码(几年前一直在尝试解决我的这个问题),并且我使用了“调用静态{v0},Ljava / util / Arrays;-> toString([B)Ljava / lang /串;”它也应该起作用。

–马特
20 May 22 '21:10

好了,新的日志看起来很奇怪,但是根据GPS的说法,因为一段时间后,如果应用程序使用蓝牙,Android可能需要“获取位置”权限。也许您在重新包装的应用程序中拒绝了该权限,所以蓝牙无法正常工作,现在在应用程序上打开GPS后显示了某种监控并获得了必要的权限。这只是理论。另外,如果您仅需要记录功能来捕获蓝牙补丁,我强烈建议您使用Bluetooth HCI探听日志,而无需修改smali代码。 .apk的Wireshark和静态分析可能足以理解逻辑。

–morsisko
20 May 22 '21:28