一、简单的防御方案:构造函数调用
(一)在Smali文件中,可以通过简单的构造函数调用来过部分字符串解密工具的检测。例如,将原本的 const-string 指令直接替换为通过构造函数来创建字符串。
Smali
原始字符串:
# 原始的Smali代码
const-string v1, "a"
# 修改后的Smali代码
new-instance v0, Ljava/lang/String;
const-string v1, "a"
invoke-direct {v0, v1}, Ljava/lang/String;-><init>(Ljava/lang/String;)V
通过这种方式,字符串不再是直接以 const-string 的形式出现,而是通过 new-instance v0, Ljava/lang/String;
const-string v1, "a"
invoke-direct {v0, v1}, Ljava/lang/String;-><init>(Ljava/lang/String;)V( new String() ) 的方式构造。这使得字符串解密工具在提取字符串时会无视这一段。
二、Java代码示例对应的Java代码如下:
Java
new String("a");
这种简单的方式能有效防止部分工具的检测
二、更复杂的防御方案:重定义输出流与动态生成字符串
(一)更复杂的防御方案是通过重定义输出流和动态生成字符串来增加解密的难度和防止字符串解密工具检测。我们可以使用如 char 类型动态生成 String 类型。
Smali
# 定义一个字符数组
const/4 v0, 0x0
new-array v0, v0, [C
const/16 v1, 0x0
const/16 v2, 0x41
aput-char v2, v0, v1
const/16 v1, 0x1
const/16 v2, 0x42
aput-char v2, v0, v1
const/16 v1, 0x2
const/16 v2, 0x43
aput-char v2, v0, v1
# 将字符数组转换为字符串
new-instance v1, Ljava/lang/String;
invoke-direct {v1, v0}, Ljava/lang/String;-><init>([C)V
(二)Java代码示例对应的Java代码如下:
Java
char[] chars = new char[3];
chars[0] = 'A';
chars[1] = 'B';
chars[2] = 'C';
String obfuscatedString = new String(chars);
通过这种方式,也可以过字符串解密工具的字符串检测,也能增加解密难度。
三、总结
以上两种简单防御方案能过Mt NP的字符串检测,思路是没问题的,但例子是AI生成的,可能有问题 仅供参考,勿喷。希望有更多大佬能够提供更好的方法,如有说的不对的地方 希望原谅并指出,谢谢。
YuriNao
2025.03.16
还没有评论,来说两句吧...