在学习Android安全知识的过程需要在Android系统上验证一些C程序来验证安全漏洞或者学习操作系统知识,在这个过程有一个好的调试环境可以帮助我们更好的理解程序和Android系统的运行原理。本文描述了在Android系统上搭建调试环境的过程。
环境
- ndk-build:编译软件。
- ubuntu 14.04:调试和编译平台。
- AOSP Prebuilt:AOSP仓库包含预编译好的工具链,用里面的GDB来对C程序进行调试。
- Nexus 5:运行C程序的测试机。
安装NDK
在https://developer.android.com/ndk/downloads/index.html下载安装包,如果不能打开可以去http://www.androiddevtools.cn/下载,这里下载是android-ndk-r13b-linux-x86_64.zip,直接解压到指定目录:
配置PATH路径:
- vim编辑/etc/profile.
vim /etc/profile
- 在文件最后添加环境变量:
#set NDK env
export NDK_HOME=/opt/android/ndk/android-ndk-r13b
export PATH=$NDK_HOME:$PATH
- 生效PATH:
source /etc/profile
验证是否安装成功:
编译C
在指定位置新建文件夹【/桌面/android_c/jni】,这里注意jni文件夹是必须的否则编译会报错。
在新建的文件夹下增加c文件和Android.mk文件,c程序如下:
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
int *p1 , *p2 , *p3 , *p4 , *p5;
write(STDOUT_FILENO, "Hello, World\n", 13); char buf[128];
read(STDIN_FILENO, buf, 256);
p1 = (int *)malloc(sizeof(int) * 3);
p2 = (int *)malloc(sizeof(int) * 5);
p3 = (int *)malloc(sizeof(int) * 6);
p4 = (int *)malloc(sizeof(int) * 8);
p5 = (int *)malloc(sizeof(int) * 24);
free(p1);
free(p2);
free(p3);
free(p4);
free(p5);
}
这里的Android.mk的配置如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := DlmallocTest
LOCAL_SRC_FILES := DlmallocTest.c
LOCAL_FORCE_STATIC_EXECUTABLE := true
#include $(BUILD_SHARED_LIBRARY)
include $(BUILD_EXECUTABLE)
这里include $(BUILD_EXECUTABLE)是生成可执行文件而不是动态链接库的关键,注意区别注释的部分。
使用NDK_DEBUG=1编译选项进行编译:
编译成功,在/libs/armeabi下可以找到可在Android系统上运行的可执行文件:
推送到手机中就可以运行了:
绑定端口
使用socat工具把目标程序作为一个服务绑定到手机的某个端口:
启动程序:
调试
按照Android源代码级调试环境配置的步骤进行调试即可,为了进行源代码调试需要使用ln –s 命令创建符号链接即可。
启动程序:
启动GDB 服务器端并attach到调试进程:
启动GDB客户端进行调试: