面对此景,我们有没有办法,去混淆一些核心代码,来捍卫自己劳动成果呢? 作为臣服于 Java 的子民们,一切又都是那么的幸福,诸多开源的轮子帮你解决了这个问题,今天不妨尝试用一用 ProGuard 这款轮子。 ProGuard 是一个压缩(shrink)、优化(optimize)和混淆(obfuscate) Java 字节码文件的免费的工具。 在 Input/Output 中,Add input 选择要混淆的 JAR 包,注意一定要添加待混淆的 JAR 包依赖的所有类库,Add output 指定输出文件名(例如 a.jar);压缩(Shrinking 采用 JD-GUI 打开根据混淆输出的 JAR,效果貌似像那么回事儿。 ?
这种方式就是本篇的主题,代码混淆(Obfuscation)混淆的核心概念在正式开始实战前,先对代码混淆的核心概念有一些认知。场景为什么需要代码混淆呢? 原理Java 是编译成Class字节码再被JVM所运行的,所以编译和运行阶段都是可以混淆的关键阶段。字节码工具: ASM、Javassist、Byte Buddy。 使用 ProGuard 混淆一款老牌的开源代码混淆器,截止目前,github上最新版为:v7.6,支持JDK 23。下载与打开任意版本都可以,内部自带快捷使用、演示包。 环境,可以直接双击lib/proguardgui.jar来启动,这是一个友好的 Java 构建的桌面版。 启动失败请检查环境或者尝试用java -jar 的命令来打开。使用说明首页就是广告,从第一个input / output上手,设置要输入等待混淆的jar包,以及设置输出路径。下图就是我的设置完的效果。
date.getTime()) { //执行相关操作 System.out.println("时间验证通过..."); } } } 2.采用混淆方法 ; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.text.DateFormat ; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Base64; import java.util.Base64 SecretKeySpec(Arrays.copyOf(MessageDigest.getInstance("MD5").digest(ZkCC.getBytes(StandardCharsets.UTF_8)), b[7] = " ".length(); b[4] = (0x1E ^ 0x1A); b[5] = (0x6 ^ 0x3); b[6] = (0xC3 ^ 0xC5); b[7]
JS混淆和反混淆常见思路 在了解了js代码的执行过程后,我们来看如何对js进行混淆。 可以想到比如我们想实现一个js混淆器我们该怎么做呢,要不就是用正则替换,要不就是在AST阶段生成混淆代码,用正则替换实现简单但是效果也比较差,现在js混淆大多数都是在不改变AST的情况下去生成混淆后的代码 代码混淆 这里我们抛砖引玉,讲一些比较常见的混淆方式,实际上混淆的办法非常的多。 x59\x56\x68\x43\x4d\x45\x70\x72\x57\x6a\x46\x69\x62\x54\x55\x31\x56\x46\x52\x43\x4d\x46\x6c\x56\x59\x7a 然后我们继续步进,可以看出这里其实是一个多次base64解码的过程 这里e的值为aGdhbWV7ZlVubnlKYXZhc2NyaXB0JkZ1bm55TTB0YUc0bWV9 函数的返回值是e然后
目标: 将代码混淆,也就是给第三方源代码,让他们只能运行,却看不懂代码。 用到的工具: 混淆jar的工具:proguard5.1 下载地址:http://download.csdn.net/detail/lk7688535/9625472 反编译jar的工具:xjad2.2 如上操作后便得到混淆后的jar包,再用xjad反编译就可得到混淆后的源代码了~
这俩天遇到了这样的问题,反编译JAR包之后,出现了没法再javac的问题(修改java文件再编译回去的想法泡汤),原因大概是因为JAR的发行商对其作了很多的加密混淆处理,和签名处理。 另外,它还提供一个库,可以让开发人员读写Java类文件和字节码。 这里有一点其实在java文件中定义的各种参数,编译成字节码文件的时候,都变成了字符串,只是逻辑位置不同,处于不同的域中。 // 使用JDK编译代码 javac XX.java 将需要去签名的jar包放到编译好的class文件的目录,或者记住jar包目录,打开DOS窗口: // 执行XX,如果是同一个文件夹 java XX <JAR名称> <去签名之后的JAR包名称> java -cp .
y4tracker师傅的博客文章:https://y4tacker.github.io/2022/11/27/year/2022/11/%E6%B5%85%E8%B0%88JspWebshell%E4%B9%8B%E7% BC%96%E7%A0%81/ 实现方式为对jspencounter项目进行调用(TIPS:在使用jspencounter时,可能会遇到一些无法判断问题源头的环境,有些文件运行了但没有编码)https: UTF-16LE", Boolean.FALSE, Integer.valueOf(4)}; } if (b0 == 0x4C && b1 == 0x6F && b2 == 0xA7 tomcat8能成功解析,并且godzilla能成功连接: 7 shell内容单/双重编码的代码实现 以下的编码代码,均可对xml格式的jsp马进行单/双重编码,并且在tomcat8下能正常解析和shell 无论是tomcat混淆或者是代码层的混淆,都只能增加蓝队的解密/还原代码的成本。tomcat混淆更偏向于代码不可读,代码层混淆更偏向于代码的可读性差。
github上的,免费的,英文的,JS混淆工具:https://js-obfuscator.github.io/UI:混淆测试:JS源码:(function (){ var domain = "js-obfuscator.com getFullYear() + "," + domain; }; var console_log = console.log; console_log(copyright())})();JS混淆结果 u006F\u0067']; _0xd = (885711 ^ 885702) + (139322 ^ 139320); _0xbe(_0xea());})();没改变代码结构,只是对代码中的每一行进行混淆变化
文章目录 一、Proguard 默认混淆结果 二、-keepclassmembers 混淆效果 二、-keepclasseswithmembernames 混淆效果 更多 ProGuard 混淆配置参考 , Thread , 其余 Java 文件都被混淆 ; 二、-keepclassmembers 混淆效果 ---- -keepclassmembers 作用只是保证类成员 ( 成员变量 , 成员方法 ) 不被混淆 , 类名还是会被混淆的 ; # 指定 kim.hsl.handler.Handler 类成员不被混淆 -keepclassmembers public class kim.hsl.handler.Handler 在编译后的结果中 , 类名与成员名称都被混淆了 , 因为没有配置不被混淆的成员 ; 使用 -keepclassmembers 指定保留 Handler 中的 public void *(*) 样式的方法不被混淆 *(*); } 下面是在一个被混淆的类中 , 找到了没有被混淆的 kim.hsl.handler.Handler 的成员方法 ; 二、-keepclasseswithmembernames 混淆效果
序 本文主要研究一下如何使用proguard混淆java9代码 maven <plugin> <groupId>com.github.wvengen }/jmods/java.base.jmod(! Home/jmods/java.base.jmod(! }/jmods/java.base.jmod(! >/jmods/java.base.jmod(!.
混淆矩阵是一个表,经常用来描述分类模型(或“分类器”)在已知真实值的一组测试数据上的性能。混淆矩阵本身比较容易理解,但是相关术语可能会令人混淆。 让我们从一个二进制分类器的混淆矩阵示例开始(尽管它可以很容易地扩展到两个以上的类): ? 我们能从这个矩阵中了解到什么? 有两种可能的预测类:“yes”和“no”。 我已经将这些项添加到混淆矩阵中,并且添加了行和列总数: ? 这是一个比率的列表,通常是从一个混淆矩阵的二元分类器里得出: 准确率(Accuracy):总的来说,分类器的准确率是多少?
混淆检测 是一款 Binary Ninja 插件,用于检测二进制文件中的混淆代码和可疑代码结构(例如状态机)。 此类代码结构可能实现 混淆代码 状态机和协议 C&C 服务器通信 字符串解密例程 加密算法 特征 识别大型二进制文件中有趣的代码结构 在 Binary Ninja 的图形视图中突出显示未对齐的指令 高效且与架构无关的实现
4.预检测(Preveirfy):在java平台上对处理后的代码进行再次检测。 详细介绍 (1) ProGuard 配置 -include{filename}:从给定的文件中读取配置参数。 ,在0~7之间,默认为5 -optimizationpasses 5 # 混淆时不使用大小写混合,由于windows对大小写不敏感, 混淆后的类名为小写 -dontusemixedcaseclassnames -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; ! (java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve();
文章目录 一、开启 ProGuard 混淆 二、混淆文件编写 三、混淆前后对比 四、build.gradle 完整配置文件 五、参考资料 一、开启 ProGuard 混淆 ---- 在 build.gradle , 保留反射中使用的类 ; 优化 Optimize : 优化字节码 , 移除无用指令 ; 混淆 Obfuscate : 混淆 Java 层代码 , 使用无意义的标识符替代 Java 中的类名 , 变量名 , 方法名 等名称 ; 预检 Preveirfy : 预检 Java 平台上预处理的代码 ; 开启 ProGuard 配置 : 在 build.gradle 构建脚本中的 " android .** " -keep " : 不要混淆的类 ; # com 包名下的类不要混淆 -keep class com.**{*;} 三、混淆前后对比 ---- 混淆前编译的 APK 安装包 : \rm 3.6 | -keepclassmembers 混淆效果 | -keepclasseswithmembernames 混淆效果 ) 【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息
在机器学习中,最后要计算混淆矩阵,常用的函数有: table confusionMatrix 下面以前馈神经网络为例来说明: > library("RSNNS") 载入需要的程辑包:Rcpp > 2.318266 iter 190 value 2.318228 iter 200 value 2.318209 final value 2.318200 converged > > #####预测和混淆矩阵
如果你初学编程,尤其是学Java,switch你是绕不过去的。而当你学习的时候,折腾你的可能还不是switch的定义,而是switch的语法,尤其是break的用法。 SWITCH 清单 Java中面对多个选择时可以直接使用switch,这样逻辑上简洁。 switch中break的用法是个坑,有它时,case执行完就跳出switch判断了。
为了防止重要code 被泄露,我们往往需要混淆(Obfuscation code , 也就是把方法,字段,包和类这些java 元素的名称改成无意义的名称,这样代码结构没有变化,还可以运行,但是想弄懂代码的架构却很难 proguard 就是这样的混淆工具,它可以分析一组class 的结构,根据用户的配置,然后把这些class 文件的可以混淆java 元素名混淆掉。 缺省情况下,proguard 会混淆所有代码,但是下面几种情况是不能改变java 元素的名称,否则就会这样就会导致程序出错。 一, 我们用到反射的地方。 三, 是我们的java 元素名称是在配置文件中配置好的。 所以使用proguard时,我们需要有个配置文件告诉proguard 那些java 元素是不能混淆的。 Java序列化方法,系统序列化需要固定的方法。
事物都有两面性,功能越强大混淆耗时越长,如果你的项目很大,混淆几个小时也是有可能的,请不要见怪,后续持续优化中。 正常项目(或者第三方库)混淆完基本不报错(除了一些个别语法不严谨造成混淆后报错) 也欢迎大家使用不同工具混淆测试工程confuse_test或者第三方开源库项目,对比效果。 功能 confuse是一款混淆工具,尽可能模拟人工开发,仿照Xcode部分功能,避免机核4.3、2.1、2.3.1、账号调查等。 ,与Xcode保持一致 ‘参考项目根路径’设置,读取参考项目的单词、UUID ‘敏感词’过滤 ‘版本迭代混淆’,过审后迭代更新,沿用上一次(也可以任意选择版本)混淆记录增量混淆,保持版本连续性,模拟正常开发 优势:做到开发和混淆同步且各自独立。
代码混淆 代码混淆原因 Java 是一种跨平台的、解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中。 为了防止这种现象,我们可以使用 Java 混淆器对 Java 字节码进行混淆。 (); public static ** valueOf(java.lang.String); } 第三方库的混淆原则 一般的第三方库都有自身的混淆方案,可直接引用其自身的混淆配置即可 若无混淆配置 ,一般的可配置不混淆第三方库 基本配置 -optimizationpasses 5 #指定代码的压缩级别 0 - 7,一般都是5,无需改变 -dontusemixedcaseclassnames #不使用大小写混合 抛出异常时保留代码行数 -keepattributes SourceFile,LineNumberTable 比较完整的配置 -optimizationpasses 5 #指定代码的压缩级别 0 - 7,
那我们的命令可以这样写: java -jar proguard.jar @proguard.cfg 这个文件也就是我们在Android Studio中经常配置的混淆文件了。 版本号是1.0, 1.1, 1.2, 1.3, 1.4, 1.5(或者5), 1.6(或者6), 1.7(或者7),1.8(或者8)之中的一个。默认情况下,class文件的版本号是不会变的。 查找了字典文件的格式:一行一个单词,空行忽略,重复忽略 例如: # 这里巧妙地使用java中的关键字作字典,混淆之后的代码更加不利于阅读 # # This obfuscation dictionary 目标文件针对java6的情况下,预校验是可选的;针对java7的情况下,预校验是必须的,除非目标运行平台是Android平台,设置它可以节省一点点时间。 修饰符组合也是可以的,就像java中的public static一样,但是不能冲突, 比如public private。 混淆相关的点就这些了,下面的例子中是Android应用混淆的默认文件。