每种混淆又分成两步,第一步是确定要混淆的内容,第二步进行内容替换,替换成随机字符。 1.变量名混淆 针对变量名的混淆,并不是所有变量名都能混淆的,因为要保证安全性,混淆过头了,程序就无法运行了。 :#导入模块中的变量/函数忽略 return '__skipnext__' if prev_tok_string == "for":#for循环中的变量如果长度大于2则进行混淆 for循环中的变量名长度小于等于2的过滤掉。 函数名过滤掉(接下来会有专门针对函数的处理方式)。 关键字和保留字过滤掉,长度小于3的名称也过滤掉。 2.函数名混淆 通过obfuscatable_function函数确定要混淆的函数名称,原理上很简单,排除类似_init_的函数,然后前一个token是def,那当前的token就是函数名称。 在Py3中,支持unicode字符作为变量名称,所以基本上是使用unicode字符作为数据源,混淆后会出现各个国家的语言符号,看着着实恶心,而Py2则是使用的ASCII码的大小写作为数据源。
放到混淆矩阵中就是真实情况为A类的像元数中有多少像元数被分类器分为了别的类别。 2 ---结果 kappa系数的计算结果处于(-1,1)之间,但一般情况下其结果处于(0,1)之间,且可分为五个级别来表示一致性: (0,0.2】表现为极低一致性; (0.2,0.4】表现为一般一致性; 除总体分类精度和kappa系数外,其他指标以A类为例: 1 ---总体分类精度 overall accuracy=(20+15+18)/100=53% 2 ---生产者精度 producer accuracy =20/(20+5+2)≈74% 3 ---用户精度 user accuracy=20/(10+10+20)=50% 4 ---错分误差 commission error =(10+10)/40 =1 -user accuracy=50% 5 ---漏分误差 omission error =(5+2)/27 =1-producer accuracy ≈26% 6 ---kappa系数 Po=0.53
为什么要进行混淆 由于设计原因,前端的js代码是可以在浏览器访问到的,那么因为需要让代码不被分析和复制从而导致更多安全问题,所以我们要对js代码进行混淆。 JS混淆和反混淆常见思路 在了解了js代码的执行过程后,我们来看如何对js进行混淆。 可以想到比如我们想实现一个js混淆器我们该怎么做呢,要不就是用正则替换,要不就是在AST阶段生成混淆代码,用正则替换实现简单但是效果也比较差,现在js混淆大多数都是在不改变AST的情况下去生成混淆后的代码 代码混淆 这里我们抛砖引玉,讲一些比较常见的混淆方式,实际上混淆的办法非常的多。 常见的混淆/反混淆工具 亲手尝试反混淆 HGAME 2023 Week1 Classic Childhood Game 当然直接执行mota()就能出,但是我们来尝试一下通过调试反混淆这段代码,看看是什么逻辑
我们需要做的是: 1.将release下minifyEnabled的值改为true,打开混淆; 2.加上shrinkResources true,打开资源压缩。 同时,如果重复资源在同一层次出现,比如src/main/res/ 和 src/main/res2/,则 gradle无法完成资源合并,这时会报资源合并错误。 *;} -keep class com.autonavi.aps.amapapi.model.**{*;} #搜索 -keep class com.amap.api.services.**{*;} #2D 地图 -keep class com.amap.api.maps2d.**{*;} -keep class com.amap.api.mapcore2d.**{*;} #导航 -keep class com.amap.api.navi -keepclassmembers,allowshrinking,allowobfuscation interface * { @retrofit2.http.* <methods>; } # Ignore
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 混淆配置参考 : https://www.guardsquare.com/en/products/proguard/manual/usage 一、Proguard 默认混淆结果 ---- ProGuard 的默认混淆结果 ) 不被混淆 , 类名还是会被混淆的 ; # 指定 kim.hsl.handler.Handler 类成员不被混淆 -keepclassmembers public class kim.hsl.handler.Handler 在编译后的结果中 , 类名与成员名称都被混淆了 , 因为没有配置不被混淆的成员 ; 使用 -keepclassmembers 指定保留 Handler 中的 public void *(*) 样式的方法不被混淆 *(*); } 下面是在一个被混淆的类中 , 找到了没有被混淆的 kim.hsl.handler.Handler 的成员方法 ; 二、-keepclasseswithmembernames 混淆效果
ProGuard默认会对第三方库也进行混淆的,而第三方库有的已经混淆过了,有的使用了Java反射技术,所以我们在进行代码混淆的时候要排除这些第三方库。 2.如果使用了自定义控件那么要保证它们不参与混淆。 3.如果使用了枚举要保证枚举不被混淆。 4.对第三方库中的类不进行混淆 a.混淆时保护引用的第三方jar包 如:-libraryjars libs/baidumapapi_v3_2_0.jar #保护引用的第三方jar包不被混淆 注意:在使用 **这个包里面的所有类和所有方法不被混淆。 附:小编开发中用到的一些混淆规则,大家可以根据需要复制到自己的项目中的混淆规则的文件中即可。 ############### -libraryjars libs/baidumapapi_v3_2_0.jar -libraryjars libs/locSDK_5.0.jar -keep class
1,加密,采用blowfish或其他 2,自定是32个字符的混淆code 3,对文件做blowfish加密,入口文件加密前将混淆code按约定格式(自定义的文件头或文件尾部)写入到文件 4,遍历资源目录 ,对每个文件做md5混淆,混淆原始串=“相对路径”+“文件名”+混淆code, 文件改名并且移动到资源目录根目录,清除原始目录 入口文件除外,因为入口文件也混淆的话就只能把混淆code 混淆后的文件名,混淆原始串=“相对路径”+“文件名”+混淆code 6,拿到目标文件名后,blowfish对文件数据解码读取文件 因为混淆用的md5,混淆码是写在加密后的入口文件内的,所以破解出文件名就只能解开入口文件 工具支持对OC、Swift、Flutter、H5、HBuilder、Unity3D、Cocos2dx等各种开发平台开发的app。 此iOS App代码混淆工具对代码进行分门别类、分级标注,混淆目标可控,强度可控,极大地简化了配置混淆内容的过程。
混淆矩阵是一个表,经常用来描述分类模型(或“分类器”)在已知真实值的一组测试数据上的性能。混淆矩阵本身比较容易理解,但是相关术语可能会令人混淆。 让我们从一个二进制分类器的混淆矩阵示例开始(尽管它可以很容易地扩展到两个以上的类): ? 我们能从这个矩阵中了解到什么? 有两种可能的预测类:“yes”和“no”。 我已经将这些项添加到混淆矩阵中,并且添加了行和列总数: ? 这是一个比率的列表,通常是从一个混淆矩阵的二元分类器里得出: 准确率(Accuracy):总的来说,分类器的准确率是多少?
2.优化(optimizes):对字节码进行优化,移除无用的指令。 dontskipnonpubliclibraryclasses:不忽略对非公开类的处理,默认是跳过 -dontskipnonpubliclibraryclassmembers:不忽略对非公开类的类库的成员 (2) 预检测 -dontpreverify 执行ProGuard后会生成的文件: 1)dump.txt 描述apk文件里的所以类的内部结构 2)mapping.txt 列出了原始的和混淆后的类 .** -keep class com.i2trust.orc.sdk.** {*;} -dontwarn com.intsig.** -keep class com.intsig.** {*;} api.** -keep class cn.org.bjca.anysign.android.R2.api.** {*;} -dontwarn com.sybase.** -keep class com.sybase
混淆检测 是一款 Binary Ninja 插件,用于检测二进制文件中的混淆代码和可疑代码结构(例如状态机)。 此类代码结构可能实现 混淆代码 状态机和协议 C&C 服务器通信 字符串解密例程 加密算法 特征 识别大型二进制文件中有趣的代码结构 在 Binary Ninja 的图形视图中突出显示未对齐的指令 高效且与架构无关的实现
一、混淆的意义 混淆代码并不是让代码无法被反编译,而是将代码中的类、方法、变量等信息进行重命名,把它们改成一些毫无意义的名字,同时也可以移除未被使用的类、方法、变量等。 2、移除未被使用的类、方法、变量等。 二、混淆的规则和配置 凡是需要在AndroidManifest.xml中去注册的所有类的类名以及从父类重写的方法名都自动不会被混淆。 开启混淆后也可添加shrinkResources,表示开启删除无用资源。 (2)shrinkResources shrinkResources为true用来开启删除无用资源。 proguard-rules.pro:代码表当前Project的混淆配置文件,在app module下,可以通过修改该文件来添加适用当前项目的混淆规则。 mapping.txt : 列出了原始的类、方法和名称与混淆代码间的映射。 seeds.txt : 列出了没有混淆的类和方法。 usage.txt : 列出congapk中删除的代码。
文章目录 一、开启 ProGuard 混淆 二、混淆文件编写 三、混淆前后对比 四、build.gradle 完整配置文件 五、参考资料 一、开启 ProGuard 混淆 ---- 在 build.gradle , 由系统自动生成 ; proguard-rules.pro 是用户自己配置的混淆配置文件 , 在进行打包时 , 将这两个 ProGuard 配置文件进行合并处理 ; 二、混淆文件编写 ---- 混淆文件编写 .** " -keep " : 不要混淆的类 ; # com 包名下的类不要混淆 -keep class com.**{*;} 三、混淆前后对比 ---- 混淆前编译的 APK 安装包 : \rm 3.6 | -keepclassmembers 混淆效果 | -keepclasseswithmembernames 混淆效果 ) 【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | 暴露更少信息 ) 【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt ) 博客资源 : GitHub
Android 代码混淆 简介 在我们日常开发中,对已经开发完成的源代码,需做一些代码混淆工作,以对代码起到一种保护和降低安装包体积的作用。 buildTypes { release { //开启代码混淆 minifyEnabled true //开启资源混淆 '), 'proguard-rules.pro' } } } 配置混淆文件 在app的proguard-rules.pro文件中编写混淆代码即可 混淆语法 命令 作用 * -keep class com.squareup.okhttp3.** { *;} -dontwarn okio.** Retrofit # Retrofit -dontwarn retrofit2. ** -keep class retrofit2.** { *; } -keepattributes Signature -keepattributes Exceptions RxJava RxAndroid
在机器学习中,最后要计算混淆矩阵,常用的函数有: table confusionMatrix 下面以前馈神经网络为例来说明: > library("RSNNS") 载入需要的程辑包:Rcpp > library("reshape") > #example data and code from nnet function examples > ir<-rbind(iris3[,,1],iris3[,,2] sample(1:50,25), sample(51:100,25), sample(101:150,25)) > ir1<-nnet(ir[samp,], targets[samp,], size = 2, 2.318266 iter 190 value 2.318228 iter 200 value 2.318209 final value 2.318200 converged > > #####预测和混淆矩阵 3 1 23 0 2 2 0 25 0 3 0 0 25 > table(targets[-samp,],predictions) predictions
Ty2y是国内一个JavaScript混淆加密平台,可以实现在线JS代码混淆加密。它有多达20多项的参数配置。 如下图所示:添加图片注释,不超过 140 字(可选) 本文将对这些配置实现的混淆加密的效果,进行详细说明(注:Before是未加密的代码,Afer是加密后的代码):局部变量名混淆例程:Beforefunction demo(){ var age=99;}Afterfunction demo(){ var _0xk$r=99;}全局变量名混淆例程:Beforevar age=99;function demo (){ var age = 99;}Aftervar _0xk$r=99;function demo(){ var age = 99;}局部函数名混淆例程:Beforefunction demo 例程:Beforevar num = 123;Aftervar num = 683517 ^ 683398;二进制表达式混淆将二进制表达式变形为函数调用表达式。
为了防止这种现象,我们可以使用 Java 混淆器对 Java 字节码进行混淆。 混淆原则 jni方法不可混淆,因为需要与native方法保持一致; 反射用到的类不混淆(否则反射可能出现问题); AndroidMainfest中的类不混淆,四大组件和Application的子类和Framework 等框架时,所写的JSON对象类不混淆,否则无法将JSON解析成对应的对象; 使用第三方开源库或者引用其他第三方的SDK包时,需要在混淆文件中加入对应的混淆规则; 有用到WEBView的JS调用也需要保证写的接口方法不混淆 (); public static ** valueOf(java.lang.String); } 第三方库的混淆原则 一般的第三方库都有自身的混淆方案,可直接引用其自身的混淆配置即可 若无混淆配置 ,否则,你的反射是获取不到资源id的 -keep class **.R$* { *; } #以下针对App本身设置 #保护WebView对HTML页面的API不被混淆 -keep class **.Webview2JsInterface
事物都有两面性,功能越强大混淆耗时越长,如果你的项目很大,混淆几个小时也是有可能的,请不要见怪,后续持续优化中。 正常项目(或者第三方库)混淆完基本不报错(除了一些个别语法不严谨造成混淆后报错) 也欢迎大家使用不同工具混淆测试工程confuse_test或者第三方开源库项目,对比效果。 可多次执行,指数x2递增 修改方法,模拟人工封装调用,优势: 对原方法进行拆分调用并根据参数类型(支持继承)局部调整,详情见支持参数类型汇总表 可多次执行,指数x2递增 重命名全局变量,智能名词替换 修改全局变量 ,替换全局变量名、全局变量转化为全局函数、混淆字符串变量值 修改局部变量,模拟人工封装调用,变量名关联类型,优势: 局部变量值运行时保持不变,详情见支持类型汇总表 可多次执行,指数x2递增 重命名多语言 该部分功能整合至C++中,支持cocos2dx自动过滤 Swift 适配Swift5.3,SPM包管理项目暂未测试 重命名属性,基本功能,不做过多描述,优势: 类似OC重命名属性,识别继承链及嵌套类型
proguard 就是这样的混淆工具,它可以分析一组class 的结构,根据用户的配置,然后把这些class 文件的可以混淆java 元素名混淆掉。 proguard 问题和风险 代码混淆后虽然有混淆优化的好处,但是它往往也会带来如下的几点问题 1,混淆错误,用到第三方库的时候,必须告诉 proguard 不要检查,否则proguard 会报错。 2,运行错误,当code 不能混淆的时候,我们必须要正确配置,否则程序会运行出错,这种情况问题最多。 3,调试苦难,出错了,错误堆栈是混淆后的代码 ,自己也看不懂。 为了避免风险,你可以只是混淆部分关键的代码,但是这样你的混淆的效果也会有所降低。 常见的不能混淆的androidCode Android 程序 ,下面这样代码混淆的时候要注意保留。 ,干脆都全部保留不混淆。
面对此景,我们有没有办法,去混淆一些核心代码,来捍卫自己劳动成果呢? 2. 工具而已,用就行了 ? 在 Input/Output 中,Add input 选择要混淆的 JAR 包,注意一定要添加待混淆的 JAR 包依赖的所有类库,Add output 指定输出文件名(例如 a.jar);压缩(Shrinking 采用 JD-GUI 打开根据混淆输出的 JAR,效果貌似像那么回事儿。 ? 保护你劳动成果的方式有很多种,本次 2 分钟简单的分享,只是让你们知道有 ProGuard 这款技术轮子存在,有太多的细节需要去实践,大家可以按需,自行按照官网进行深入使用。