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

动漫网页设计作业广州优化公司哪家好

动漫网页设计作业,广州优化公司哪家好,小城市做网站,宁波网站建设优化服务公司版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 前言 NDK 编译 so 默认情况下,所有 public 函数 都会导出,通过 IDA、GHIDRA 可以看到函数名 但除了必须导出的 JNI 函数外&#xff0c…

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/

前言

NDK 编译 so 默认情况下,所有 public 函数 都会导出,通过 IDA、GHIDRA 可以看到函数名

word/media/image1.png

但除了必须导出的 JNI 函数外,其余 C/C++ 函数符号不导出其实也完全没影响,编译器/链接器内部可以调用,运行时照样可以正常执行。

必须导出的 JNI 函数

函数名是否必须导出说明
JNI_OnLoad✅ 是(总是)系统通过 dlsym() 查找,初始化用
Java_…✅ 是(如果用静态注册)Java 层方法通过名称匹配
JNI_OnUnload❌ 否(可选)卸载时调用,不导出也不会出错
JNI_OnLoad_LibName(非标准)❌ 否(特殊系统扩展)Android 未使用
JNI_GetCreatedJavaVMs、JNI_CreateJavaVM❌ 否仅在 native 启动 JVM 时使用(一般用不到)

使用 linker version script 精细控制导出

Linker Version Script 是 GNU 链接器(ld)提供的一种机制,用来控制 .so 或 .a 文件中哪些符号可以导出、哪些必须隐藏。

创建 hide.map 文件(仅导出所有 JNI_ 和 Java_ 开头的 JNI 方法)

{global:JNI_*;Java_*;local:*;
};

解释

  • global: 表示这些符号会被导出,可供外部(如 ART)通过 dlsym() 使用。

  • Java_* 会匹配所有以 Java_ 开头的方法 —— 即静态注册 JNI 方法。

  • local: *; 表示其余全部符号(如内部 C 函数、C++ mangled 符号、加密算法、字符串处理等)一律隐藏,无法通过 IDA 等工具直接查看函数名。

在你的 CMakeLists.txt 中这样写:

# 抹除符号
set_target_properties(native-lib PROPERTIES LINK_FLAGS "-Wl,--version-script=${CMAKE_SOURCE_DIR}/hide.map")

参考:https://android-docs.cn/ndk/guides/symbol-visibility

测试

重新编译运行,使用 IDA Pro 打开 so ,可以看到只导出了 JNI 相关函数

word/media/image2.png

只控制导出符号,不影响内部调用,程序运行时不会出错。

word/media/image3.png

除了增加逆向难度,同时还能减少 so 文件的体积

word/media/image4.png

动态注册 JNI 方法,JNI 方法反跟踪

Android 的 ART 虚拟机会用 dlsym() 查找你导出的 JNI 方法(如Java_com_example_native_NativeUtils_secretMethod),所以这些你不能隐藏,否则会导致运行时崩溃。

如果你用 RegisterNatives 动态注册 JNI 方法,就可以完全避免导出 Java_com_xxx 的方法名:

#include <jni.h>// 定义方法签名
static JNINativeMethod methods[] = {{"secretMethod", "()V", (void *)secretMethod},
};// JNI_OnLoad 动态注册方法
jint JNI_OnLoad(JavaVM* vm, void* reserved) {JNIEnv* env = nullptr;vm->GetEnv((void**)&env, JNI_VERSION_1_6);jclass clazz = env->FindClass("com/example/native/NativeUtils");env->RegisterNatives(clazz, methods, sizeof(methods)/sizeof(methods[0]));return JNI_VERSION_1_6;
}

函数名字可以自定义:

void secretMethod(JNIEnv *env, jobject obj) {// your native code
}

此时 .so 中不需要导出 Java_com_example_xxx 符号,IDA 也就看不到!

完整源码

开源地址:https://github.com/CYRUS-STUDIO/AndroidExample

相关文章:

  • 移植 OLLVM 到 LLVM 18,C&C++代码混淆

  • 移植 OLLVM 到 Android NDK,Android Studio 中使用 OLLVM

  • OLLVM 增加 C&C++ 字符串加密功能

http://www.dtcms.com/wzjs/346107.html

相关文章:

  • 南昌做网站公司如何在百度发视频推广
  • 南雄网站建设武汉关键词seo排名
  • 借鉴网网站魔贝课凡seo
  • 遵义网站设计公司百度关键词搜索量排行
  • 郑州做营销型网站的公司百度关键词推广一年多少钱
  • 怎么做网站 教学seo建站公司
  • wordpress如何发布青岛seo关键词排名
  • 广东快速做网站公司哪家好搜索关键词排名
  • 高校英文网站建设成都网站优化及推广
  • 手机开发者网站百度推广自己怎么做
  • 做柜子喜欢上哪些网站看微信搜一搜seo
  • asp.net网站开发视频营销模式有哪些
  • 做网站要找什么百度ai人工智能
  • 微网站开发建设中国最新军事新闻直播
  • 怎样做网站吸引人快速网站seo效果
  • 网站的积分系统怎么做合肥网站seo公司
  • 网站套餐方案360地图怎么添加商户
  • 做副业赚钱网站公众号怎么推广
  • 地方门户网站设计网络营销推广的方法有哪些
  • 织梦网站建设教程广州seo关键词
  • 松原做网站公司快速网站排名提升工具
  • 自己做企业网站服务器什么软件比百度搜索好
  • 个人定制网站html期末大作业个人网站制作
  • 优设网免费素材seo咨询岳阳
  • 中山快速建站合作四川企业seo推广
  • 网站诊断与优化的作用seo高手培训
  • 有网站模板怎么做网站百度站长seo
  • 有关做美食的网站乐搜索引擎优化的方式
  • 有哪些网站可以推广网站制作多少钱一个
  • 有什么做动图比较方便的网站徐州做网站的公司