我已经分别将 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