python编译移植到测试机,并且移植ctypes模块。利用ctypes代替c程序,利用dalvik内部c++函数,在运行过程中手动命令操控dalvik虚拟机,并结合gdb进行调试。绕过zygote和ASM去启动进程。

由于我使用手动创建虚拟机,而不是通过zygote去启动虚拟机,zygote会通过androidruntime::startVM去加载和初始化所有运行app的环境。所以我必须自行完成这些必要的工作。

不同于jvm,dalvik必须加载两种java运行时包,java runtime以及android runtime。并且不会自动加载native库去注册上面两个runtime的native实现方法。java.*和android.*都在sdk的platform/$(api-level)/android.jar,java.*被称为core library,我们必须编译这个core库成dex,在我们手动的创建的虚拟机中加载。

    system_load(jenv, "/system/lib/libjavacore.so")
system_load(jenv, "/system/lib/libandroid.so")
system_load(jenv, "/system/lib/libandroid_runtime.so")
system_load(jenv, "/system/lib/libbinder.so") print "now start android runtime"
ar = cdll.LoadLibrary("libandroid_runtime.so")
callcxxF(ar, "android::AndroidRuntime::startReg", [jenv])

然后我们还要加载支持core库的native库。libjavacore.so这是对应java.*的native方法实现,libandroid_runtime.so这是对应android.*的native方法实现。我们手动创建的虚拟机必须手动去加载这两个库,libjavacore.so有JNI_OnLoad实现,会自动注册它的native方法。但是libandroid_runtime.so却没有JNI_OnLoad实现,我们必须使用objdump查看函数符号,找出它可能用于注册native方法的函数,并在加载它时调用这个函数去注册native方法。不然的话,你创建的虚拟机并不能使用android.*,尽管你已经加载了这些类,或者还加载了这个so,但是由于你没有注册android.*所依赖的native实现方法,所以不能使用。

之后就是去用jni初始化一些对象,这些对象都是你要调试的so库,它所依赖(或访问到)的java对象。另外就是你只想调试dex里面的某个类,而这个类所依赖(或访问到)的java对象。

通过dvm内部函数加载dex或odex,然后将类加载到虚拟机。

在运行调试过程中,可以使用python调用jni测试调试你想查询的信息,结合gdb可以操控所有线程的运行,并且利用gdb脚本,从虚拟机内部结构出发分析运行状态信息,使用断点(如 dvmCallMethodA)和断点命令日志,跟踪java层或jni调用的行为。gdb调试还可以手动构筑环境让程序在濒临信号崩溃之时得以继续运行下去。

在绕开了来自java层和c层的反调试监控后,让调试的程序运行下去,但是由于程序依赖ContextImpl,这个必须依赖于ASM去初始化的对象,因为脱离zygote和ASM,手动无法创建一个让程序满意的ContextImpl,这个对象关联了太多application运行依赖的服务和信息。

下面是实例,加载libbaiduprotect_x86.so后,libbaiduprotect_x86.so的行为被gdb跟踪监测:

由于程序不是由ASM启动的Application,所以ActivityThread.currentPackageName()返回空,在c层使用这个结果进行strlen时出错,这里还好,用gdb就可以填补过去。构建一个字符串就是了,让程序继续执行。

libbaiduprotect.so依赖了android/app/ContextImpl,抛出了异常,并且在下一次Jni调用时,dalvik主动检测pending异常,发现后对程序abort。

这里必须要注意,SIGSEGV不一定是内存访问出错,在上面的情况是abort发出的信号。

