当前位置: 首页 > news >正文

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

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

本文采用的是对混淆后的代码,针对某些关键包的字节码数据计算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包中提前预制一个文件,通过修改文件内容来实现这个功能,这个办法也许行的通,明天早晨到公司一定要试试,这是下班回家路上想到的方案。

http://www.lryc.cn/news/189555.html

相关文章:

  • QTableWidget 表格部件
  • MySQL join的底层原理
  • 如何在 Spring Boot 中实现容错机制
  • Sqlite3 查询 今日、昨日、本周、上周、本月、上月、本季度、上季度、本年
  • IDEA XML文件里写SQL比较大小条件
  • Camtasia Studio2024最新版本正式更新上线!
  • 各种业务场景调用API代理的API接口教程
  • 安卓App使用HttpURLConnection发送请求与上传文件
  • 【Linux服务端搭建及使用】
  • 前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS进阶(三)
  • Linux 指令心法(十一)`tail` 显示文本文件的末尾部分
  • Mac mov转mp4,详细转换步骤
  • 高级深入--day31
  • 一文讲解图像梯度
  • 湖州OLED透明拼接屏技术应用引领现代化旅游观光方式
  • 点云从入门到精通技术详解100篇-点云特征学习模型及其在配准中的应用(续)
  • 铁道交通运输运营3D模拟仿真实操提供一个沉浸、高效且环保的情境
  • yum apt pip 阿里云源
  • Python+Tkinter 图形化界面基础篇:多线程和异步编程
  • 第13章 并发编程高阶(二)
  • Android AMS——栈管理详解(十一)
  • 【Redis】Set集合相关的命令
  • 力扣第501题 二叉树的众数 c++ (暴力 加 双指针优化)
  • MARKDOWN 文档图片编码嵌入方案
  • KubeVela可持续测试应用部署之Mock基础设施
  • 代理IP、Socks5代理与网络工程:解析技术世界的无限可能
  • OpenCV级联分类器识别车辆实践笔记
  • VS编译的时候不生成Release文件夹
  • 14.2 Socket 反向远程命令行
  • PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一)