/AllatoriCrack

破解 Java 混淆工具 Allatori

Primary LanguageJava

AllatoriCrack

破解 Java 混淆工具 Allatori

基于当前最新的 7.6版本

使用方法

​ 导入项目

​ 添加 lib里面 jar 的引用

​ main.java 右键运行即可

​ 根目录下的cracked.jar 就是破解后的jar包

​ allatori.jar 放在根目录即可

​ 只保证 7.6 可使用

根据 https://www.52pojie.cn/thread-622023-1-1.html 做了一些改进

帖子里面没有具体代码 没有具体实现 QAQ

还要求在ubuntu下反编译

实际操作了一下,要求在ubuntu环境下主要是因为 windows 目录不区分大小写 Allatori 都是 iIIii 大小写的i混合的文件名

如果只是为了大小写 那用zip操作即可

具体流程为:

zip 读取Allatori.jar 找到所有的class

使用 javassist 读取class的字节码

判断这个类是否有 THIS_IS_DEMO_VERSION_NOT_FOR_COMMERCIAL_USE 方法

然后替换这个方法的返回值

String 返回值的解密全部条件都带上判断即可(有坑 下面有写)

但是要移除

System.out.println()

    ################################################
    #                                              #
    #        ## #   #    ## ### ### ##  ###        #
    #       # # #   #   # #  #  # # # #  #         #
    #       ### #   #   ###  #  # # ##   #         #
    #       # # ### ### # #  #  ### # # ###        #
    #                                              #
    # Obfuscation by Allatori Obfuscator v7.6 DEMO #
    #                                              #
    #           http://www.allatori.com            #
    #                                              #
    ################################################

全部都操作完

简单项目ok

复杂项目加密出错...

查看了一下加密信息

很多的类出现了方法名称重复

大概就是比较长的类

原来是有一个

​ ALLATORIXDEMO方法

​ 还有一个随机英文大小写字符 的方法

  m.insertAfter(" if             ($_!=null&&!$_.isEmpty()&&$_.equals(\"ALLATORIxDEMO\")) {\n" +"$_ = \"qtfreet00\";\n" +"}");

按 qtfreet00 的做法 过滤返回参数是 ALLATORIxDEMO 应该就是可行的 但是不知道为什么 一样被替换了

打印方法入参进行对比

第一行是参数

第二行是返回值

依次交替

