问题描述
sget-object v5,Lkotlin/text/Charsets;->UTF_8:Ljava/nio/charset/Charset;
invoke-static {v4,v2},Ljava/util/Objects;->requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
invoke-virtual {v4,v5},Ljava/lang/String;->getBytes(Ljava/nio/charset/Charset;)[B
move-result-object v4
现在我需要将 v4 转换为十六进制字符串,以便将其登录到 Android Studio 中的 Logcat,因为我无法记录字节。 我该怎么做?
解决方法
将 byte[]
转换为 String
的一种简单方法是使用 BigInteger
:
String s = new BigInteger(1,data).toString(16);
在 smali 中,您需要两个额外的寄存器(或两个可以覆盖的寄存器)。在以下代码中使用了 v1
和 v2
。字节数组必须存在于 v4
:
new-instance v1,Ljava/math/BigInteger;
const/4 v2,0x1 # interpret the byte array as positive number
invoke-direct {v1,v2,v4},Ljava/math/BigInteger;-><init>(I[B)V
const/16 v2,0x10 # Output base 16 = hexadeximal
invoke-virtual {v1,v2},Ljava/math/BigInteger;->toString(I)Ljava/lang/String;
move-result-object v1
# The hex-string is now in v1
# Let's log the value
const-string v2,"TAG"
invoke-static {v2,v1},Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
有一种非常简单的方法可以自己生成这样的 smali 代码:
使用您拥有 Android Studio 源代码的任何应用程序,或使用 Android Studio 创建一个新的 Android 项目。在主活动中添加一个方法并粘贴您想要的 smali 代码的 java 代码。现在将应用编译为 APK 并在 Jadx 中打开它。选择你已经添加方法切换到 Smali 视图的活动类。现在您可以简单地复制 samli 代码,可能只需要修改一些寄存器(例如,在这种情况下,v4
寄存器具有 byte[]
输入。