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

news2024/11/17 8:55:21

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.coloradmin.cn/o/1083204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux之open和fopen的比较

1、fopen 是ANSIC标准中的C库函数&#xff0c;open是系统调用 2、fopen提供了IO缓存功能&#xff0c;而open没有&#xff0c;所以fopen速度要比open快 3、fopen具有良好的移植性&#xff0c;而open 是依赖于特定的环境 4、fopen返回一个FILE 结构体指针&#xff0c;而open 返…

MES管理系统如何解决电子企业的生产痛点

随着电子行业的快速发展&#xff0c;企业面临着越来越多的生产和管理挑战。其中&#xff0c;物料编码管理困难、产品设计工作繁重、客户需求多样化 以及产品设计变更管理困难等问题尤为突出。为了解决这些问题&#xff0c;许多电子企业开始引入MES管理系统解决方案&#xff0c;…

如何实现响应式网页设计?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

做直播或短视频 其实有几个精准粉丝就可以很快变现

随着短视频 和 直播 快速发展 人流量巨大 只要是个东西 只要你能豁得出去 都能卖出去 把精准流量引流到自己的私域里面 可以组建团队 一起发展 自己喝点汤就好 有一起做CSDN和其他短视频项目的 可以左上方私信留言 我怕说多了 审核不过去

Svelte生命周期(加整体概述)

目录 前言 一、编译阶段 1. 导入语句 2. 组件声明 3. 模板部分 4. CSS样式 二、运行时阶段 三、生命周期函数 1. onMount 2. beforeUpdate 与 afterUpdate 3. onDestroy 4. setContext 与 getContext 6. hasContext 7. getAllContexts 前言 Svelte是一种现代的Ja…

冠军代言|媒介易:释放品牌潜力,实力助力,助您势如破竹!

在竞争激烈的市场中&#xff0c;品牌需要不断创新&#xff0c;找到吸引目标客户的方法。而与体育冠军合作&#xff0c;通过冠军代言&#xff0c;已经成为了众多企业提高品牌知名度、树立形象、吸引消费者目光的重要策略之一。在这个领域&#xff0c;媒介易以其实力加冕&#xf…

如何正确高效使用墨西哥专线?

在当今全球化的物流行业中&#xff0c;跨境运输服务已经成为许多企业拓展国际市场的重要手段。然而&#xff0c;由于各国法律法规、文化差异以及运输环节的复杂性&#xff0c;企业在进行跨境运输时可能会遇到诸多挑战。为了解决这些问题&#xff0c;一些专业的物流公司推出了“…

浅谈电能质量监测装置在某半导体公司的应用

摘 要&#xff1a;半导体生产制造业在国民经济中起着举足轻重的作用&#xff0c;相关企业的规模也越来越大。其供配电系统稳定、可靠的运维不仅是其安全生产的基本保证&#xff0c;还关系到产品质量和生产的顺利进行。而半导体行业中大部分工艺设备对电能质量比较敏感&#xff…

KEIL5添加沁恒的ch55x芯片(其他非arm和stm32芯片也可使用类似的方法)

准备工作 参考&#xff1a;https://www.iotword.com/8615.html 已经安装好keil5的软件环境 烧录工具下载 沁恒烧录工具地址&#xff0c;下载安装后如下图 操作步骤 打开从沁恒官网下载安装好的WHCISPTOOL软件 安装下图中的操作方式完成对安装软件keil5中的配置文件的生…

京东商品列表数据接口,关键词搜索京东商品数据接口

在网页抓取方面&#xff0c;可以使用 Python、Java 等编程语言编写程序&#xff0c;通过模拟 HTTP 请求&#xff0c;获取京东网站上的商品页面。在数据提取方面&#xff0c;可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#xff0c;京东网站…

Camtasia Studio2024最新版本正式更新上线!

Camtasia Studio2024是一款专门录制屏幕动作的工具&#xff0c;它能在任何颜色模式下轻松地记录 屏幕动作&#xff0c;包括影像、音效、鼠标移动轨迹、解说声音等等&#xff0c;简单实用的视频录制软件,游戏的精彩画面,网络视频,屏幕录制可以让您录制屏幕所有内容视频录制支持3…

1806_emacs_org-mode归档的时候修改归档文件名称

全部学习汇总&#xff1a;GreyZhang/g_org: my learning trip for org-mode (github.com) 前面已经基本了解了org-mode的归档的规则或者方法&#xff0c;但是还有一点跟我现在的工作流有点不相符。我自己的工作流中会每月做一次工作的整理总结&#xff0c;因此归档的文件是按照…

Vue3新的状态管理库-Pinia(保姆级别教程)

目录 1.什么是Pinia2.为什么使用Pinia3.创建项目4.检查Pinia的安装版本5.main.js引入Pinia6.定义Store-组合式API写法(推荐)7.getters的实现8.action的异步实现9.storeToRefs 1.什么是Pinia Pinia是Vue的专属的最新状态管理库, 是Vuex状态管理工具的替代品 vue.js官网 https:…

柯桥学设计,室内设计当下,简约式的奢华正流行

清闲简练 石材原木的空间设计探索中强调与艺术美学的碰撞融合&#xff0c;Mohammad Alomran采用清爽的白色和温暖的奶油色调搭配&#xff0c;以简练当代的语言&#xff0c;实现优雅、简约的创意设计&#xff0c;形成空间独特的魅力。 J. SH 奢华在于细节&#xff0c;优雅在于…

小程序中使用echarts的相关配置以及折线图案例(简单易懂)

第一步&#xff1a;引入echarts文件--此文件需要下载&#xff1a; 下载地址&#xff1a;点击此处进行下载echarts文件 点击Download ZIP下载压缩包&#xff0c;注意&#xff1a;e-canvas是我从完整的文件中剥离出来的有用的&#xff0c;不会影响项目。 第二步&#xff1a;把整…

LNMP和数据库的安装

LNMP是什么 L&#xff1a;Linux平台&#xff0c;操作系统&#xff0c;另外桑组件的运行平台 N&#xff1a;nginx 提供前端页面 M&#xff1a;MySQL&#xff0c;开源关系的数据库&#xff0c;主要是用来保存用户账号信息。 P&#xff1a;PHP&#xff0c;开发一种动态页面的编程语…

jeecg库login登录过程分析笔记

jeecg库&#xff08;版本jeecg-boot-v3.5.1last&#xff09;实现了用户登录功能&#xff0c;二开时为了借鉴jeecg用户登录的方法&#xff0c;跑了一遍登录方法&#xff1a; org.jeecg.modules.system.controller.LoginController#login 定义这个方法的类的路径是&#xff1a;…

RabbitMQ之死信队列解读

目录 基本介绍 消息进入到死信队列的情况 消息过期 队列过期 队列达到最大长度&#xff08;先入队的消息会被发送到DLX&#xff09; 消费者拒绝消息不进行重新投递 消费者拒绝消息 springboot代码实战 实战架构 工程概述 RabbitConfigDeal 配置类&#xff1a;创建队列…

极简c++(9)函数模板与类模板

模板概念 函数模板 注意&#xff1a;不允许template与函数模板定义之间有任何语句&#xff1b; 类模板 没有讲的内容 后续需要可以自己查看补充。

C++ 使用getline()从文件中读取一行字符串

我们知道,getline() 方法定义在 istream 类中,而 fstream 和 ifstream 类继承自 istream 类,因此 fstream 和 ifstream 的类对象可以调用 getline() 成员方法。 当文件流对象调用 getline() 方法时,该方法的功能就变成了从指定文件中读取一行字符串。 该方法有以下 2 种语…