android 软件安全与逆向分析(非虫)读书笔记

文章目录

    • 前言
    • 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方法
    1. Android Rom 系统程序
    2. dalvik-cache 缓存文件
文中81页又一个厉害的工具来了dexopt-wrapper

还是照文章看看操作先

这边操作失败了 大概是模拟器的问题 以后有空再看吧

注意以下几点

文中115页介绍了Smali中switch的使用

关于Smali的静态语言分析可参考我的博客 smali语言入门 操作流

我们自己练习一下smali

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年6月23日
下一篇 2018年6月23日

相关推荐