如何确保Java程序分发后不被篡改?使用JNI对Java程序进行安全校验

news2024/9/20 15:52:15

前言

众所周知,Java/Kotlin编译后会编译成smali,使用Jadx这类的反编译工具或者Hook工具就能很轻松的把我们的软件安全校验给破解了。

为了防止这种情况发生,我们一般会将核心代码使用C++编写,然后使用JNI技术,使用Java调用C++,因为C++编译后就成为了机器语言,反编译难度提高了可不止一倍两倍,但同时,如果我们的安全校验只在Java层面进行检查就很容易被去除。为此,我们可以使用C++来对Java程序进行安全检查,在发现被修改后就直接退出,因为核心逻辑是C++写的,如果C++的代码没有被
加载那么软件的壳被破解了也就毫无用途。

初步实现

初步实现可以看我之前写的:JNI的入门教程

在so加载时进行检查

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
    JNIEnv* env;
    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
        return JNI_ERR;
    }

#ifdef _RELEASE
	// 
    if (!xxxx.checkLicenceKey(env)) {
        std::cerr << "Licence key validation failed. Terminating execution." << std::endl;
        return JNI_ERR;  // 验证失败,停止执行
    }
    #endif
    return JNI_VERSION_1_6;  // 验证通过,继续执行
}

其中的ifdef _RELEASE是一个宏,代表被包裹的代码,仅在RELEASE编译模式下才会被执行,如果你没有这个宏可以在CMake中加入

# 在 Release 模式下定义 _RELEASE 宏
if(CMAKE_BUILD_TYPE STREQUAL "Release")
    add_definitions(-D_RELEASE)
endif()

它调用了其他C++方法进行内部检查,这块的检查可以根据你的实际情况来操作,我这里是封装了checkLicenceKey方法来检查许可证授权。

比如我是在C++中获取到程序的文件,然后进行签名检查,判断是否与程序正式对外发布的RELEASE签名相同,如果不相同直接在JNI_OnLoad这个方法返回错误就行了,(切记不要在RELEASE中输出任何的调试日志不然很容易被定位破解的)

JNI_OnLoad方法是当System.load()时会被触发的方法

这样,当你程序外发的时候so文件每次加载都会检查文件完整性,并且破解者也不能取消加载这个so,因为一旦取消,程序就完全成了壳了。

这样,如果有人想要破解我们的程序,在加载后就会遇到这个错误:
(同样也是千万别直接说明原因,那样不是给破解者找问题原因的吗,你应该返回一个毫不相干的Exception)
在这里插入图片描述

版权所有:XuanRan

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2149328.html

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

相关文章

TCP报文格式

RFC9293协议规范&#xff0c;规定的TCP格式如图1&#xff0c; 对比RFC793规定的格式&#xff0c;控制位从6bit变成了8bit 图1&#xff0c;图片来源&#xff1a;datatracker.ietf.org 图2为&#xff0c;可对照的中文版TCP格式&#xff0c;中文版参照的是RFC793 图2 重点…

htop 命令:系统状态监控

一、命令简介 ​htop ​是一个互动式的进程查看器&#xff0c;它是 top ​命令的增强版本&#xff0c;提供了更丰富的功能和更好的用户界面。htop ​显示了系统的实时进程和资源使用情况&#xff08;比如 CPU 和 memory 占用情况&#xff09;&#xff0c;允许用户进行交互式操…

基于Ubuntu的ECS实例实现OSS反向代理

阿里云OSS的存储空间&#xff08;Bucket&#xff09;访问地址会随机变换&#xff0c;您可以通过在ECS实例上配置OSS的反向代理&#xff0c;实现通过固定IP地址访问OSS的存储空间。 背景信息 阿里云OSS通过Restful API方式对外提供服务。最终用户通过OSS默认域名或者绑定的自定…

掌握Spring Boot数据库集成:用JPA和Hibernate构建高效数据交互与版本控制

在现代应用开发中&#xff0c;数据库操作是核心环节之一。Spring Boot提供了简化数据库集成的强大工具&#xff0c;而JPA&#xff08;Java Persistence API&#xff09;和Hibernate是两种非常流行的ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;可以帮助我们将对象…

CLI示例(V2R8至V2R19C00版本):直连二层组网直接转发【AP+上层网络,增加AP下行口有线接入】

CLI示例(V2R8至V2R19C00版本):直连二层组网直接转发【AP+上层网络,增加AP下行口有线接入】 适用于:V200R008至V200R019C00版本的AC,以及有空闲以太网口的AP。 说明:本示例基于“直连二层组网直接转发【AP+AC+出口网关】”场景来介绍如何增加AP下行口有线接入。 业务需求…

Vue使用代理方式解决跨域问题

1、解决跨域问题 如果 Vue 前端应用请求后端 API 服务器&#xff0c;出现跨域问题&#xff08;CORS&#xff09;&#xff0c;如下图&#xff1a; 解决方法&#xff1a;在 Vue 项目中&#xff0c;打开 vue.config.js 配置文件&#xff0c;在配置文件中使用代理解决跨域问题。 …

怎么找到抖音爆款内容,进行扩散传播?

企业如果想做好抖音平台的品牌营销&#xff0c;需要时刻监测抖音爆款内容并进行加热放大&#xff0c;据此快速创新和改进内容&#xff0c;才能短期提高品牌相关内容的曝光量&#xff0c;快速拉升品牌声量。怎么去找到抖音的爆款内容或者是值得品牌关注的优质内容&#xff0c;主…

