前言

使用开源工具出现问题而且很难在网上查找到解决方案的时候,最好的解决方法就是研究它的源码,因为那样能为我们提供更多的信息。

搭建调试环境

首先我们在github上拉取smali/baksmali的源码

可以看出该项目采用了grade自动化构建工具来编译源码的,因此我们可以在android studio中导入该项目,如下图所示:

图1

图2

图3

然后开始编译baksmali,如下图,双击fatjar即可,gradle会自动寻找缺失的模块下载并编译:

图4

生成的baksmali在如下目录下面:

图5

然后新建运行/调试配置,如下图:

图6

上图中的Program arguments中,-a选项代表api level,可以通过如下属性获得:

图7

-d选项中的framework是从手机/system/framework拉取下来的框架层,-x选项为要反编译的odex。

调试查找错误原因

图8

报错如下:

Error occurred while disassembling classLandroid.support.v4.util.TimeUtils; - skipping class

java.lang.RuntimeException: Invalid methodindex: 32

atorg.jf.dexlib2.analysis.InlineMethodResolver$InlineMethodResolver_version36.resolveExecuteInline(InlineMethodResolver.java:175)

atorg.jf.dexlib2.analysis.MethodAnalyzer.analyzeExecuteInline(MethodAnalyzer.java:1512)

atorg.jf.dexlib2.analysis.MethodAnalyzer.analyzeInstruction(MethodAnalyzer.java:982)

atorg.jf.dexlib2.analysis.MethodAnalyzer.analyze(MethodAnalyzer.java:205)

atorg.jf.dexlib2.analysis.MethodAnalyzer.(MethodAnalyzer.java:140)

atorg.jf.baksmali.Adaptors.MethodDefinition.addAnalyzedInstructionMethodItems(MethodDefinition.java:463)

atorg.jf.baksmali.Adaptors.MethodDefinition.getMethodItems(MethodDefinition.java:371)

atorg.jf.baksmali.Adaptors.MethodDefinition.writeTo(MethodDefinition.java:238)

atorg.jf.baksmali.Adaptors.ClassDefinition.writeDirectMethods(ClassDefinition.java:282)

atorg.jf.baksmali.Adaptors.ClassDefinition.writeTo(ClassDefinition.java:112)

atorg.jf.baksmali.baksmali.disassembleClass(baksmali.java:225)

atorg.jf.baksmali.baksmali.access$000(baksmali.java:55)

atorg.jf.baksmali.baksmali$1.call(baksmali.java:149)

atorg.jf.baksmali.baksmali$1.call(baksmali.java:147)

atjava.util.concurrent.FutureTask.run(FutureTask.java:266)

atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

atjava.lang.Thread.run(Thread.java:745)

我们直接锁定出错的地方,在上面出错信息标红色的地方,并且在抛出异常处下断点,我们可以判断出错原因是因为反编译smali指令execute-line时传入了一个未知的Dalvik虚拟机的内部java方法索引inlineIndex=32:

而出错地方所在的java类为InlineMethodResolver,从名字可以看出来该类是用于解析google原生dalvik虚拟机内部java方法的类,我们顺着代码往前面找,

通过这两处代码,可以知道,通过传入命令行参数T选项,我们就可以指定定制的dalvik内部java方法而不采用原生android虚拟机的内部java方法。

接下来的问题就是CustomInlineMethodResolver如何解析T选项传进来的参数以及如何dump出dalvik内部方法。

我们可以通过dvmGetInlineOpsTable这个libdvm.so的导出函数dump出内部方法:

很幸运,smali作者已经提供了dump内部方法的工具deodexerant,只是该哥们没有在网上提供任何关于该工具的正式说明而且网上没有第三方文档,而且这个T选项还是隐藏的。导致很难搜索到相关的信息。绕了一大圈,有木有。(PS:当然你也可以自己写一个,工具已经编译好放文档同目录下面了)

反编译odex

至此,我们按照如下步骤来反编译odex:

首先,push deodexerant到手机上并运行生成inline.txt

然后,我们把inline.txt作为-T选项的参数传递进去:

完美反编译。

