yuren0 发表于 2022-12-4 14:55

Java字符串加密插件StringFog编解码易语言源码加成品

本帖最后由 yuren0 于 2022-12-4 14:57 编辑

前言
这几天抓某APP的api_sign时,jadx_gui搜索了一下字符串,发现全部被加密为类似Base64编码了,但经测试,字符串是使用StringFog插件加密后保存的
跟进看了下,是原生StringFog的Base64加XOR,方便调试,就用易还原了一下
作者的github库:https://github.com/MegatronKing/StringFog
截图
https://cdnpic.wuxiu0.cn/uploads/2022/12/Snipaste_2022_12_04_14_40_44.jpghttps://cdnpic.wuxiu0.cn/uploads/2022/12/Snipaste_2022_12_04_14_41_26.jpg
https://cdnpic.wuxiu0.cn/uploads/2022/12/yuanshidaima.jpghttps://cdnpic.wuxiu0.cn/uploads/2022/12/Snipaste_2022_12_04_14_56_11.jpg
关键代码
.版本 2

.子程序 操作字符, 文本型, , 加密和解密都是采用base64加XOR,所以直接一个子程序可以搞定
.参数 待解密字节集, 字节集, , 待操作的字节集数据,不管解码还是加密,都是先转为字节集
.参数 密钥key, 文本型, , 用于加解密时的密钥key值
.参数 解码方式, 逻辑型, , 决定操作方式,为 真 则解码,为 假 则为加密
.局部变量 v3, 整数型
.局部变量 I, 整数型
.局部变量 i2, 整数型
.局部变量 返回字节集, 字节集
.局部变量 len, 整数型

v3 = 1
i2 = 1
len = 取字节集长度 (待解密字节集)
返回字节集 = 取空白字节集 (len)
.计次循环首 (取字节集长度 (待解密字节集), I)
    .如果真 (I > 取文本长度 (密钥key))
      i2 = I - 取文本长度 (密钥key)
    .如果真结束
    待解密字节集 = 位异或 (待解密字节集 , 取代码 (取文本中间 (密钥key, i2, 1), ))
    返回字节集 = 待解密字节集
    v3 = v3 + 1
    i2 = i2 + 1
.计次循环尾 ()
.判断开始 (解码方式 = 真)
    返回 (字节集_到文本 (返回字节集))
.默认
    返回 (编码_BASE64编码 (返回字节集))
使用了精易模块
下载地址
链接:https://yuren0.lanzoue.com/i7BBU0hqrb8f
密码:52pj

小众资源 发表于 2022-12-4 15:52

易友路过支持一下

runfog 发表于 2022-12-4 15:58

使用了精易模块

Tonyha7 发表于 2022-12-4 18:10

可以用mt的dex字符串解密 老方便了{:301_978:}

lfordch 发表于 2022-12-4 21:04

感谢分享,学习了!{:301_975:}

myxiaowang 发表于 2022-12-5 09:40

分项一个java 加密的工具类

package com.gisdata.demoepidemic.util;

import org.apache.tomcat.util.codec.binary.Base64;
import sun.misc.BASE64Decoder;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

/**
* @version 1.0.0
* @Description
* @createTime 2022年12月01日 17:55:00
*/
public class EncrypyUtil {


    /**
   * 加密key 可替换 长度16
   */
    private static final String KEY = "abcdefgabcdefg12";

    /**
   * 加密方式 可替换 具体百度 PKCS7 等加密方式 java这个不需要额外插件
   */
    private static final String ALGORITHM = "AES/ECB/PKCS5Padding";

    /**
   * 先加密成base64
   * @Param bytes 字节
   * @Return String
   */
    public static String base64Encode(byte[] bytes){
      return Base64.encodeBase64String(bytes);
    }

    /**
   * 解密base64
   * @param base64Code base64
   * @return 字节数组
   * @throws Exception ex
   */
    public static byte[] base64Decode(String base64Code) throws Exception{
      return new BASE64Decoder().decodeBuffer(base64Code);
    }

    /**
   * 对字符串的字节数组进行Aes加密
   * @param content 加密字符串
   * @param encryptKey 加密key
   * @returnbyte[]
   * @throws Exception ex
   */
    public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {
      // AES加密
      KeyGenerator kgen = KeyGenerator.getInstance("AES");
      // 初始长度128
      kgen.init(128);
      Cipher cipher = Cipher.getInstance(ALGORITHM);
      // 密钥加密
      cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));

      return cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
    }

    /**
   * 对字符串的字节数组进行Aes加密
   * @param content 加密字符串
   * @param encryptKey 加密key
   * @returnbyte[]
   * @throws Exception ex
   */
    public static String aesEncrypt(String content, String encryptKey) throws Exception {
      // 加密后 在base64 转一下
      return base64Encode(aesEncryptToBytes(content, encryptKey));
    }

    /**
   * aes的解密
   * @param encryptBytes 加密字节
   * @param decryptKey key
   * @return 字符串
   * @throws Exception ex
   */
    public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception {
      KeyGenerator kgen = KeyGenerator.getInstance("AES");
      kgen.init(128);

      Cipher cipher = Cipher.getInstance(ALGORITHM);
      cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
      byte[] decryptBytes = cipher.doFinal(encryptBytes);

      return new String(decryptBytes);
    }

    /**
   * 解密
   * @param encryptStr 需要解密的对象
   * @param decryptKey 解密的key
   * @return String
   * @throws Exception ex
   */
    public static String aesDecrypt(String encryptStr, String decryptKey) throws Exception {
      return aesDecryptByBytes(base64Decode(encryptStr), decryptKey);
    }

    /**
   * 对外使用的加密
   * @param object 加密对象 需要对象重写ToString()方法
   * @return String
   * @throws Exception 异常
   */
    public static String encode(Object object) throws Exception {
      String content = object.toString();
      return aesEncrypt(content, KEY);
    }

    /**
   * 对外使用的解密
   * @param encrypt 需要解密的字符串
   * @return String
   * @throws Exception ex
   */
    public static String decode(String encrypt) throws Exception {
      return aesDecrypt(encrypt, KEY);
    }

}
页: [1]
查看完整版本: Java字符串加密插件StringFog编解码易语言源码加成品