本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78244766

在前面的博客《在Android so文件的.init、.init_array上和JNI_OnLoad处下断点》中,已经分享了Dalvik虚拟机模式下如何在Android
so库文件的.init段、.init_array段构造函数上下断点的方法,也是网上流传比较多的常规方法。尽管那些方法也能实现在Android so库文件.init段、.init_array段构造函数上下断点,但是总体来说还是感觉比较繁琐,因为需要进行Android so库文件.init段、.init_array段构造函数虚拟内存调用地址(VA)的计算。有的时候,我是真不想使用这种方法,像.init_array段构造函数多还需要每一个进行计算,懒得算。最近一段时间在学习Android
so加固相关方面的知识,发现只要结合Android so库文件.init段、.init_array段构造函数源码调用的特征,就能实现在动态调试Android so库文件时快速在.init段、.init_array段构造函数上下断点。

下面就以 Android 4.4.4 r1 的源码为例来讲解Dalvik模式下在Android so库文件.init段、.init_array段构造函数上下断点的方法。

1. Dalvik虚拟机模式下,Android so库文件的加载过程中会调用dvmLoadNativeCode函数,并且dvmLoadNativeCode函数是libdvm.so库文件中的导出函数,只要在dvmLoadNativeCode函数上下断点就可以实现对Android so库文件.init段、.init_array段构造函数和JNI_Onload函数进行拦截。

2. 结合Android 4.4.4 r1源码中dvmLoadNativeCode函数代码实现的特点如下图所示,找到dlopen函数的被调用位置,下图中标识的4个位置都是进行下关键断点的时候,查找和定位的标记。

3. 3次F7跟进来到调用导出函数dlopen开头的位置,结合dlopen函数实现的特点,很顺利的 定位到 do_dlopen函数被调用的位置 如下图所示,然后在do_dlopen函数的位置下断点:

4. F7跟进do_dlopen函数,发现根据do_dlopen函数的汇编代码比较难定位Android so库文件中.init段、.init_array段构造函数的调用位置si->CallConstructors  ,索性对do_dlopen函数的汇编代码进行F5反编译处理如下图所示,很显然根据do_dlopen函数源码的调用特征能够比较快的找到si->CallConstructors的调用位置下断点。

5. F7跟进si->CallConstructors的调用之后,根据CallConstructors函数中代码调用的特征以及比较明显的特征字符串,能够比较快的定位到
Android so库文件中.init段、.init_array段构造函数被调用的具体位置下断点,如下图所示。

6. F7跟进来到.init段构造函数被调用的CallFunciton函数实现中,根据.init段构造函数被调用的CallFunciton函数的汇编代码可以找到.init段构造函数最终被调用的位置下断点,当然直接对CallFunciton函数的汇编代码进行F5的反汇编,非常容易就能定位到CallFunciton函数中.init段构造函数最终被调用的位置下断点,如下图所示。很显然,Android
so库文件中.init_array段构造函数CallArray的实现最终调用的.init段构造函数被调用所在的CallFunciton函数,因此在CallFunciton函数中.init段构造函数最终被调用的位置下断点就可以实现在Android
so库文件.init段、.init_array段构造函数上进行拦截,第1次调用到.init段构造函数最终被调用的位置是.int段构造函数的,之后到达这个断点位置都是.init_array段构造函数的调用。

根据.init段构造函数被调用的CallFunciton函数的汇编代码可以找到.init段构造函数最终被调用的位置下断点。

7. F7单步跟进来到Android so库文件中.init_array段构造函数CallArray中,根据.init_array段构造函数CallArray中代码的调用特点以及比较明显的字符串能够比较快的定位到.init_array段中每个构造函数最终调用的位置下断点,如下图所示。

注释:截图的图片中有的地方注释写的不对但是不影响,在关键函数的调用位置下断点的主要操作依据就是根据Android系统源码的实现来进行查找和定位关键函数的调用位置进行下断点。尽管每个Android系统版本代码的具体实现稍有不同但是没关系,对照着Android具体版本源码的实现来下断点,这个过程只需要一次就能比较熟悉的找到下断点的函数位置,既能熟悉Android的源码又能方便自己之后快速在需要的函数上下断点。

很显然,Art虚拟机模式下也可以使用这种方法在Android so库文件.init段、.init_array段构造函数上下断点。

Android 4.4.4 r1源码文件参考路径:

http://androidxref.com/4.4.4_r1/xref/dalvik/vm/Native.cpp#318

http://androidxref.com/4.4.4_r1/xref/bionic/linker/dlfcn.cpp#63

