zoukankan      html  css  js  c++  java
  • 【移动安全基础篇】——17、ARM汇编代码

    1. so  动态库
    在 apk 的 lib 目录下,存放的是 so 文件,一般有以下几个目录
    Armeabi:arm 编码的文件
    Armeabi:arm 新版编码文件
    x86:Intel x86 汇编文件
    …其他的文件:对应其他版本的汇编文件
    这些都是 Android 的 Elf 格式文件

    2. IDA  动态调试
    启动式调试:
    1)  push IDA 目录下的 android_server 到手机中的./data/local/tmp 中,push 的时候建议重命名,因为有些壳会检测出 android_server
    2)  启动服务端:chmod 777 android_server
    3)  启动 android_server:./android_server(-p 端口号可以转换调试端口,某些壳会监听默认的调试端口)
    4)  端口转发:adb forward tcp:pc_port tcp:mobile_port
    5)  ida 调试端口设置:Debugger --> Process Option --> Hostname:localhost Port:port
    6)  程序启动:adb shell am start –D –n PackageName/ActivityName
    7)  ida 挂接:Debugger --> Attach to Process
    8)  jdb connect(需要先打开 monitor,类似于 java 的调试)
         jdb –connect com.sun.jdi.SocketAttach:hostname=127.0.0.1, port=8700

    3. Arm  调试基本说明
    1)  快捷键,类似于 OD:F2 下断点,F7 单步步入,F8 单步步过,F9 运行,F4 运行到鼠标
    2)  反编译窗口
    3)  寄存器窗口
    4)  数据窗口
    5)  堆栈窗口
    6)  输出窗口
    7)  模块窗口
    8)  函数窗口
    ......

    多做笔记

    4. so  文件信息
    Elf 文件查看工具:readelf;执行环境:linux
    参数:

    -a 显示 so 文件所有信息
    -h ELF 文件头
    -l Program header,动态加载时需要的信息
    -S Section header 静态加载分析时需要的信息
    -e 同样头信息,elf header,section header,program header
    -s 显示符号表
    -d 显示动态节

    一般使用 readelf 工具来获得 so 的详细信息

    5. So Helper
    可以用来快速地获取 so 的一些基本信息,提供较弱的汇编功能

    6. so  文件加载顺序
    Soloader --> Init_array --> JNI_onLoad --> 其他奇怪的函数 --> fini_array

    7.  堆栈
    堆栈用于保存函数中的临时变量,以及某些寄存器的值,退出时候用堆栈的数据来还原运行环境,如寄存器等等。

    8.  堆栈平衡原理
    对于每个函数,堆栈总是平衡的。即函数进入前注册了多少堆栈空间,退出时需要释放多少堆栈空间。

    9.  临时变量与全局变量
    1)  全局变量:
    存在于程序内存数据中,所有函数都可以直接调用。
    2)  临时变量:
    存在于函数堆栈中,函数进入时分配空间(于堆栈中),函数退出时释放空间。

    10.  指针
    int a = 10;
    int *p = &a;
    p 就是指针,它的值指向 a

    11.  二进制,八进制,十六进制
    计算机底层使用二进制来存储数据,二进制、八进制和十六进制之间可以相互转化。

    12.  函数参数传递
    Arm 遵循 ATPCS 规则,前 4 个参数使用 R0-R3 传递,其他均通过堆栈传递。

    13. IDA_F5  插件
    快捷键:
    N:重命名键
    Y:设置变量类型
    X:交叉引用
    /:添加函数注释
    :隐藏强制转换
    双击:跳转到相应的位置
    ESC:返回到上一级

    14. Tencent2016A.apk 

    sub1634 函数(check 函数)的内容

    PassEnc1(base64DecodeLen)函数:

    PassEnc2(base64Decode)函数:

    注册机代码:

    15. ARM 与 与 Thumb
    so 文件中存在两种形式的代码,ARM 和 Thumb。一般 ARM 每行代码占 4 个字节码,Thumb 每个指令占 2 个字节码,两者不能混用,但是可以通过 BX 和 BLX 等指令在跳转的时候实现切换。同时,ida 对此的识别也有问题,可能会把 Thumb 代码识别为 ARM,或者反着来。这时一旦调试运行到相应位置,便会报出异常导致程序退出。使用 Alt+G可以修改相应的识别。代码修改:一般没有现成的代码修改工具,可以使用 SoHelper 完成简单的修改,也可以先查汇编指令,然后在 ida 上进行字节码的修改。

    16. ARM ,Thumb  跳转指令
    偏移计算
    ARM:低 27 位是偏移位置
    下跳:偏移 = (目标地址 – 当前 PC 地址)/ 指令长度 正数下跳,负数上跳Thumb 同理,对应地:目标地址 = 偏移 * 指令长度 + 当前 PC 地址

    17.  修改 So  文件

    修改对比结果:

    替换 app 的 so 文件

    重启 APP 后可以看到效果。

    18. Cydia native Hook
    Cydia 的 native Hook 功能不支持 art 模式的 java hook,只对 so 文件下钩子就可以了。

    设置需要加载库 dl,然后就可以根据 Cydia 的 sdk 来进行重写了。
    19. Hook Demo

    对 Hello3 下钩子,将其替换为 HelloHook
    对 so 文件进行反编译分析
    Hello3 函数代码:

    HelloHook 函数代码:

    init_开头的函数是对 so 文件加载时对某些全局变量或者函数变量初始化的地方在下钩函数的起始位置下好断点

    对下钩子的过程进行跟踪调试

    Hello3 的原版函数

    HelloHook 的原版函数

    下钩以后的 Hello3 函数

    Hello3 --> HelloHook --> Hello3
    20. Hook  原理

    总会有不期而遇的温暖. 和生生不息的希望。
  • 相关阅读:
    cocos2d tiledmap
    cocos2d 例子编辑器
    cocos2d 粒子系统
    【leetcode】矩阵中的幸运数
    【leetcode】魔术索引
    【leetcode】多数元素
    【leetcode】整理字符串
    【leetcode】通过翻转子数组使两个数组相等
    【leetcode】珠玑妙算
    【leetcode】距离顺序排列矩阵单元格
  • 原文地址:https://www.cnblogs.com/devi1/p/13486449.html
Copyright © 2011-2022 走看看