字符串解密算法还愿
jeb.jar为核心功能,所以主要分析这个
1. jar转dex在使用jeb分析
Android\sdk\build-tools\23.0.3
dx.bat --dex --output=输出目录 jeb.jar(路径)
2. 载入分析发现很多字符串加密之后的字节数组
3.解密字符串代码在这里,把代码拷贝出来,直接解密发现乱码
4.仔细分析Smali代码发现问题出在寄存器解析上
这是因为v1寄存器重用了, 把v1_1修改成v1 即可成功解密字符串
5.算法也不难可以直接还原,还原后代码如下
private static String setString(byte[] bytes_str) {
String new_str;
try {
new_str = new String(bytes_str, "UTF-8");
}
catch(Exception e) {
new_str = new String(bytes_str);
}
return new_str;
}
public static String decStr(byte[] enStrBytes, int decFlag, int encode) {
byte[] decstrArray;
int enstrLen;
if(enStrBytes == null) {
return "decode error";
}
if (decFlag == 0 || enStrBytes.length == 0) {
return setString(enStrBytes);
}
if(decFlag == 1) {
enstrLen = enStrBytes.length;
decstrArray = new byte[enstrLen];
byte bEncode = ((byte)encode);
for (int i = 0;i < enstrLen;i++) {
decstrArray[i] = ((byte)(bEncode ^ enStrBytes[i]));
bEncode = decstrArray[i];
}
return setString(decstrArray);
}
if(decFlag == 2) {
enstrLen = enStrBytes.length;
decstrArray = new byte[enstrLen];
String coprightString = "Copyright (c) 1993, 2015, Oracle and/or its affiliates. All rights reserved. ";
int index = 0;
for (int i = 0;i < enstrLen;i++) {
decstrArray[i] = ((byte)(enStrBytes[i] ^ (((byte)coprightString.charAt(index)))));
index = (index + 1) % coprightString.length();
}
return setString(decstrArray);
}
return "decode error";
}
算法比较简单:
当Flag为0时,直接转换成字符串即可
当Flag为1时,简单的异或加密
当Flag为2时,和一个Copyright字符串声明做异或运算
最后解密的效果如下:
但是这样的代码实在是太多,我们只好上核武器JEB脚本
在下个章节介绍如何写JEB脚本去批量修改