吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4862|回复: 19
收起左侧

[Android 原创] IDA动态调试动态注册native函数流程

  [复制链接]
怕上火喝王老吉 发表于 2020-3-7 16:28
本帖最后由 怕上火喝王老吉 于 2020-3-7 16:31 编辑

IDA动态调试动态注册native函数流程1.编写目的
记录IDA动态调试步骤
2使用工具
逆向工具: IDA 7.0 , Jadx

运行环境:Nexus 5 (Android 4.4)
3.原字符串信息
4.实现流程4.1 使用adb命令定位字符串位置
     1.手机打开字符串所在界面
  2.手机连接电脑
  3.在cmd中输入”adb shell dumpsys activity top”查看当前顶层界面所在app的工程位置

结果:
目标所在位置 : ”com.glj.dynamicregistration/.MainActivity”

4.2 使用JadxAPP进行逆向分析
  Jadx工具分析完后打开包名”com.glj.dynamicregistration”下的”MainActivity”

4.3 定位字符串显示位置
1.在onCreate中只有一个TextView从getText()函数中获取字符串,再看getText()函数是经过native修饰的.那么可以肯定这是一个jni函数.再看Activity中确实加载了一个”hellojni”的so库,那么我们基本上定义这是从so库中获取的字符内容.
4.4 获取so
     appapk格式改为zip压缩包格式后打开,lib目录下进行扣取
      
4.4 IDA加载so库静态分析
(1)将so文件直接拖拽进入IDA加载后点击Exports窗口是否存在java开头的函数,看下图,发现并没有.那么下一步只能去分析JNI_OnLoad函数了.

4.5 静态分析JNI_OnLoad
(1) JNI_OnLoad函数的形参识别为”JavaVM*”类型
(2) 13行中可以看到sub_F70函数,那么我们继续跟进去.
(3) sub_F70中可以看见直接返回了sub_FA4函数的返回值.那么我们继续跟进去看.

(4)sub_FA4函数终于看到了我们的RegisterNatives函数了,那么可以继续跟进去查看一番
(5)很抱歉,不能继续再跟了,那么将sub_FA4函数的代码同步到汇编里面.

4.5动态JNI_OnLoad函数4.5.1 启动android-server
4.5.2 端口转发

4.5.3 使用am命令启动app
注:命令格式为:am start -D -n 包名/.入口

使用Android Device Monitor工具查看当前APP的端口

4.5.4 打开IDA工具附加进程
选择”Debugger”->”Attach”->”Remote ARMLinux/Android debugger”进行打开附加窗口,并点击”Debug options”勾选三项



在附加进程窗口搜索关键字并双击调试的进行加载.

进程附加完毕
4.5.5 定位JNI_OnLoad函数
(1)此时继续勾选三项”Debugger”->”Debugger options”

(2)   使用jdb命令开始调试

(3)   在IDA中按F9直至”libhellojni.so”加载为止.通过IDA的Output window窗口可以查看


(4)   此时在IDA的Debugger中打开Module list.并在其中使用Ctrl+F搜索hellojni.待结果处双击进入.进入后继续找到JNI_OnLoad函数继续双击进入.具体打开方式”Debugger”->”Debugger windows”->”Module list”



4.5.6调试JNI_OnLoad函数
(1)JNI_OnLoad函数中下断点后一路F9,直至进入到断点为止.


4.5.7根据基址+偏移的方式算出RegisterNatives的位置.
基址:加载so库的初始地址.的当前地址:0x754BF000

偏移地址:静态分析时RegisterNatives所在的位置:0xFEA

绝对地址 = (754BF000+FEA)=0x754BFFEA

在IDA中使用G键进行跳转地址到:0x754BFFEA后下断点.并F9跳转到该位置.





4.5.8 sub_754BFFEA函数进行单步调试
通过JNI的知识可以推出R2存放的就是Native方法列表,那么进入R2寄存器查看里面的数据进行验证一下.


方法表对应的是java方法名,签名数据,C函数代码具体实现位置这三步.那么继续验证754C19D8, 754C19E0754BFEA9地址中存放的值









其中看到jni_getText函数是不是一脸懵逼其实这里只需要C或者P一下即可还原为汇编指令代码.




那么我们进入R1寄存器中查看数据进行验证一下吧.



5总结
要分析一个APP里面的native方法最有效的方法就是先静态分析一波,找到相关信息.然后在动态调试时使用基址加偏移的方式去定位函数.这样会很有效率,其次就是对JNI需要一定的了解,因为动态注册的JNI函数都是在JNI_OnLoad中进行加载的,所以在静态分析是定位到RegisterNatives函数,然后需要关注的是R0=JNIEnv* ,  R1=obj, R2=注册方法列表, R3=方法个数.其中方法表里的格式为Java方法名,签名信息,C函数代码实现地址.经过这一波分析,可以清楚地在JNI_OnLoad中找到相应的C函数体有一定的认知了.
工具链接:https://pan.baidu.com/s/1Wxa-jRXx72AgUrU6icvUQA
提取码:o3uh

免费评分

参与人数 10威望 +1 吾爱币 +29 热心值 +9 收起 理由
奇奇小霸王龙 + 1 + 1 谢谢@Thanks!
qtfreet00 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
erh + 1 + 1 谢谢@Thanks!
z5487693 + 1 + 1 谢谢@Thanks!
tlmgjw + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
jFae + 1 + 1 用心讨论,共获提升!
小哥9527 + 1 我很赞同!
笙若 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
夜步城 + 1 + 1 谢谢@Thanks!
eachann + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

erh 发表于 2020-3-9 18:23

确实没有失效.
应该是我没有下载那个文本文件,直接从网页上复制网盘地址的事.
谢谢!
xiaoqu525 发表于 2020-3-7 17:02
此用户无法显示 发表于 2020-3-7 17:15
Rolanju 发表于 2020-3-7 17:53
支持一下
wenwlg 发表于 2020-3-7 18:27
好复杂。。。。
DG5200 发表于 2020-3-7 18:32
谢谢大佬分享,学习了
雨落惊鸿, 发表于 2020-3-7 19:12
厉害厉害
sunbester 发表于 2020-3-7 19:22
网盘里没有android例子啊
xt2000 发表于 2020-3-7 19:28
支持一下
夜步城 发表于 2020-3-7 21:03
来学习一下,感谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 22:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表