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

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

前言

众所周知,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.kler.cn/news/312797.html

相关文章:

  • Linux C# DAY3
  • 道路裂缝,坑洼,病害数据集-包括无人机视角,摩托车视角,车辆视角覆盖道路
  • 超级Prompt!
  • linux网络编程4
  • 定义可引用的 CI/CD 配置文件中的输入参数
  • 【笔记】自动驾驶预测与决策规划_Part3_路径与轨迹规划
  • 中国IT产业新挑战与机遇共存
  • 【使用Hey对vllm接口压测】模型并发能力
  • ATE自动化测试系统集成:软件与硬件的技术结合
  • 迭代器和生成器的学习笔记
  • JVM 运行时数据区详解(下)
  • Windows通过网线传文件
  • Spring Boot整合MyBatis Plus详解
  • 二级C语言2023-9易错题
  • 反游戏学(Reludology):概念、历史、现状与展望?(豆包AI版)
  • mac 怎么查看CPU核数
  • 通过UV快速计算品牌独立站网络流量
  • 【算法】BFS 系列之 多源 BFS
  • Unity之FPS
  • 谷粒商城のElasticsearch
  • 优先级队列(堆)
  • 行业分析---自动驾驶行业的发展
  • MySQL定长窗口SQL
  • Spring为什么要用三级缓存解决循环依赖?
  • 微服务之服务注册与发现:Etcd、Zookeeper、Consul 与 Nacos 比较
  • libmodbus:写一个modbusTCP服务
  • 求Huffman树及其matlab程序详解
  • RabbitMQ 常见使用模式详解
  • Delta Lake
  • jetcache-阿里多级缓存框架神器一定要掌握