zoukankan      html  css  js  c++  java
  • 破解 jeb 2.3.7 demo

    前言

    使用的技术和上文的一样。

    mips 版本的修改版

    修改版:

    https://gitee.com/hac425/jeb-mips
    

    正文

    安卓版

    jeb-2.3.7.201710262129-JEBDecompilerDemo-121820464987384338

    重新编译一个 com.pnfsoftware.jeb.client.Licensing

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package com.pnfsoftware.jeb.client;
    
    import com.pnfsoftware.jeb.AssetManager;
    import com.pnfsoftware.jeb.util.format.Strings;
    import com.pnfsoftware.jeb.util.logging.GlobalLog;
    import com.pnfsoftware.jeb.util.logging.ILogger;
    import com.pnfsoftware.jebglobal.GN;
    import com.pnfsoftware.jebglobal.mW;
    
    public final class Licensing {
        private static final ILogger logger = GlobalLog.getLogger(Licensing.class);
        public static final String user_email = "love_lh@hac425.com";
        public static final String user_group = "hacker";
        public static final int user_id = 2116188757;
        public static final String user_name = "hac425";
        public static final int user_count = 20;
        public static final int license_ts = 0;
        public static final int license_validity = 40000;
        public static int real_license_ts = 0;
        public static int build_type = 0;
        public static final int FLAG_AIRGAP = 8;
        public static final int FLAG_ANYCLIENT = 16;
        public static final int FLAG_COREAPI = 32;
        public static final int FLAG_DEBUG = 1;
        public static final int FLAG_FLOATING = 4;
        public static final int FLAG_FULL = 2;
        public static final int FLAG_JEB2 = 128;
    
    
        static {
            int v0 = Licensing.build_type | 2;
            Licensing.build_type = v0;
            v0 |= 4;
            Licensing.build_type = v0;
            v0 |= 8;
            Licensing.build_type = v0;
            v0 |= 16;
            Licensing.build_type = v0;
            v0 |= 32;
            Licensing.build_type = v0;
            Licensing.build_type = v0 | 128;
        }
    
    
        public Licensing() {
        }
    
        public static final void setLicenseTimestamp(int var0) {
            real_license_ts = 1505267330;
        }
    
        public static final int getExpirationTimestamp() {
            return real_license_ts + 345600000;
        }
    
        public static final int getBuildType() {
            return build_type;
        }
    
        public static final boolean isDebugBuild() {
            return true;
        }
    
        public static final boolean isReleaseBuild() {
            return !isDebugBuild();
        }
    
        public static final boolean isFullBuild() {
            return true;
        }
    
        public static final boolean isDemoBuild() {
            return !isFullBuild();
        }
    
        public static final boolean isFloatingBuild() {
            return (build_type & 4) != 0;
        }
    
        public static final boolean isIndividualBuild() {
            return !isFloatingBuild();
        }
    
        public static final boolean isAirgapBuild() {
            return (build_type & 8) != 0;
        }
    
        public static final boolean isInternetRequired() {
            return false;
        }
    
        public static final boolean allowAnyClient() {
            return (build_type & 16) != 0;
        }
    
        public static final boolean canUseCoreAPI() {
            return true;
        }
    
        public static final String getBuildTypeString() {
            StringBuilder var0 = new StringBuilder();
            if (isReleaseBuild()) {
                var0.append(mW.UU(new byte[]{-119, 23, 9, 9, 4, 18, 22, 74}, 1, 251));
            } else {
                var0.append(mW.UU(new byte[]{35, 1, 7, 23, 18, 72}, 1, 71));
            }
    
            if (isFullBuild()) {
                var0.append(mW.UU(new byte[]{37, 26, 28, 21, 93}, 2, 39));
            } else {
                var0.append(mW.UU(new byte[]{39, 10, 29, 22, 93}, 2, 200));
            }
    
            if (isFloatingBuild()) {
                var0.append(mW.UU(new byte[]{-114, 10, 3, 14, 21, 29, 7, 9, 72}, 1, 232));
            } else {
                var0.append(mW.UU(new byte[]{42, 1, 20, 16, 4, 0, 3, 29, 21, 76, 7}, 2, 150));
            }
    
            if (isAirgapBuild()) {
                var0.append(mW.UU(new byte[]{34, 6, 2, 84, 21, 8, 23, 71}, 2, 100));
            } else {
                var0.append(mW.UU(new byte[]{8, 23, 20, 92, 68, 7, 26, 17, 23, 28, 11, 17, 91}, 1, 122));
            }
    
            if (allowAnyClient()) {
                var0.append(mW.UU(new byte[]{82, 15, 23, 84, 78, 15, 5, 12, 11, 26, 91}, 1, 51));
            } else {
                var0.append(mW.UU(new byte[]{-85, 9, 0, 15, 10, 10, 8, 13, 65, 78, 15, 5, 12, 11, 26, 91}, 1, 196));
            }
    
            if (canUseCoreAPI()) {
                var0.append(mW.UU(new byte[]{32, 0, 2, 28, 95, 8, 23, 1}, 2, 169));
            } else {
                var0.append(mW.UU(new byte[]{-27, 1, 66, 78, 12, 29, 23, 72, 76, 17, 25}, 1, 139));
            }
    
            return var0.toString();
        }
    
        public static String getLicense() {
            byte[] var0 = AssetManager.UU("LICENSE.TXT");
            return var0 == null ? null : Strings.decodeUTF8(var0);
        }
    
        public static String getChangeList() {
            byte[] var0 = AssetManager.UU("CHANGELIST.TXT");
            return var0 == null ? null : Strings.decodeUTF8(var0);
        }
    
    }
    
    

    然后patch掉退出函数和更新检测

    package me.hacklh;
    
    import com.pnfsoftware.jeb.Launcher;
    import javassist.ClassPool;
    import javassist.CtClass;
    import javassist.CtMethod;
    import javassist.CtNewMethod;
    import com.pnfsoftware.jeb.client.Licensing;
    
    
    public class JebCracker {
    
        public static void main(String[] args) throws Exception {
    
    //        com.pnfsoftware.jeb.installer.Launcher.main(new String[]{"--di"});
    //        DES.main(args);
    //         Launcher.main(new String[]{"--generate-key"});
            CtClass.debugDump = "./debugDump/";
    
            System.out.println(Licensing.allowAnyClient());
    
            /**
             * 修改getStatus, AbstractContext会起几个线程修改status
             */
            ClassPool pool = ClassPool.getDefault();
            pool.importPackage("com.pnfsoftware.jeb.client.AbstractContext");
            CtClass old_class = pool.get("com.pnfsoftware.jeb.client.AbstractContext");
            old_class.detach();
            CtMethod old_method = old_class.getDeclaredMethod
                    (
                            "getStatus",
                            new CtClass[]
                                    {
                                    }
                    );
            old_method.setBody("return 0;");
    
            old_method = old_class.getDeclaredMethod
                    (
                            "terminate",
                            new CtClass[]
                                    {
                                    }
                    );
            old_method.setBody(";");
            old_class.writeFile();
    
    
    
            /**
             * patch 掉与网络下载有关的函数,禁止升级
             */
            pool = ClassPool.getDefault();
            pool.importPackage("com.pnfsoftware.jeb.util.net.Net");
            old_class = pool.get("com.pnfsoftware.jeb.util.net.Net");
            old_class.detach();
            old_method = old_class.getDeclaredMethod
    
                    (
                            "downloadBinary",
                            new CtClass[]
                                    {
                                            pool.get(String.class.getName())
                                    }
                    );
            old_method.setBody("return null;");
    
            old_method = old_class.getDeclaredMethod
                    (
                            "httpPost",
                            new CtClass[]
                                    {
                                            pool.get(String.class.getName()),
                                            pool.get(String.class.getName()),
                                            pool.get(long[].class.getName())
                                    }
                    );
            old_method.setBody("return null;");
            old_class.writeFile();
    
    
        }
    }
    
    
    

    mips版
    类似

    最后

    可以在jeb的官网下载其他平台的适配包

    https://www.pnfsoftware.com/jeb2/support-package
    
  • 相关阅读:
    TortoiseGit 的下载与安装
    CountDownLatch在多线程程序中的应用
    IDEA中maven的依赖jar包报红
    监控中的TP50
    BeanUtils.copyProperties方法,当属性Date为null解决
    SimpleDateFormat的安全问题解决方法
    java修饰符用法
    java实现快速排序
    京东2016实习生编程题—生日礼物
    美图笔试算法题(两个人拿石头判断输赢)
  • 原文地址:https://www.cnblogs.com/hac425/p/9416948.html
Copyright © 2011-2022 走看看