背景
我们在做Android APP逆向分析时,有时需要分析某个Java方法对应的native方法。
分析的第一步当然找到它的位置。
native方法有两种关联方式:
- 静态(这个很容易,从函数名称(符号)上就能找到)
- 动态(通过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 +