一种定位JNI native方法地址的通用方法

本文介绍了一种通用的方法来快速获取动态注册的JNI native方法的地址,通过HOOK RegisterNatives接口,处理函数地址权限,并提供不同情况下的应对策略,如分析目标SO的抽取与加载、自动化分析工具的实现等。
摘要由CSDN通过智能技术生成

背景

我们在做Android APP逆向分析时,有时需要分析某个Java方法对应的native方法。
分析的第一步当然找到它的位置。

native方法有两种关联方式:

  1. 静态(这个很容易,从函数名称(符号)上就能找到)
  2. 动态(通过JNI RegisterNatives注册)
    动态大多时候也很容易去找,只是会有复杂的情况,

本文描述一种相对通用的方法来快速获取native方法的地址。

方案描述

常规的方法就是HOOK,HOOK RegisterNatives接口,然后加比对逻辑即可。但是不同的Android版本里内联HOOK并不通用,而且需要额外添加一个HOOK库在实现里。这里用另一种HOOK表地址的方式来实现对于RegisterNatives接口的HOOK。

int ChangePagePermissionsOfAddress(unsigned long addr, bool write) {
    int page_size = getpagesize();
    addr -= (unsigned long)addr % page_size;

    int prot = PROT_READ;
    if (write == true) {
        prot = PROT_READ | PROT_WRITE;// | PROT_EXEC;
    }

    if(mprotect((void*)addr, page_size, prot) == -1) {
        return -1;
    }
    __builtin___clear_cache((char *)addr, (char *)(addr + 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值