前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何快速定位native方法在对应so中的位置前言原理

如何快速定位native方法在对应so中的位置前言原理

作者头像
用户2930595
发布2018-08-23 09:52:55
2.3K0
发布2018-08-23 09:52:55
举报
文章被收录于专栏:difcareer的技术笔记

前言

在逆向的时候,有些应用有一大堆的so,而且都是提前加载好,有的so甚至做了处理,很难看出函数名。本文讲述的方法可以快速定位:

  • native方法的实现在哪个so中
  • 在so中的哪个位置

原理

我们知道,在使用native方法之前,需要先load对应的so。 在load so的时候,其实就是dlopen该so。 不管你是否主动注册了方法映射,系统都是通过dlsys来获取对应的实现函数,并将其和java层的method关联起来,具体参见Dalvik虚拟机原理及Xposed hook原理

在调用native方法时,通过桥接的方式来调用:

代码语言:javascript
复制
DalvikBridgeFunc bridge = gDvmJni.useCheckJni ? dvmCheckCallJNIMethod : dvmCallJNIMethod;

其实就是dvmCallJNIMethod

ok,在这个函数中,我们可以将方法名和对应的底层函数地址打印出来即可:

代码语言:javascript
复制
ALOGI("invoke native method %s, addr:%p", method->name, method->insns);

日志如下:

就这么简单。

但是还有几个地方得说一下:

  • 这个addr是运行时候的虚拟地址,如何知道是哪个so呢?

这就需要使用ida调试一下,当断点断下来时,按G跳转到这个地址,你将会在左侧看出是加载了哪个so,将这个地址减去这个so的加载基地址,就可以获取到函数在so中的地址了。

还有另外一种获取基址且不需要调试的方法,直接查看/proc/$pid/maps映射

  • 如何添加打印的代码?

两种选择:编译源码和native hook。

编译源码见ubuntu14.04编译Android4.4源码

native hook见Android Inline Hook 详解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.12.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 原理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档