搭建Android系统C程序调试环境

在学习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客户端进行调试:
这里写图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值