学习 android 逆向分析过程中,需要学习 Arm 指令,不可避免要编写一些 test code 并分析其指令,这是这篇文档的背景。

在目前 android 提供的开发环境里,如果要编写 c / cpp code, 一般是通过 ndk 开发套件,基本方法就是在 windows 或 linux 发行版上下载 ndk 环境,然后编写 c / cpp code 然后编写 Android.mk 文件,最后用 ndk-build 等工具进行编译,编译出来的可执行文件再通过 adb push 的方式提交到 devices 或 emulator 运行,如果要分析其指令,需要下载 android 提供的 prebuilts binutils 工具集(如android 源码的  prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/arm-linux-androideabi/bin/ 目录),如果你在linux上用file命令查看一下这些工具,会发现 :

root@ubuntu:bin# file objdump
objdump: ELF -bit LSB executable, x86-, version (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6., stripped

它们是x86架构的,这样,你要分析devices或emulator里的elf文件,需要adb pull 下来,放在本地的linux环境或者windows里,用上述prebuilt工具分析。

稍微思考一下就会发现上述 ndk 的方式,对我们的需求来说有点太复杂了,我们真正希望的是像在标准linux发行版上那样,可以用vi/vim等编辑工具写 c/cpp code,然后用 gcc /g++ 等编译工具编译,然后能直接运行或者用gdb调试, 或者用readelf/objdump等命令查看elf结果和汇编码。问题变成了:如何在android上实现这一切?

下面的方式是经过本人收集和实际测试证明可行的,我的环境是:

目标机:小米2手机, android4.4.4, miui 6.3.5

本地机: win7

效果:在本地机adb目标机的shell, 然后用vi写 c/cpp code, 直接在shell上用gcc编译,用objdump分析指令

实现步骤如下:

1. 首先安装 busybox apk . 这个app提供了后续需要的 busy vi,  busy tar 等工具

2. 下载  adb putty , http://yunpan.cn/cZ5x9UrDFUDdK (提取码:e70e)

这个工具用来做终端,这里为什么不用win7自带的cmd或者其他增强版如 powerCmd 呢? 因为用 windows 的 cmd  终端,adb shell 连接上手机后,执行 busybox vi 等命令,会出现乱码,参考 http://www.zhihu.com/question/20624475 , 用这款  adb putty 终端则可以正常使用。

3. 下载 gcc arm, http://yunpan.cn/cZ5YVZzbvJqq4 (提取码:80b8)

这个包是我自己打的,其来源是一款app 叫 c4droid.apk 。将这个包 adb push 到目标机的 /data/local ,然后解压,你也可以解压到其他目录,之后要用这个目录来修改 android shell 的 PATH 环境变量。 参考  android终端下安装和使用gcc进行c语言编程  , 解压后如下:

为了方便使用,将上述可执行文件都改名,改名后就是 nm, gcc 这样的,这时候其实可以使用这些工具来编译了

4. 下载 binutils Arm,  http://yunpan.cn/cZ5Y9t6WA48Q6 (提取码:7fea)

这个包也是我自己打的,参考  http://regnartstranger.blogspot.com/2014/12/binutils-on-android.html , 将这个包 adb push 到目标机的 /data/local 并解压,这个包里的 objdump 等可执行文件是静态链接的,所以比较大,但是好处是不依赖任何库文件

5. 修改目标机的配置,这一步需要使用 adb putty 和 busybox 了,用 adb putty 连接到目标机,先 mount -o remount rw /system  把 /system 分区变成可写, 然后运行  busybox vi /system/etc/mkshrc ,在文件底部增加:

PATH=$PATH:/data/local/gcc/bin:/data/local/gcc/arm-linux-androideabi/bin:/data/local/gcc/libexec/gcc/arm-linux-androideabi/4.8.2
PATH=$PATH:/data/local/sysroot/bin

6. 退出 adb putty 重新连上,让上述配置生效,然后就可以使用 gcc , objdump 等工具了。 最后 mount -o remount ro /system 将属性改回来

android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析的更多相关文章

  1. android ARM 汇编学习 —— hello world

    android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析 adb putty 连上手机,用busybox vi 写一个 hello ...

  2. 在VS13上编译通过的代码放在12上编译-错误:l __dtoui3 referenced in function _event_debug_map_HT_GROW

    在VS13上编译通过的代码放在12上编译 遇到错误:l __dtoui3 referenced in function _event_debug_map_HT_GROW 1>------ 已启动 ...

  3. arm汇编学习(三)

    一.ndk编译android上运行的c程序 新建个hello目录,底下要有jni目录,下面就是Android.mk文件 1.Android.mk文件内容如下: LOCAL_PATH:= $(call ...

  4. arm汇编学习(四)

    一.android jni实现1.静态实现jni:先由Java得到本地方法的声明,然后再通过JNI实现该声明方法.2.动态实现jni:先通过JNI重载JNI_OnLoad()实现本地方法,然后直接在J ...

  5. arm汇编学习(五)

    新增个手写GNU语法arm的方法,以后可以狂逆狂写 hello.S文件 .data msg: .ascii "Hello, ARM!\n" len = . - msg .text ...

  6. ARM汇编学习笔记

    ARM  RISC  (Reduced Instruction Set Computers) X86   CISC  (Complex Instruction Set Computers)      ...

  7. Android ARM指令学习

    在逆向分析Android APK的时候,往往需要分析它的.so文件.这个.so文件就是Linux的动态链接库,只不过是在ARM-cpu下编译的.所以学习Android下的ARM指令很重要.目前,市面上 ...

  8. arm汇编学习(六)---跳转到thumb状态

    通常函数返回使用 pop {r7,pc}或bx lr等方式(bx,b类似jmp为跳转指令,但bx可以指定跳转区域究竟为thumb还是arm指令.thumb指令指令的时候,直接填写该地址却总是产生SIG ...

  9. ARM 汇编学习笔记

随机推荐

  1. 数据库sql命令

    本文为转载,原文地址:http://www.cnblogs.com/cangqiongbingchen/p/4530333.html 1.说明:创建数据库CREATE DATABASE databas ...

  2. Mybatis 异常记录(1): Invalid bound statement (not found)

    错误信息: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.pingan.cr ...

  3. Spring MVC前台POST/GET方式传参数的方法

    假设前台通过submit传值,代码如下: <form action="testPost.do" method="post"> 页码:<inpu ...

  4. angular2采用自定义指令(Directive)方式加载jquery插件

    由于angular2兴起不久,相关插件还是很少,所以有时候不得不用一些jquery插件来完成项目, 那么如何把jquery插件放到angular2中呢?采用自定义指令! 在上下文之前要引入jquery ...

  5. 201621123033 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网 ...

  6. Jprofiler分析WebSphere(配置WebSphereagent代理)

    一.   Windows+WebSphere+Jprofiler9 我们自己的windows机器监控本地的WebSphere,应该为服务器配置监控代理,供Jprofiler连接使用,具体步骤如下: 1 ...

  7. Sublime Text 2创建可复用的代码片段

    对于前端工程师来讲,写一个html页面的基本结构是体力活,每次去拷贝一个也麻烦,sublime text 2 提供了一个很好的复用代码片段.下面介绍一下创建一个html5的代码片段的过程.在菜单上点击 ...

  8. 【题解】NOI2015寿司晚宴

    想好久啊+不敢写啊……但果然人还是应当勇敢自信,只有坚定地去尝试,才会知道最后的结果.1A真的太开心啦,不过好像我的做法还是比较复杂的样子……理解起来应该算是比较容易好懂的类型,大家可以参考一下思路~ ...

  9. [洛谷P2986][USACO10MAR]伟大的奶牛聚集Great Cow Gat…

    题目大意:给你一棵树,每个点有点权,边有边权,求一个点,使得其他所有点到这个点的距离和最短,输出这个距离 题解:树形$DP$,思路清晰,转移显然 卡点:无 C++ Code: #include < ...

  10. BZOJ1559 [JSOI2009]密码 【AC自动机 + 状压dp】

    题目链接 BZOJ1559 题解 考虑到这是一个包含子串的问题,而且子串非常少,我们考虑\(AC\)自动机上的状压\(dp\) 设\(f[i][j][s]\)表示长度为\(i\)的串,匹配到了\(AC ...