混淆技术研究笔记(五)混淆后如何反篡改?

有了上一节的基础工具后,接下来要考虑如何反篡改。

本文采用的是对混淆后的代码,针对某些关键包的字节码数据计算md5值,对所有类计算完成后对md5值进行排序,排序后拼接字符串再次计算md5值,最后通过私钥对md5进行RSA对称加密,加密后的内容要放到核心的jar包中。

程序在启动时,需要有一些入口点调用代码校验,代码校验时使用classloader搜索指定包中的所有class数据,对这些数据按照相同的规则计算md5值,用公钥解析核心jar包中的加密信息,比对该信息和运行时计算的md5值是否匹配,如果一致则正常运行,如果不一致就终止运行。

运行时获取类信息可以使用Hutool的ClassScanner,这里不再提供详细代码。

接下来的重点就是如何对混淆后的代码进行签名加密,并且把加密信息写入到jar包中。首先已经存在的jar包是无法编辑的,没法直接往里面加入新的文件,因此可行的方式就是创建一个新的jar,把旧jar里面的信息全部拷贝过去,然后再写入新的内容,删除旧jar,把新的重命名为原jar包的名字即可。为了解决何时执行并且写入加密信息,想了几个方案。

方案一

参考 ant 的 task,增加一个新的 task,然后加入到插件配置中,在新的task中读取混淆后的代码,然后替换jar。

在实现这个方案的时候,首先发现一个问题就是无法正确读取混淆后的代码,代码读取的都是混淆前的,似乎是 target/classes 目录的代码,即使能读取混淆后的代码,混淆部分包名的时候无法预先指定要混淆的名字,想要固定需要手动通过 map 指定映射的名字,为了测试方案先绕过了读取类,尝试向jar写入信息,结果删除旧jar的时候发现无法删除,竟然被yguard的任务占用了,这个方案行不通,只能放弃。

方案二

jar包被占用不能覆盖后,只能想别的办法,已经把 mvn clean deploypackage 单独分出去了,是不是先 package 打包,再设法执行代码生成签名,这样分开操作一定不会被占用,最后在执行 deploy 发布。

为了实现这个功能将 yguard 插件的配置挪到了 pom.xml 中的 <profiles>中,添加了一个配置进行混淆,又增加了一个配置仍然使用前面task的方式进行覆盖。经过测试发现可以写入到jar包文件了,占用的问题解决了。

此时前面绕过的问题还要面对,如何在执行 task 时能在类路径中获取到混淆后的代码呢?想了想使用task不知道该如何配置才能让classpath中包含这七十多个jar包,如果打一个可执行jar包,通过 java -cp 手动指定所有类,这种方式似乎可行,如果纯手工操作,虽然麻烦,也是一个办法,但是如何想要集成到CI/CD环境,这种方式就太麻烦了,为了解决这个问题愁了一下午,连微信公众号都差点断更。

对ant和yguard的理解也在不断加深,很多细节不了解导致在反篡改这个功能受阻。在尝试这些方案时,还没看过yguard的代码,混淆技术研究笔记(二)yGuard入门 中介绍的 <externalclasses> 我也不明白,如果当时看到这里,也许就有简单办法实现。

我在一些文章中表达过很多次这种想法,针对某个问题的解决方案,在不同时刻思考得出的方案是不一样的,遇到难题,放松一下再思考,也许能得到更好的解决办法。

方案三

终于看了yguard的源码,没看太明白,没找到合适的入口,在我解决混淆代码处理SPI接口文件名时,用到了<adjust>配置,这个配置可以修改文件名,还支持修改文件内容,能不能从这儿入手,写一个类似 <adjust> 的实现,我可能还需要预先在核心jar包中提前预制一个文件,通过修改文件内容来实现这个功能,这个办法也许行的通,明天早晨到公司一定要试试,这是下班回家路上想到的方案。

相关推荐
惊讶的猫5 小时前
探究StringBuilder和StringBuffer的线程安全问题
java·开发语言
jmxwzy5 小时前
Spring全家桶
java·spring·rpc
Halo_tjn5 小时前
基于封装的专项 知识点
java·前端·python·算法
Fleshy数模6 小时前
从数据获取到突破限制:Python爬虫进阶实战全攻略
java·开发语言
像少年啦飞驰点、6 小时前
零基础入门 Spring Boot:从“Hello World”到可上线的 Web 应用全闭环指南
java·spring boot·web开发·编程入门·后端开发
苍煜6 小时前
万字详解Maven打包策略:从基础插件到多模块实战
java·maven
有来技术6 小时前
Spring Boot 4 + Vue3 企业级多租户 SaaS:从共享 Schema 架构到商业化套餐设计
java·vue.js·spring boot·后端
东东5166 小时前
xxx医患档案管理系统
java·spring boot·vue·毕业设计·智慧城市
一个响当当的名号7 小时前
lectrue9 索引并发控制
java·开发语言·数据库
进阶小白猿7 小时前
Java技术八股学习Day30
java·开发语言·学习