怎样确保Java步伐分发后不被篡改?利用JNI对Java步伐进行安全校验 ...

打印 上一主题 下一主题

主题 873|帖子 873|积分 2619

前言

众所周知,Java/Kotlin编译后会编译成smali,利用Jadx这类的反编译工具或者Hook工具就能很轻松的把我们的软件安全校验给破解了。
为了防止这种环境发生,我们一般会将核心代码利用C++编写,然后利用JNI技能,利用Java调用C++,由于C++编译后就成为了机器语言,反编译难度提高了可不止一倍两倍,但同时,如果我们的安全校验只在Java层面进行检查就很轻易被去除。为此,我们可以利用C++来对Java步伐进行安全检查,在发现被修改后就直接退出,由于核心逻辑是C++写的,如果C++的代码没有被
加载那么软件的壳被破解了也就毫无用途。
初步实现

初步实现可以看我之前写的:JNI的入门教程
在so加载时进行检查

  1. JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
  2.     JNIEnv* env;
  3.     if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
  4.         return JNI_ERR;
  5.     }
  6. #ifdef _RELEASE
  7.         //
  8.     if (!xxxx.checkLicenceKey(env)) {
  9.         std::cerr << "Licence key validation failed. Terminating execution." << std::endl;
  10.         return JNI_ERR;  // 验证失败,停止执行
  11.     }
  12.     #endif
  13.     return JNI_VERSION_1_6;  // 验证通过,继续执行
  14. }
复制代码
此中的ifdef _RELEASE是一个宏,代表被包裹的代码,仅在RELEASE编译模式下才会被实行,如果你没有这个宏可以在CMake中参加
  1. # 在 Release 模式下定义 _RELEASE 宏
  2. if(CMAKE_BUILD_TYPE STREQUAL "Release")
  3.     add_definitions(-D_RELEASE)
  4. endif()
复制代码
它调用了其他C++方法进行内部检查,这块的检查可以根据你的实际环境来操作,我这里是封装了checkLicenceKey方法来检查允许证授权。
好比我是在C++中获取到步伐的文件,然后进行签名检查,判定是否与步伐正式对外发布的RELEASE签名相同,如果不相同直接在JNI_OnLoad这个方法返回错误就行了,(切记不要在RELEASE中输出任何的调试日志否则很轻易被定位破解的)
   JNI_OnLoad方法是当System.load()时会被触发的方法
  这样,当你步伐外发的时候so文件每次加载都会检查文件完备性,并且破解者也不能取消加载这个so,由于一旦取消,步伐就完全成了壳了。
这样,如果有人想要破解我们的步伐,在加载后就会碰到这个错误:
(同样也是千万别直接说明原因,那样不是给破解者找题目原因的吗,你应该返回一个毫不相干的Exception)

版权全部:XuanRan

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

九天猎人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表