文章目录
-
- 前言
- Dalvik基础 指令
-
-
-
-
- 文中42页详细介绍了V P两种命名法如下
- 文中43页详细介绍了Smali中的基本数据类型
- 而且这里介绍了三个知识点
- 文中45页 详细介绍了Dalvik指令的特点
- 关于数据指定指令
- 锁指令
- 书中47页介绍到一个比较重要的 实例操作指令
- 数组操作指令
- 跳转指令
- 关于IF比较指令
- 字段操作指令
- 文中50页使用到比较重要的方法调用指令
- 数据转化指令
- 最后文中51页介绍的数据运算指令如下
- 文中54页测试运行
- 我们来梳理一下这些工具的使用流程
-
-
-
- APK的文件结构
-
-
-
-
- 书中58页详细介绍了一个APK生成过程
- 书中59页详细介绍了APK安装的4个方式
- 文中68页介绍如何判断Dex 这个比较复杂
- 文中69页开始分析dex的具体结构
- 文中78页-这8页我们看的一脸懵逼,工欲善其事必先利其器,借助dexdump命令可以更好地帮助我们了解学习dex文件结构。
- 这边我们动手玩一波
- 在下确实忘记了偏移的是啥了(一般地址都是16进制的吧
- 当你分析起来很吃力的时候是因为你忘记了另一个工具010Editor
- 关于类型序 貌似是临时排序的
- protoIdsSize和protoIdsOff了,它们代表的是dex文件中方法原型的个数和位置偏移
- 书中78页做了详细介绍
-
-
-
- Odex文件格式
-
-
-
-
- 文中81页又一个厉害的工具来了dexopt-wrapper
- 文中115页介绍了Smali中switch的使用
- 书中117页对switch做了dex分析
- try-catch
-
-
-
- IDA Pro 的使用 127页 着实难以理解
- 第六章 – 基于Android的ARM汇编语言-老朋友了
-
-
-
-
- 书中160页讲解制作一个helloARM
-
-
-
- ARM汇编基础
-
-
-
-
- 中断模式
- 用户模式(usr)
- ARM的两种工状态
- ARM语言结构程序结构 书中166页 对于这个文档我内心是拒绝的
- 书中167 使用Android NDK的GCC编译helloWord.c
- ARM汇编程序构成 书中166页
- 处理器架构定义
- 段定义 汇编语言我们学过,就是一块连续的内存区域
- 汇编指令
- 子程序和参数传递 这个和汇编语言不大一样
- ARM处理器寻址方式
- 寄存器移位寻址
- 指令格条件码
- 跳转指令
- 存储器访问指令(内存访问指令)
- 数据处理指令
- 书中185页将的 NEON和VFP指令集 在Android_NDK中的申请
-
-
-
- 第七章 Android NDK程序逆向分析(Native Development Kit)
-
-
-
-
- 我的NDK和make.exe目录
- arm-linux-androideabi功能说明
- 书中189页介绍了makefile文件编写和windows环境编译c代码的过程
- 有必要分析一下makefile的文件
- 使用ndk_build编译
- Android.mk分析
- 书中198页研究main函数执行流程
- 原生文件格式 ARM ELF File Format
- 原生C程序逆向分析 书中200页
- IDA pro 分析
- for循环分析
- LDR r, label 和 LDR r, =label的区别:
- 书中203~217页对 for ifelse siwtch dowhile while 等操作流做了相当详细的介绍 务必亲自动手做一遍
- C++原生逆向
- 疑问那类怎么没有被描述/li>
- 书中227页 对动静STL做了介绍-没懂~
- 静态分析Android NDK程序
-
-
-
前言
这边没有目录 我们只以页码为读书标记
着实 读书是比较系统全面的学习方法,比如学习路线规划,弥补自己在哪些知识点的不足,从而针对性的学习。而不是盲目的CSDN搜索一篇,CSDN固然有全面的文章,有的部分也许只是点到为止,相信大家平时都有些CSDN的习惯,我们常常把他当做笔记来使用,以便以后翻阅,很难做到像教科书那样的全面讲解。
废话结束了。。。。入正题。
链接: https://pan.baidu.com/s/1jHWVR-At9qT3jn2zf1K4bw
提取码: veev
Dalvik基础 指令
文中42页详细介绍了V P两种命名法如下
而且这里介绍了三个知识点
- 关于八个字节的也就是J 和 D 使用的是两个连续的寄存器.
- L类型为任意类有人就是表示对象类型。
- [表示数组类型 二多为数组最大维数为255.
文中45页 详细介绍了Dalvik指令的特点
- 参数采用了destination =》Source的方式
添加后缀 32位无后缀 64位加-wide 特殊字符如-boolean -byte -class – void 等后缀 - 每个字母为4位 也就是半个字节
- VAA为目的寄存器 VBBBB为源寄存器 也就是A在B在后
- 每个寄存器都是32位 只是取值范围不同
- move/form16 源寄存器为16位
- move/16 目的寄存器为16位
-move-result 将上一个方法的返回值取出赋值给目的寄存器
关于数据指定指令
- const/hight16 VAA,#+BBBB0000 将源寄存器扩展成32也就是8个0后赋值给VAA.
const/wide 统一将源寄存器扩展为64位 - const/wide/hight16 上面的基础上右边加0到16个0。
- const-string/vAA,string@BBBB 字符串索引并恢复
锁指令
- monitor-enter-vAA 取锁
- monitor-exit-vAA 释放锁
书中47页介绍到一个比较重要的 实例操作指令
- check-cast vAA type@BBBB 将vAA转换成指定类型 可能 出ClassCastException.
- instance-of vA,vB,type@BBBB 判断vB是否为指定类型,是则vA为1否则为0.
- new-instance vAA,type@BBBB 构造指定类型的实例赋值给vAA,type不能指定数组类型
数组操作指令
- array-lenght vA,vB 将数组vB的条目个数赋给vA.
- array-lenght vA,vB,type@CCCC 前面的基础上添加类型指的都是vB.
- filled-new-array{vC,vD,vE,vF,vG},type@BBBB 在前面的基础上 其中vA是隐含的负责指定大小和类型.
- filled-new-array/range{vCCCC…vNNNN},type@BBBB 和前面不同的是range指定了范围.N=A+C-1。
- fill-array-data vAA,+BBBBBBBB填充指定数组可参考
- https://blog.csdn.net/qq_20330595/article/details/80995424对数组的操作做了篇总结
跳转指令
- packde-siwtch vAA,+BBBBBBB 有规则跳转
- pacrse-siwtch vAA,+BBBBBBB 无规则跳转
关于IF比较指令
可以参考我的博客
- compl-float vAA,vBB vCC 比较B和C > = < 对应-1,0,1
- compg-float vAA,vBB vCC 比较B和C > = < 对应 1,0,-1
- compl-double vAA,vBB vCC 比较B和C > = < 对应-1,0,1
- compg-double vAA,vBB vCC 比较B和C > = < 对应 1,0,-1
- compg-long vAA,vBB vCC 比较B和C > = < 对应 1,0,-1
字段操作指令
- 普通字段用i开头 取用iget 赋值用iput
- 静态使用s开头 取用sget 赋值用sput
文中50页使用到比较重要的方法调用指令
- invoke-virtual 虚方法
- invoke-direct 实例方法
- invoke-super 父类方法
- invoke-static 实例的静态方法
- invpoke-interface 实例的的接口方法
数据转化指令
https://blog.csdn.net/qq_35874273/article/details/78524323
当你分析起来很吃力的时候是因为你忘记了另一个工具010Editor
https://blog.csdn.net/sinat_18268881/article/details/55832757
010Editor不仅自动寻找偏移地址 还能显示数据结构 这个是很多博主没有告诉大家的,也是初学者的隐痛
关于类型序 貌似是临时排序的
Ps 左边是[角标 10进制的哦
struct type_id_list | 7 types |
---|---|
2 | Test |
3 | java.io.PrintStream |
4 | java.lang.Object |
5 | java.lang.String |
6 | java.lang.System |
8 | void |
A | java.lang.String[] |
struct string_id_list | 14strings |
---|---|
0 | |
1 | Hello World! |
2 | LTest; |
3 | java.io.PrintStream; |
4 | java.lang.Object; |
5 | java.lang.String; |
6 | java.lang.System; |
8 | V(void;) |
9 | VL |
7 | Test.java |
A | [Ljava/lang/String; |
B | main |
C | out |
D | println |
protoIdsSize和protoIdsOff了,它们代表的是dex文件中方法原型的个数和位置偏移
这个不简单 下面看下数据结构可知共介绍了三个参数
shortyIdx 方法内总共的成员变量数目
returnTypeIdx 返回类型
parametersOff 参数列表 记录最终参数typeIdx的偏移地址
struct proto_id_list | 3 prototypes |
---|---|
0 | void() |
1 | void (java.lang.String) |
2 | void (java.lang.String[]) |
书中78页做了详细介绍
最后一个struct class_def_item_list是正真的代码部分 可直接生成smali代码 书中80页曾指出在Android4.0系统源码目录下,dalvik/docs/instruction-formats.html 可查找35c相关指令
mapoff 指明DexMapitem结构文件偏移
那么现在 我们大概掌握了DEX的基本结构以及分析方法和工具
Odex文件格式
- odex是优化后的dex文件。
- 避免每次从apk中提取dex。
- 两种获取odex方法
- Android Rom 系统程序
- dalvik-cache 缓存文件
文中81页又一个厉害的工具来了dexopt-wrapper
还是照文章看看操作先
这边操作失败了 大概是模拟器的问题 以后有空再看吧
注意以下几点
文中115页介绍了Smali中switch的使用
关于Smali的静态语言分析可参考我的博客 smali语言入门 操作流
我们自己练习一下smali
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!