zoukankan      html  css  js  c++  java
  • Android ARM指令学习

        在逆向分析Android APK的时候,往往需要分析它的.so文件。这个.so文件就是Linux的动态链接库,只不过是在ARM-cpu下编译的。所以学习Android下的ARM指令很重要。目前,市面上的ARM-cpu基本都支持一种叫做THUMB的指令集模式。这个THUMB指令集可以看作是ARM指令集的子集,只不过ARM指令集为32bit,THUMB指令集为16bit。之所以要使用这个THUMB指令集,主要是为了提升代码密度。具体信息大家可以google。

       下面介绍如何简单修改.so文件。

       首先,我们需要熟悉ARM/THUMB指令的OPCODE。以MOVS R1, #0  为例。咋一看这是一个ARM 32bit的汇编指令,但是该指令的16进制表示只有16bit!因为编译器已经自动将这个指令优化成了16位的THUMB指令 MOV R1, #0,其16进制表示为 00 21。那么这个00 21是怎么来的呢?这就需要我们理解THUMB指令的opcode:

       如上图所示,0~7位是立即数值,8~10位为源/目的寄存器,11~12为sub_opcode,13~15为opcode的前3位。值得注意的是,这里将5位opcode分成了两部分——前3位001是固定的,后2位用于标识4中不同的操作:mov, cmp, add, sub。所以mov指令的opcode二进制表示为00100;这里Rd为R1,所以8~10位为001;同理,0~7为就0000 0000。所以MOVS R1, #0的2进制表示为:0010 0001 0000 0000 = 0x 21 00。

      但,为什么显示出来却是00 21 呢?这是因为ARM-cpu采用小端对齐的方式,至于什么是小端对齐,大家也可自行google。

      分析到这里,就告一段落了。如果我们想将原.so文件的MOVS R1, #0 修改为MOVS R1, #1,那么我们只需要将原来的0x 00 21 改为0x01 21即可。

      附THUMB OPCODE地址 :https://ece.uwaterloo.ca/~ece222/ARM/ARM7-TDMI-manual-pt3.pdf

      ARM OPCODE : http://simplemachines.it/doc/arm_inst.pdf

  • 相关阅读:
    谢尔宾斯基三角形,“混沌游戏”实现 20141022
    Who are you, What is the science
    The Tao to Excellent 2
    Mac Mini Server安装Centos6.5
    关于ftp的功能类——下载,上传,断点,连接
    mysql http://yaojialing.iteye.com/blog/773973
    序列号
    JS 文件复制
    java MySQLFront_Setup
    牛人博客
  • 原文地址:https://www.cnblogs.com/wanyuanchun/p/3707907.html
Copyright © 2011-2022 走看看