印尼有几百种语言,初学者要怎么开始学习?《印尼语翻译通》app或许可以帮助你!印尼语零基础入门学习。

快速翻译&#xff0c;准确高效 采用最新技术&#xff0c;提供精准翻译。翻译结果符合中国人习惯。 体验印尼文化 学习地道印尼语&#xff0c;贴近当地文化。 旅游和工作的好帮手 提供旅游和商务用语&#xff0c;沟通无障碍。 学习印尼语的良师 文本和语音翻译&#xff0c;…

Spark-RDD持久化

一、Spark的三种持久化机制 1、cache 它是persist的一种简化方式&#xff0c;作用是将RDD缓存到内存中&#xff0c;以便后续快速访问&#xff0c;提高计算效率。cache操作是懒执行的&#xff0c;即执行action算子时才会触发。 2、persist 它提供了不同的存储级别&#xff0…

解锁数字转型新纪元:Vatee万腾平台,您的智能加速与策略智库

在数字经济时代的大潮中&#xff0c;企业的数字化转型已不再是选择题&#xff0c;而是必答题。面对这一挑战&#xff0c;Vatee万腾平台以其卓越的技术实力和前瞻性的战略视野&#xff0c;成为了众多企业加速数字化转型、实现智能化升级的得力助手和智囊团。 加速转型&#xff…

人工智能时代:程序员如何在变革中保持核心竞争力?

随着人工智能生成内容&#xff08;AIGC&#xff09;领域的快速发展&#xff0c;大语言模型如ChatGPT、Midjourney、Claude等层出不穷&#xff0c;AI辅助编程工具迅速普及&#xff0c;程序员的工作方式正在经历翻天覆地的变革。面对这一趋势&#xff0c;有人担心AI可能取代部分编…

嵌入式处理器详解

文章目录 一、CPU、MPU、MCU、SoC、Application Processors的概念1.CPU (Central Processing Unit)2.MPU (Micro Processor Unit)3.MCU (Micro Controller Unit)4.SoC(System on Chip)5.Application Processors 二、哈弗架构与冯诺伊曼架构三、XIP概念四、嵌入式系统硬件组成五…

【架构设计】多级缓存:应用案例与问题解决策略

【架构设计】多级缓存&#xff1a;应用案例与问题解决策略 多级缓存系统的工作原理及其在提升应用性能方面的关键作用。通过对比本地缓存与分布式缓存的特点 | 原创作者/编辑&#xff1a;凯哥Java | 分类&#xff1a;架构设计系列教程 多级缓存…

模拟电路分析基础知识总结笔记(电子电路分析与设计前置知识)

必备条件 电子电路的直流分析电子电路的正弦稳态分析RC电路的瞬态分析戴维南定理和诺顿定理拉普拉斯变换&#xff08;看不懂&#xff0c;根本看不懂&#xff09; 电子电路的直流分析 欧姆定律 ​ 在恒定温度下&#xff0c;电压与电流成正比&#xff0c;电压与电阻成正比&am…

Java-数据结构-优先级队列(堆)-(二) (゚▽゚*)

文本目录&#xff1a; ❄️一、PriorityQueue的常用接口&#xff1a; ➷ 1、PriorityQueue的特性&#xff1a; ➷ 2、使用PriorityQueue的注意&#xff1a; ➷ 3、PriorityQueue的构造&#xff1a; ☞ 1、无参数的构造方法&#xff1a; ☞ 2、有参数的构造方法&#xff1a; …

DCMM介绍

目录 一、介绍 二、核心摘要 三、体系大纲 四、能力评估 1、过程与活动 2、等级判定依据 3、访谈对象 一、介绍 通过阅读本书,您将洞悉国际数据框架体系,并掌握国家对于数据管理能力的权威评估标准与等级划分。本书详尽阐述了数据管理领域的八大核心能力域,以及这八大…

Flask、Werkzeug 和 WSGI 间的关系

一.Flask、Werkzeug和 WSGI 关系 1.WSGI Web 架构 Flask 是一个基于 Werkzeug 和 Jinja2 模板引擎的轻量级 Web 框架。Werkzeug 是 Flask 的底层 WSGI 工具包&#xff0c;它提供了 WSGI 服务器、请求和响应对象、路由等基础功能&#xff0c;Flask 在此基础上构建了更高级的 W…

HelpLook VS GitBook,在线文档管理工具对比

在线文档管理工具在当今时代非常重要。随着数字化时代的到来&#xff0c;人们越来越依赖于电子文档来存储、共享和管理信息。无论是与团队合作还是与客户分享&#xff0c;人们都可以轻松地共享文档链接或通过设置权限来控制访问。在线文档管理工具的出现大大提高了工作效率和协…

性能调优

性能调优 应用程序在运行过程中经常会出现性能问题&#xff0c;比较常见的性能问题现象是&#xff1a; 通过top命令查看CPU占用率高&#xff0c;接近100甚至多核CPU下超过100都是有可能的。请求单个服务处理时间特别长&#xff0c;多服务使用skywalking等监控系统来判断是哪一…

电子束光刻过程中的场拼接精度

以下内容如有错误&#xff0c;请不吝指教&#xff0c;感谢&#xff01; 1、EBL为什么会出现场拼接误差&#xff0c;如何解决&#xff1f; ChatGPT 说&#xff1a; 在电子束光刻&#xff08;EBL&#xff09;过程中&#xff0c;SOI&#xff08;硅绝缘体&#xff09;芯片上出现*…