本文博客地址: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. Redis工具收费后新的开源已出现

    作者:三十三重天 博客: zhouhuibo.club 引言 Redis工具哪家强,中国山东找蓝翔.哎呀,串台了. 众所周知,开源的最终还是收费. Reids Desktop 秉承了这一理念,苦逼的程 ...

  2. 目标检测入门论文YOLOV1精读以及pytorch源码复现(yolov1)

    结果展示 其中绿线是我绘制的图像划分网格. 这里的loss是我训练的 0.77 ,由于损失函数是我自己写的,所以可能跟大家的不太一样,这个不重要,重要的是学习思路. 重点提示 yolov1是一个目标检 ...

  3. MongoDB学习--环境搭建记录

    Mongo安装教程,参考英文官网 基本命令, 索引的引用,索引基于地理位置的数据, win10 64位 系统中安装虚拟机 win10 系统中安装虚拟机VMwareWorkstation11 并安装 L ...

  4. 2019 GDUT Rating Contest III : Problem A. Out of Sorts

    题面: 传送门 A. Out of Sorts Input file: standard input Output file: standard output Time limit: 1 second M ...

  5. 一些比较好的国外IT网站

    1.在线编程练习: LintCode --在线刷题网站,阶梯式训练,可帮助你更快速深入地了解各类面试题型,提供专业导师写的最优代码作为参考 (Lintcode 标准答案查询--lintcode 的参考 ...

  6. IDEA如何像ecplise一样添加jar包?

    以前使用ecplise开发代码,现在换成IDEA,有很多操作都不习惯,比如添加jar包.网上可以找到IDEA好几种添加jar包的方法,这里主要介绍在用IDEA开发时如何像ecplise一样添加jar包 ...

  7. Vue中去除文本框回车默认事件

    使用v-on:keydown.enter.prevent即可 <input type="password" class="form-control" id ...

  8. Hadoop企业开发场景案例,虚拟机服务器调优

    Hadoop企业开发场景案例 1 案例需求 ​ (1)需求:从1G数据中,统计每个单词出现次数.服务器3台,每台配置4G内存,4核CPU,4线程. ​ (2)需求分析: ​ 1G/128m = 8个M ...

  9. WERTYU_键盘错位(JAVA语言)

    package 第三章; import java.util.Scanner; /*  *  把手放在键盘上时,稍不注意就会往右错一位.这样,输入Q会变成输入W,输入J会变成输入K等.        输 ...

  10. CSS 文字装饰 text-decoration & text-emphasis

    在 CSS 中,文字算是我们天天会打交道的一大类了,有了文字,则必不可少一些文字装饰. 本文将讲讲两个比较新的文字装饰的概念 text-decoration 与 text-emphasis,在最后,还 ...