本文博客地址: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. 链表算法题之中等级别,debug调试更简单

    文章简述 大家好,本篇是个人的第 5 篇文章 从本篇文章开始,分享关于链表的题目为中等难度,本次共有 3 道题目. 一,两数相加 1.1 题目分析 题中写到数字是按照逆序的方式存储,从进位的角度看,两 ...

  2. Pytorch1.7报错 Output 0 of UnbindBackward is a view and is being modified inplace

    utils里内容改成 if scale_each is True: for idx, _ in enumerate([jj for jj in tensor]): t = tensor[idx] # ...

  3. 【Arduino学习笔记06】上拉电阻和下拉电阻

    为什么要用上拉电阻和下拉电阻?--避免输入引脚处于"悬空"状态 下图是一个没有使用上拉电阻/下拉电阻的电路图: 在按键没有按下时,要读取的输入引脚没有连接到任何东西,这种状态就称为 ...

  4. 漏洞复现-Flask-SSTI服务端模板注入

      0x00 实验环境 攻击机:Win 10 0x01 影响版本 Python利用的一些静态框架 0x02 漏洞复现 (1)实验环境:docker运行的vulhub漏洞环境 首先,可直接访问到页面的显 ...

  5. 代理模式详解:静态代理、JDK动态代理与Cglib动态代理

    代理模式简介分类 概念 ​ 代理,是为了在不修改目标对象的基础上,增强目标方法的业务逻辑. ​ 客户类需要执行的是目标对象的目标方法,但是真正执行的是代理对象的代理方法,客户类对目标对象的访问是通过代 ...

  6. android分析之Thread类

    线程与线程类要区分开来. 抽象来说,线程是CPU调度的最小单位,但是线程总要执行代码,这个代码就在线程类里说明(即Thread类).无论如何,Thread只是一个类,但其功能就是"启动一个线 ...

  7. 攻防世界 reverse android-app-100

     android-app-100  suctf-2016 jeb启动,找到点击事件: 验证流程: 输入作为参数 --> processObjectArrayFromNative 得到一返回值(r ...

  8. ApiTesting全链路接口自动化测试框架 - 实战应用

    场景一.添加公共配置 我们在做自动化开始的时候,一般有很多公共的环境配置,比如host.token.user等等,如果这些放在用例中,一旦修改,将非常的不便.麻烦(尤其切换环境). 所以这里我们提供了 ...

  9. 【linux】制作deb包方法 **

    目录 前言 概念 ** 创建自己的deb包 文件源码 前言 制作deb的方式很多 使用 dpkg-deb 方式 使用 checkinstall 方式 使用 dh_make 方式 修改原有的 deb 包 ...

  10. MyBatis工程搭建&MyBatis实现Mapper配置查询

    一.MyMyBatis工程搭建 新建Maven项目:mybatis-demo 准备数据源 1 # 删除mybatis_demo数据库 2 drop database if exists mybatis ...