(Lc/m/common/utils/MapCache;Ljava/lang/Object;J)V (Lc/m/common/utils/MapCache;Ljava/lang/Object;J)V c.m.common.utils.i&&(Lc/m/common/utils/MapCache;Ljava/lang/Object;J)V (Lc/m/common/utils/MapCache;Ljava/lang/Object;J)V (Lc/m/common/utils/MapCache;Ljava/lang/Object;J)V c.m.common.utils.i&ALLATORIxDEMO&Lc/m/common/utils/MapCache; null c.m.common.utils.MapCache&AllatoriDecryptString&(Ljava/lang/String;)Ljava/lang/String; null c.m.common.utils.MapCache&keys&()Ljava/util/Set; keys c.m.common.utils.MapCache&put&(Ljava/lang/Object;Ljava/lang/Object;J)Ljava/lang/Object; put c.m.common.utils.MapCache&clear&()V clear c.m.common.utils.MapCache&get&(Ljava/lang/Object;Lc/m/common/utils/Callable;)Ljava/lang/Object; get c.m.common.utils.MapCache&reSize&()V reSize c.m.common.utils.MapCache&get&(Ljava/lang/Object;JLc/m/common/utils/Callable;)Ljava/lang/Object; get c.m.common.utils.MapCache&put&(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; put c.m.common.utils.MapCache&ALLATORIxDEMO&(Lc/m/common/utils/i;)Z null c.m.common.utils.MapCache&remove&(Ljava/lang/Object;)V remove c.m.common.utils.MapCache&get&(Ljava/lang/Object;)Ljava/lang/Object; get c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache&contains&(Ljava/lang/String;)Z contains c.m.common.utils.MapCache&size&()I size c.m.common.utils.MapCache&&()V c.m.common.utils.MapCache&ALLATORIxDEMO&Lc/m/common/utils/MapEx; null c.m.common.utils.i&ALLATORIxDEMO&Lc/m/common/utils/MapCache; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.i&&(Lc/m/common/utils/MapCache;Ljava/lang/Object;J)V c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&Lc/m/common/utils/MapEx; ALLATORIxDEMO c.m.common.utils.MapCache&AllatoriDecryptString&(Ljava/lang/String;)Ljava/lang/String; F c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&keys&()Ljava/util/Set; keys c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&put&(Ljava/lang/Object;Ljava/lang/Object;J)Ljava/lang/Object; put c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&clear&()V clear c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&get&(Ljava/lang/Object;Lc/m/common/utils/Callable;)Ljava/lang/Object; get c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&reSize&()V reSize c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&get&(Ljava/lang/Object;JLc/m/common/utils/Callable;)Ljava/lang/Object; get c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&put&(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; put c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Lc/m/common/utils/i;)Z ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&remove&(Ljava/lang/Object;)V remove c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&get&(Ljava/lang/Object;)Ljava/lang/Object; get c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&contains&(Ljava/lang/String;)Z contains c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&size&()I size c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&&()V c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&AllatoriDecryptString&(Ljava/lang/String;)Ljava/lang/String; F c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&AllatoriDecryptString&(Ljava/lang/String;)Ljava/lang/String; F c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&AllatoriDecryptString&(Ljava/lang/String;)Ljava/lang/String; F c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&AllatoriDecryptString&(Ljava/lang/String;)Ljava/lang/String; F c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.i&ALLATORIxDEMO&Lc/m/common/utils/MapCache; ALLATORIxDEMO Lc/m/common/utils/MapCache; null (Lc/m/common/utils/MapCache;Ljava/lang/Object;J)V null Lc/m/common/utils/MapCache; null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&AllatoriDecryptString&(Ljava/lang/String;)Ljava/lang/String; F c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&AllatoriDecryptString&(Ljava/lang/String;)Ljava/lang/String; F c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&AllatoriDecryptString&(Ljava/lang/String;)Ljava/lang/String; F c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.i&&(Lc/m/common/utils/MapCache;Ljava/lang/Object;J)V (Lc/m/common/utils/MapCache;Ljava/lang/Object;J)V null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&reSize&()V reSize c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&put&(Ljava/lang/Object;Ljava/lang/Object;J)Ljava/lang/Object; put c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&get&(Ljava/lang/Object;)Ljava/lang/Object; get c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Lc/m/common/utils/i;)Z ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&Lc/m/common/utils/MapEx; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&get&(Ljava/lang/Object;JLc/m/common/utils/Callable;)Ljava/lang/Object; get (Lc/m/common/utils/MapCache;Ljava/lang/Object;J)V null Lc/m/common/utils/MapCache; null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&AllatoriDecryptString&(Ljava/lang/String;)Ljava/lang/String; F c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c/m/common/utils/MapCache null c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache [INFO] Obfuscation completed. Writing log file... c.m.common.utils.i&ALLATORIxDEMO&Lc/m/common/utils/MapCache; ALLATORIxDEMO c.m.common.utils.MapCache c.m.common.utils.MapCache c.m.common.utils.MapCache&ALLATORIxDEMO&(Lc/m/common/utils/i;)Z ALLATORIxDEMO c.m.common.utils.MapCache&ALLATORIxDEMO&(Lc/m/common/utils/i;)Z " s="118" e="118 c.m.common.utils.MapCache&ALLATORIxDEMO&(Ljava/lang/String;)Ljava/lang/String; ALLATORIxDEMO c.m.common.utils.MapCache&AllatoriDecryptString&(Ljava/lang/String;)Ljava/lang/String; F c.m.common.utils.MapCache&clear&()V clear c.m.common.utils.MapCache&clear&()V " s="103" e="107 c.m.common.utils.MapCache&contains&(Ljava/lang/String;)Z contains c.m.common.utils.MapCache&contains&(Ljava/lang/String;)Z " s="6" e="6 c.m.common.utils.MapCache&get&(Ljava/lang/Object;)Ljava/lang/Object; get c.m.common.utils.MapCache&get&(Ljava/lang/Object;)Ljava/lang/Object; " s="22" e="233 c.m.common.utils.MapCache&get&(Ljava/lang/Object;JLc/m/common/utils/Callable;)Ljava/lang/Object; get c.m.common.utils.MapCache&get&(Ljava/lang/Object;JLc/m/common/utils/Callable;)Ljava/lang/Object; " s="47" e="224 c.m.common.utils.MapCache&get&(Ljava/lang/Object;Lc/m/common/utils/Callable;)Ljava/lang/Object; get c.m.common.utils.MapCache&get&(Ljava/lang/Object;Lc/m/common/utils/Callable;)Ljava/lang/Object; " s="115" e="115 c.m.common.utils.MapCache&keys&()Ljava/util/Set; keys c.m.common.utils.MapCache&keys&()Ljava/util/Set; " s="72" e="72 c.m.common.utils.MapCache&put&(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; put c.m.common.utils.MapCache&put&(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; " s="3" e="3 c.m.common.utils.MapCache&put&(Ljava/lang/Object;Ljava/lang/Object;J)Ljava/lang/Object; put c.m.common.utils.MapCache&put&(Ljava/lang/Object;Ljava/lang/Object;J)Ljava/lang/Object; " s="112" e="210 c.m.common.utils.MapCache&reSize&()V reSize c.m.common.utils.MapCache&reSize&()V " s="40" e="190 c.m.common.utils.MapCache&remove&(Ljava/lang/Object;)V remove c.m.common.utils.MapCache&remove&(Ljava/lang/Object;)V " s="71" e="209 c.m.common.utils.MapCache&size&()I size c.m.common.utils.MapCache&size&()I " s="132" e="230 c.m.common.utils.MapCache&ALLATORIxDEMO&Lc/m/common/utils/MapEx; ALLATORIxDEMO

对比发现 入参带有 AllatoriDecryptString 的是返回 一个随机英文大小写字符

修改判断代码 $_ 前面加上 $1.indexOf("AllatoriDecryptString")

搞定收工

其中引用了

https://github.com/MoofMonkey/Allatori-Crack

项目 不过里面的是 5.2的版本 已经完全不适合当前版本了

只用了 zip 过程

懒得写zip

懒得整理代码了

反正能跑 只用一次 生成后基本没用了