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
标签
93
分类
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
标签
Frida Hook 溢出类型漏洞 Frida反调试 Android CTF 微信小程序逆向 分组密码 脱壳 X86描述符表 重打包 堆 访问java类中的属性 学习笔记 windows木马 爬虫 AES X86描述符 软件破解 注册机 socket抓包 框架层Hook HASH 加壳和运行时的机制 加密解密 FART脱壳 NDK性能 加解密算法分析 x86平坦模型 Android源码分析 RC4 X86存储器及其保护 frida Hook 算法分析 脱壳组件 x86中断和异常 环境配置 -Cobalt Strike DES x86协同式任务切换 处理各种函数返回值 office漏洞
归档
  • 六月 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
搜索
数据加载中