逆向libbaiduprotect(三)- 移植python操作dalvik虚拟机c++函数,配合gdb控制程序运行流程的更多相关文章

  1. Python逆向(三)—— Python编译运行及反汇编

    一.前言 前期我们已经对python的运行原理以及运行过程中产生的文件结构有了了解.本节,我们将结合具体的例子来实践python运行,编译,反编译的过程,并对前些章节中可能遗漏的具体细节进行补充. 二 ...

  2. python 操作excel 的包 函数

    ###########sample 1 https://blog.csdn.net/chengxuyuanyonghu/article/details/54951399 python操作excel主要 ...

  3. Python学习笔记:open函数和with临时运行环境(文件操作)

    open函数 1.open函数: file=open(filename, encoding='utf-8'),open()函数是Python内置的用于对文件的读写操作,返回的是文件的流对象(而不是文件 ...

  4. 06 python操作MySQL和redis(进阶)

    python操作mysql.redis 阶段一.mysql事务 主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息, ...

  5. python操作Redis安装、支持存储类型、普通连接、连接池

    一.python操作redis安装和支持存储类型 安装redis模块 pip3 install redis 二.Python操作Redis之普通连接 redis-py提供两个类Redis和Strict ...

  6. Android逆向基础----Android Dalvik虚拟机

    Android Dalvik虚拟机的特点: l  体积小,占用内存空间小. l  专有DEX可执行文件. l  常量池采用32位索引值,寻址类方法名,字段名,常量更快. l  基于寄存器架构,并拥有一 ...

  7. 深入理解JAVA虚拟机原理之Dalvik虚拟机(三)

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 本文是Android虚拟机系列文章的第三篇,专门介绍Andorid系统上曾经使用 ...

  8. python 历险记(三)— python 的常用文件操作

    目录 前言 文件 什么是文件? 如何在 python 中打开文件? python 文件对象有哪些属性? 如何读文件? read() readline() 如何写文件? 如何操作文件和目录? 强大的 o ...

  9. 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求

    第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求 selenium模块 selenium模块为 ...

随机推荐

  1. javascript学习总结之Object.assign()方法详解

    最近再写ES6的文章时候发现自己对Object.assign()方法不太了解,之前也没有接触过所以就就查阅了相关的资料,为了自己以后肯能会用到以及对知识进行巩固,所以在这里记录下自己学习的点点滴滴,毕 ...

  2. 前端Vue框架-vuex状态管理详解

    新人报道!多多关照-多提宝贵意见 谢谢- vuex理解 采用集中式存储管理模式.用来管理组件的状态,并以自定义规则去观测实时监听值得变化. 状态模式管理理解 属性 理解 state 驱动应用的数据源 ...

  3. 那些惊艳的 GIS 轮子

    一.前言 GIS 涉及测绘.几何拓扑.人文社科等多方面的科学知识.在 .Net 平台下有着许多优秀的开源产品,比如:MapWindow.SharpMap.WorldWind等.而在这其中,Coordi ...

  4. LeetCode 十月份题目汇总

    开源地址:点击该链接 前言 十月份共有60道题目,全部属于 Easy 难度的,所以公众号中分享出来的并不多,只是挑了一些感觉还可以的才分享了出来,这60道题目我按照不同类别进行了分类整理,所有源码以及 ...

  5. 设计模式(四)Factory Method模式

    简单来说,用Template Method模式来构建生成实例的工厂,就是Factory Method模式.在这个模式中,父类决定实例的生成方式,但不决定所要生成的具体的类,具体的处理全部交给子类负责. ...

  6. intellij idea - Project Structure 项目结构详解(简单明了)

    IDEA Project Structure 设置 可以点击  按钮,或者使用快捷键 Ctrl + Shift + Alt + S  打开 Project Structure .如下如所示: 项目的左 ...

  7. yum安装PHP升级到7.1版本

    yum安装PHP升级到7.2版本卸载原来低版本的PHP rpm -qa |grep php|xargs rpm -e 更新yum源 //CentOS/RHEL 7.xrpm -Uvh https:// ...

  8. C# 计时周期数(Ticks)在不同数据库上的实现

    要在数据库中实现 DateTime.Ticks,先来看看 Ticks 在微软官方文档上的定义: 注解 一个计时周期表示一百纳秒,即一千万分之一秒. 毫秒内有 , 个计时周期,即 秒内有 , 万个计时周 ...

  9. Java 计算n对应的二进制位上有几个1,分别在什么位置

    Java计算n的二进制位上有几个1,分别在什么位置   public List<Integer> getBinOneCount(int n){     List<Integer> ...

  10. Web信息搜集

    文件是转载原文https://www.freebuf.com/articles/web/204883.html  如有侵权 请联系 对一个网站挖掘的深浅来说,信息收集是非常的重要的,这篇文章主要分享本 ...