xiaoeryu
搜索

xiaoeryu

Dalvik/ART下JNI方法的动态注册原理与追踪
发表于2023-10-21|NDK开发
在之前的JNI代码中我们都是使用的静态注册,使用extern "C"来编译,这样的代码在编译之后的so文件中仍然会保留原函数名,对APK的安全性有一定影响。 接下来我们尝试一下将静态注册的JNI函数改为动态注册,比较一下和之前有何不同。 以及对于改为动态注册的函数我们应该如何去追踪。 静态注册与动态注册JNI函数被调用前,必须要完成Java与so的绑定: 被动(静态):由Dalvik/ART虚拟机在调用前查找并完成地址的绑定 静态函数名规则:Java_包名_类名_方法名 优点:函数名简单明了 缺点:名字过长、查抓效率不高、安全性降低 主动(动态):由APP自己完成地址的绑定 静态注册 反编译静态注册的so文件 例如这个静态注册JNI代码编译后的so文件,用IDA反编译之后就能直接通过搜索函数名定义到函数位置。 动态注册 可以将原来的extern "C"给去掉,函数名无所谓可以随便写就是一个标识 在JNI_OnLoad中手动绑定 JNINativeMethod jniNativeMethod[] = { ...
NDK内存管理-引用
发表于2023-10-17|NDK开发
NDK中的内存管理:C/C++的new/malloc和delete/free以及JNI引用。 Java和C/C++内存管理的区别 三种引用的区别在JNI规范中定义了三种引用: 局部引用(LocalReference) 全局引用(Global Reference) 若全局引用(Weak Global Reference) 因生命周期限制,不能在外部定义一个全局变量接受局部引用,在其他函数使用 之前多线程的代码中使用过,例如: jobject appClassloader = env->NewGlobalRef(TestJclass); // 使用方式:用参数传递,或者定义一个全局变量接收也行 pthread_create(&thread, nullptr, threadtest, appClassloader); env->DeleteGlobalRef(appClassloader); 作用域和全局引用是相同的,但是如果内存紧张可能会被ART给释放掉 再JNI种局部引用的创建也是受局部引用表限制的 for...
JNI访问Java类函数
发表于2023-10-14|NDK开发
在之前demo的基础上添加几个方法,测试在JNI编程中怎么访问Java类中的函数 在JNI和Java中访问类属性有什么区别: 对以下这几种类型的函数进行访问 构造函数的访问是一个特例 在JNI中访问Java函数要加上函数描述符 调用构造函数extern "C" JNIEXPORT jobject JNICALL Java_com_xiaoeryu_reflectiontest_MainActivity_callInit(JNIEnv *env, jobject thiz) { // TODO: implement callInit() // public Test(String arg, int arg2) jclass TestJclass = env->FindClass("com/xiaoeryu/reflectiontest/Test"); jmethodID con_mid = env->GetMethodID(TestJclass, "<init>",...
JNI新建对象和访问Java中属性
发表于2023-10-13|NDK开发
本章主要写代码测试在JNI中使用JNIEnv提供的接口,创建Java对象以及访问Java类中的属性(静态属性、非静态属性、数组) JNI中创建Java对象 使用NewObject()和AllocObject()两种方式创建JAVA对象 extern "C" JNIEXPORT void JNICALL Java_com_xiaoeryu_reflectiontest_MainActivity_newObject(JNIEnv *env, jobject thiz) { // TODO: implement newObject() // 使用函数NewObject来创建JAVA对象 jclass TestJclass = env->FindClass("com/xiaoeryu/reflectiontest/Test"); // public Test(String arg) jmethodID con_mid = env->GetMethodID(TestJclass, "<init>",...
JavaVM与JNIEnv
发表于2023-10-12|NDK开发
上一章简单测试了一下Java的反射,这章我们来测试一下JavaVM和JNIEnv 回顾一下Java反射 在我们使用NDK访问java类中的方法的时候,流程也是差不多一样的 找到类名->jFieldID/jmethodID(等于是Java当中的GetField)->通过GetObjectField获取到Java类中的函数或值 在调用函数的时候也要注意,如果类中没有同名函数可以不用传递参数。如果存在同名函数就需要将参数一并传递 函数描述符 JavaVM和JNIEnv JavaVM结构体里面包含了5个方法 JNIEnv结构体里面包含了非常多的方法可以调用 怎么获取JavaVM和JNIEnv 第一种方法:在JNI_OnLoad中获取 globalVM = vm; __android_log_print(4, "xiaoeryu->jni", "JNI_OnLoad(JavaVM* vm, void* reserved)->%p", vm); __android_log_print(4,...
JAVA反射
发表于2023-10-10|NDK开发
写代码测试了一下JAVA反射 Java反射的相关类 Class类 拿到Class之后可以获取它的属性 Java封装 Java反射写代码测试一下Java反射中用到的一些api的使用方法 新建一个类来定义一些Field和函数 在主函数中去通过反射调用,测试一下(测试变量调用) 如果是StaticField那么它是属于类的,可以直接通过类调用 如果是PrivateField那么它是属于实例的,需要实例化之后调用 如果是Private还需要修改访问权限setAccessible(true); //...
国家认同感的构建
发表于2023-10-06|社科
...
NDK开发性能提升
发表于2023-10-06|NDK开发
初步了解以下NDK开发对性能的提升,包括dex2oat的处理、函数运行在解释模式、ART模式、JNI模式的性能差别,以及数据类型的转换。 NDK开发的优缺点 什么是ART模式dex2oat虽然提升了性能,但是对手机的存储空间、性能、耗电量提出了更高的要求(因为要把几乎所有的函数都要编译一遍),所以从Android7.0开始换为了ART的运作方式 所以java函数在Android7.0之后可能运行在三种模式下: OAT文件分析Google提供了一个[oatdump](oatdump/oatdump.cc - platform/art - Git at Google (googlesource.com))工具来反编译oat文件 新建一个native C++项目来测试对oat文件反编译,分析文件结构 在MainActivity.java中写一个简单函数编译一下,安装到手机上 这里测试项目的SDK最好使用Android5.0以下的不然编译出来的dex太多找起来麻烦 public int java_add(int num){ int k =...
Android刷机+抓包环境配置
发表于2023-10-04|Android逆向
设备:Pixel XL 镜像:Android10 抓包环境:Lsposed + fiddler 刷入镜像下载镜像并解压 将手机进入bootloader模式 开机状态可以使用命令adb reboot bootloader直接进入 关机可以直接按住电源键+音量下键进入 执行flash-all.s刷机 刷机完成 ROOT先在开发者模式打开USB调试开关 安装Magisk下载Magisk现在最新版的是26.1 adb install .\Magisk-v26.1.apk 刷入boot.img解压镜像里面的.zip包,获取boot.img 确认手机开启了A/B系统更新 adb shell getprop ro.build.ab_update adb shell getprop ro.build.system_root_image 将boot.imgpush到sd卡 打开Margisk选择安装 → 选择并修补一个文件 → 选择刚刚push的boot.img →...
NDK开发简介
发表于2023-10-03|NDK开发
记录一些NDK开发的基础问题,这里记录的方向会更偏向于逆向、安全方面的内容。 什么是NDKJNI:Java Native Interface的缩写,JAVA本地接口的意思 NDK:Native Development Kit(本地开发套件) 可以帮助开发人员快速开发、调试动态库 JNI函数JNI是一个规范 有时候需要编译后保留函数名可以加上extern ”C”,使其按C的方式进行编译 JNI参数静态函数和动态函数实现的时候第二个传参是不同的 静态成员可以直接通过类名的方式访问调用,非静态函数是不行的 通过对参数的分析,我们可以知道一个JNI函数它的参数一定是不少于两个的,从第三个参数开始才是属于函数自己的参数 调用在调用C文件中的函数的时候要显式的加上extern “C” 因为如果不加的话编译器会默认按C++的方式进行编译,在函数名称粉碎之后就链接不到了。 变量类型 在前面加上 j 测试执行成功:测试的时候注意一下系统版本 debug调试要注意设备版本跟项目SDK版本保持一致,不然会报错
FART使用场景和流程
发表于2023-10-01|Android逆向
本章主要介绍一下什么是FART、为什么要使用FART,以及如何使用FART的问题 FART是一个支持在ART(Android...
FART中的脱壳点-脱壳组件
发表于2023-09-26|Android逆向
...
1…456…10
avatar
xiaoeryu
文章
114
标签
92
分类
14
Follow Me
公告
同于道者,希言自然
最新文章
绕过某邦企业壳root、frida检测2025-06-05
某麦购票Xposed脚本(一)2025-05-28
某麦APP购票接口分析2025-05-05
微信小程序-某某牛仔城2024-09-16
编译Android13-AOSP2024-08-10
分类
  • ARM汇编1
  • Android逆向61
    • 加密解密6
  • NDK开发8
  • Win逆向9
  • X86汇编:实模式到保护模式11
  • ios逆向1
  • 加密解密2
标签
JNI函数注册原理与追踪 AOSP源码编译 windows木马 环境配置 Windows脱壳 AES Android源码分析 Android脱壳 加解密算法分析 脱壳 Android刷机 学习笔记 RSA x86协同式任务切换 Frida Hook 加壳和运行时的机制 OceanLotus 重打包 Android加壳 暴力解密 NDK简介 X86寄存器指令格式 x86中断和异常 JavaVM与JNIEnv NDK性能 处理各种参数的方法 DES 微信小程序逆向 分组密码 x86内核任务系统 App抓包 RPC 环境搭建 抢茅台 Frida反调试 Andromeda木马 X86描述符表 加密解密 -Cobalt Strike 函数抽取壳
归档
  • 六月 2025 1
  • 五月 2025 2
  • 九月 2024 1
  • 八月 2024 3
  • 七月 2024 7
  • 六月 2024 5
  • 五月 2024 1
  • 四月 2024 1
网站信息
文章数目 :
114
本站总字数 :
185.4k
本站访客数 :
本站总浏览量 :
最后更新时间 :
©2019 - 2025 By xiaoeryu
框架 Hexo 6.3.0|主题 Butterfly 5.3.5
搜索
数据加载中