安卓逆向-ARM可执行文件生成过程

下雨天
10月23日发布 /正在检测是否收录...

ARM可执行文件生成过程

资料:https://developer.android.google.cn/ndk/guides/other_build_systems?hl=zh-cn

1. 过程简述

  • ARM可执行文件的生成过程大概是四步:

    • 预处理、编译、汇编、链接;
  • 执行完这四步后就会得到一个可执行文件,就可以在手机上运行;
  • 需要借助于clang来实现这个过程,在android ndk会有这个工具;可在如下路径找到它;
F:\android_sdk\ndk\27.1.12297006\toolchains\llvm\prebuilt\windows-x86_64\bin
  • 进入此路径可以查看clang的版本;

image-20250301164114418

  • 将它加入到环境变量中,即可在任意位置使用它;

image-20250301165942905

  • 在进行编译之前,写一个c代码;
#include <stdio.h>

int main(int argc, char const *argv[])
{
    printf("hello sana");
    return 0;
}
  • 以它为例进行演示;

2. 预处理-E

  • 首先看看clang的基础命令;
-E  Only run the preprocessor  仅运行预处理器
用法:#clang -E hello.c -o hello.i
作用:将hello.c预处理输出hello.i文件
  • 我们需要借助这个参数来进行预处理这一步,在文件目录打开终端输入以下命令;target是指定平台;
clang -target armv7a-linux-androideabi27 -E sana.c -o sana.i
  • 会得到一个 .i 文件,这时候其实与平台是没关系的,它是把头文件展开之后,处理源代码中的宏定义、文件包含和条件编译指令;

3. 编译-S

  • 命令如下:
-S  Only run preprocess and compilation steps 仅运行预处理和编译步骤
clang -target armv7a-linux-androideabi27 -S sana.i -o sana.s
  • 这里会生成一个汇编文件,这里就与平台是相关的了;

image-20250302002239253

4. 汇编-c

  • 命令如下:
-c  Only run preprocess, compile, and assemble steps 仅运行预处理、编译和组装步骤 
clang -target armv7a-linux-androideabi27 -c sana.s -o sana.o 
  • 他生成的其实就是ELF格式,将汇编代码转换为机器码(二进制指令),需通过链接器进一步处理;

image-20250302003351069

  • 可以判断一下它的类型;

image-20250302004123271

  • 这里的file命令是装了插件,可以推到手机上用file命令看,但是此时也是不能够执行的,需要执行最后一步;

5. 链接-o

  • 命令:
clang -target armv7a-linux-androideabi27 sana.o -o hello
  • 此时再查看文件格式:

image-20250302004857313

  • 去测试一下是否是可执行的;

image-20250302005907973

  • 这里可以看到是输出了我们写的那句代码,证明就没问题;
  • 另外,如需一步到位也是执行-o命令;
clang -target armv7a-linux-androideabi27 sana.c -o hello
© 版权声明
THE END
喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
OωO
取消