本文博客地址: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. Omega System Trading and Development Club内部分享策略Easylanguage源码 (第二期)

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 我们曾经在前文(链接),为大家分享我们精心整理的私货:"System Trading and ...

  2. mysql基本指令2

    pymysql:  - 连接.关闭(游标)  - execute()   -- SQL注入    sss' or 1=1 --   - 增删改: conn.commit()  - fetchone f ...

  3. MongoDB -> kafka 高性能实时同步(sync 采集)mongodb数据到kafka解决方案

    写这篇博客的目的 让更多的人了解 阿里开源的MongoShake可以很好满足mongodb到kafka高性能高可用实时同步需求(项目地址:https://github.com/alibaba/Mong ...

  4. 【python+selenium的web自动化】- 控制浏览器的常用操作

    如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html 前言 ​ 本文主要介绍se ...

  5. webpack4.x 从零开始配置vue 项目(一)基础搭建项目

    序 现在依旧记得第一次看到webpack3.x 版本配置时候的状态  刚开始看到这些真的是一脸懵.希望这篇文章能帮到刚开始入门的同学. webpack 是什么? webpack是一个模块化打包工具,w ...

  6. Codeforces Round #546 C. Nastya Is Transposing Matrices

    题面: 传送门 题目描述: 给出两个n x m的矩阵A,B.矩阵A可以把正方子矩阵进行"转置操作",问:可不可以对矩阵A进行多次这样的操作,使矩阵A变为矩阵B?   题目分析: 这 ...

  7. Ingress-nginx工作原理和实践

    本文记录/分享 目前项目的 K8s 部署结构和请求追踪改造方案 这个图算是一个通用的前后端分离的 k8s 部署结构: Nginx Ingress 负责暴露服务(nginx前端静态资源服务), 根据十二 ...

  8. sqli-labs系列——第四关

    less4 第四关的sql语句是这样的: select * from user where id=("$id"); ?id=1")–+回显正常 order by 4报错, ...

  9. Excel模板导出之动态导出

    说明 目前Magicodes.IE已支持Excel模板导出时使用JObject.Dictionary和ExpandoObject来进行动态导出,具体使用请看本篇教程. 本功能的想法.部分实现初步源于a ...

  10. $@ 与 $* 差在哪?-- Shell十三问<第九问>

    $@ 与 $* 差在哪?-- Shell十三问<第九问> 要说 $@ 与 $* 之前,需得先从 shell script 的 positional parameter 谈起.我们都已经知道 ...