java逆向框架,Android逆向之逆向框架层相关推荐

  1. Android逆向 学习Android安全和逆向开发的路线总结,啃下这些Framework技术笔记

    此篇整理了最完整的–Android逆向学习线路知识体系.希望给迷糊的入门者指出一个明确的方向. 真心建议:先正向开发几年再搞逆向吧--正向都不会破解的是啥?不看代码只会脱壳?只会xposed ?远远不 ...

  2. Android逆向 学习Android安全和逆向开发的路线总结,android开发平台的发展

    学习Android逆向之前,必备条件.[必备,出去面试正经公司的安全岗位都会问的基础问题] 从事3-5年真实的Android开发工作,熟练使用C/C++,Java,kotlin,dart等Androi ...

  3. android 指纹框架,Android标准化指纹识别框架(只基于api23官方标准)

    [实例简介] [实例截图] [核心代码] package com.jianyuyouhun.fingerprintscanhelper; import android.support.v7.app.A ...

  4. Android的 API 框架,Android 声明式 UI 框架 Litho 初探 —— Sections API

    在最开始入门介绍中,我们曾经用SingleComponentSection完成了一个简单的列表,当时的做法是使用 for 构造出了多个子Component.其实在 Litho 中提供了一个性能更好的方 ...

  5. Android 系统(75)---Android常用的网路框架

    Android常用的网路框架 Android常用的网路框架:  大多数应用程序基本都需要连接网络,发送一些数据给服务端,或者从服务端获取一些数据.通常在 Android 中进行网络连接一般使用 Sco ...

  6. Android驱动之MTP框架与流程

    概要 本文的目的是介绍Android系统中MTP的一些相关知识.主要的内容包括: 第1部分 MTP简介             对Mtp协议进行简单的介绍. 第2部分 MTP框架           ...

  7. 安卓逆向_24( 一 ) --- Hook 框架 frida( Hook Java层 和 so层) )

    From:Hook 神器家族的 Frida 工具使用详解:https://blog.csdn.net/FlyPigYe/article/details/90258758 详解 Hook 框架 frid ...

  8. RPC 技术及其框架 Sekiro 在爬虫逆向中的应用,加密数据一把梭

    文章目录 什么是 RPC JSRPC Sekiro 优缺点 什么是 RPC RPC,英文 RangPaCong,中文让爬虫,旨在为爬虫开路,秒杀一切,让爬虫畅通无阻! 开个玩笑,实际上 RPC 为远程 ...

  9. 老码识途:从机器码到框架的系统观逆向修炼之路 pdf电子书

    重要提示尊敬的用户您好,由于老码识途:从机器码到框架的系统观逆向修炼之路pdf书受百度网盘影响无法做公共分享,只能私密分享,有不到之处请多多谅解! 百度网盘链接: http://pan.baidu.c ...

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

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

最新文章

  1. 深度剖析数据在内存中的存储2——浮点数数在内存中的存储
  2. Git提交时提示‘The file will have its original line endings in your working directory’
  3. 如何生成符合高斯分布的数据集
  4. python中的装饰器decorator
  5. 小米刷第三方recovery_小米平板4/Plus LTE版本开启电话功能
  6. F - 数据结构实验之链表四:有序链表的归并
  7. mqdf matlab,mexopenCV的配置学习过程
  8. JAVA程序员代表大众车,C++程序员代表捷豹,看看各类程序员们代表着什么车
  9. Chrome 45 减少了内存占用
  10. Kubernetes 弃用 Docker刷爆了网络,我们公司也慌了!
  11. matlab 蔡旭晖,matlab基础与应用教程
  12. PAT乙级练习题1028 人口普查
  13. 6PSS并联结构的运动学正逆解推导
  14. lsb_slam Tracking线程 SE3Tracking 欧式变换矩阵跟踪参考帧 加权高斯牛顿优化算法WLM 最小二乘优化 归一化方差的光度误差函数 偏导数雅克比矩阵J 线性方程组LDLT求解
  15. 大数据处理中心什么意思_什么是数据处理中心或数据中心
  16. 电动汽车巨作|新能源汽车简史:电动汽车沉浮录
  17. scylladb源码安装过程
  18. TCP滑动窗口原理终于清楚了!
  19. 联想笔记本怎么进入pe系统_图解联想G40-30(N2840)笔记本是怎么进入pe设置U盘启动的...
  20. 统计多个渠道App下载量效果

热门文章

  1. This is the default error page for nginx that is distributed with EPEL.
  2. 一个脚本就能明白Shell 脚本中的位置参数的含义
  3. row_number() over()排序功能说明
  4. (三十一)web 开发基础项目
  5. jsp_el内置对象pageContext和Cookie
  6. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)
  7. 【Windows】XShell中使用小键盘和ALT键(作Meta键),使BackSpace正常
  8. 观察者模式(Head First设计模式学习2)
  9. ubuntu下 ls: error initializing month strings
  10. 巧用负载均衡 解决数据中心三大困惑