http://androidxref.com/4.4.4_r1/xref/bionic/linker/linker.cpp#82 3

Dalvik模式下在Android so库文件.init段、.init_array段构造函数上下断点的更多相关文章

  1. Dalvik模式下基于Android运行时类加载的函数dexFindClass脱壳

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78003184 前段时间在看雪论坛发现了<发现一个安卓万能脱壳方法>这篇 ...

  2. Android平台dalvik模式下java Hook框架ddi的分析(2)--dex文件的注入和调用

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/77942585 前面的博客<Android平台dalvik模式下java Ho ...

  3. Android平台dalvik模式下java Hook框架ddi的分析(1)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/75710411 一.前 言 在前面的博客中已经学习了作者crmulliner编写的, ...

  4. Dalvik模式下System.loadLibrary函数的执行流程分析

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78212010 Android逆向分析的过程中免不了碰到Android so被加固的 ...

  5. 基于dalvik模式下的Xposed Hook开发的某加固脱壳工具

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/77966109 这段时间好好的学习了一下Android加固相关的知识和流程也大致把A ...

  6. ffmpeg学习笔记-Linux下编译Android动态库

    Android平台要使用ffmpeg就需要编译生成动态库,这里采用Ubuntu编译Android动态库 文件准备 要编译生成Android需要以下文件 NDK ffmpeg源代码 NDK下载 NDK可 ...

  7. Android so库文件的区节section修复代码分析

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78818917 一.Android so库文件的节表secion修复方案整理 1.简 ...

  8. 测试Oracle 11gr2 RAC 非归档模式下,offline drop数据文件后的数据库的停止与启动测试全过程

    测试Oracle 11gr2 RAC 非归档模式下,offline drop数据文件后的数据库的停止与启动测试全过程 最近系统出现问题,由于数据库产生的日志量太大无法开启归档模式,导致offline的 ...

  9. linux下编译自己的库文件实践

    有了我传的那个资料,这个就没什么用了,那个太经典了,这个就是记录我自己的实践.:-) linux下文件的类型是不依赖于其后缀名的,但一般来讲:.o,是目标文件,相当于windows中的.obj文件.s ...

随机推荐

  1. 《深入浅出WPF》-刘铁猛学习笔记——XAML

    XAML是什么? XAML是微软公司创造的一种开发语言,XAML的全称是 Extensible Application Markup Language,即可拓展应用程序标记语言. 它由XML拓展而来, ...

  2. 医学图像 | DualGAN与儿科超声心动图分割 | MICCAI

    文章转自微信公众号:「机器学习炼丹术」 作者:炼丹兄(已授权) 联系方式:微信cyx645016617(欢迎交流共同进步) 论文名称:"Dual Network Generative Adv ...

  3. HDOJ-1074(动态规划+状态压缩)

    Doing Homework HDOJ-1074 1.本题主要用的是状态压缩的方法,将每种状态用二进制压缩表示 2.状态转移方程:dp[i|(1<<j)]=min(dp[i|(1<& ...

  4. spring-cloud-alibaba之Nacos

    在微服务构架中,集群服务间的需要调用时就需要知道各个服务的IP和提供服务的端口等信息,如果每个部署一个服务就配置一次,那么必然时非常麻烦的,因此我们需要一个能够统一管理的东西来解决这个问题,由此诞生了 ...

  5. FreeBSD 镜像站问题 @2021

    主要问题在于官方无论如何也不开放 rsync 且不接受镜像站的官方二级镜像申请. 多次联系均无二次联系,如邮件列表,大概五次,其中三次回应,两次无回应.其主要回复内容为"深表歉意,但台湾地区 ...

  6. Java数组:初识数组

    数组:数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问他们 数组基本特点:其长度是确定的 ...

  7. 自动化测试工具(基于WordCount作业)

    本自动化测试的程序用于自动化测试WordCount作业,采用Java开发(基于jdk1.8+),基于Maven来管理项目. 支持的语言和开发进度 语言 进度 Java 已测试并投入运行 C++ 开发完 ...

  8. java实现简易的图书馆管理系统

    比较适合新手练手的一个简易项目 直接上源码 Book package code; /** * @author ztr * @version 创建时间:2021年3月4日 下午8:21:40 * 类说明 ...

  9. P1028_数的计算(JAVA语言)

    题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(0n≤1000),然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个自然数,但该自然数不能 ...

  10. ARFoundation - 实现物体旋转, 平移,缩放

    ARFoundation - 实现物体旋转, 平移,缩放 本文目的是为了确定在移动端怎样通过单指滑动实现物体的旋转,双指实现平移和缩放. 前提知识: ARFoundation - touch poin ...