Android 逆向代码调试器开发 ( 使用 NDK 中的 ndk-build + Android.mk 编译 Android 平台的代码调试器可执行应用 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 逆向代码调试器开发 ( 使用 NDK 中的 ndk-build + Android.mk 编译 Android 平台的代码调试器可执行应用 )相关的知识,希望对你有一定的参考价值。





一、android 平台代码调试器代码



将代码放在 Y:\\002_WorkSpace\\001_AS\\HackTool 目录下 , 之后需要用到该路径 ;





二、Android.mk 构建脚本内容



Android.mk 构建脚本 更详细的配置方法 , 参考 https://developer.android.google.cn/ndk/guides/android_mk#tiv 文档 ;


完整的 Android.mk 构建脚本 : 每行配置都添加了详细注释 ;

# 代码调试器核心代码 
JNI_SRC					:= HackTool.cpp main.cpp public.cpp Ptrace.cpp
# base 代码路径
BASE_SRC				:= $(wildcard ./Base/*.cpp)
# json 代码路径
JSON_SRC				:= $(wildcard ./Json/*.cpp)
# zlib 代码路径
ZLIB_SRC			    := $(wildcard ./zlib/*.c) $(wildcard ./zlib/*.cpp)
# 当前路径
LOCAL_PATH				:= $(call my-dir)
# 头文件路径
SRC_INCLUDES			+= $(LOCAL_PATH)/zlib $(LOCAL_PATH)/json $(LOCAL_PATH)/base

####libNative####
include					$(CLEAR_VARS)
LOCAL_ARM_MODE  		:= arm
# 指定头文件路径
LOCAL_C_INCLUDES	    += $(LOCAL_PATH) $(SRC_INCLUDES)
# 链接的动态库
LOCAL_LDLIBS			+= -llog -latomic
# 指定代码依赖于特定 C++ 功能
LOCAL_CPPFLAGS			+= -frtti -fexceptions -std=c++11 -DDEBUG -DTHUMB
# 静态块前后是有顺序的,前面的依赖后面的库
LOCAL_MODULE			:= hacktool
# 指定代码路径 
LOCAL_SRC_FILES			:= $(JNI_SRC) $(JSON_SRC) $(ZLIB_SRC)
# 编译出来是一个可以在 Android 的 adb shell 命令行可执行的程序 
include					$(BUILD_EXECUTABLE)

####libBridge####
include					$(CLEAR_VARS)
# 指定链接库路径
LOCAL_LDLIBS			+= -llog
# 指定编译模块名称
LOCAL_MODULE			:= bridge
# 指定 C 代码路径
LOCAL_SRC_FILES			:= bridge.c
#NDK_APP_DST_DIR			:= ../Debug/$(TARGET_ARCH_ABI)
# 编译目标是动态库 
include					$(BUILD_SHARED_LIBRARY)




三、Application.mk 构建脚本内容



Application.mk 构建脚本编写 , 参考 https://developer.android.google.cn/ndk/guides/application_mk 博客 ;


Application.mk 构建脚本内容 : 每行配置都添加了详细注释 ;

# 指定要编译的 CPUU 架构
APP_ABI					:= armeabi armeabi-v7a x86
# 指定用于此应用的 C++ 标准库
APP_STL					:= gnustl_static
# 指定编译的 Android 平台 , 一般是 Android 兼容的最低版本 
APP_PLATFORM			:= android-19





四、正式编译



ndk-build 脚本的用法参考 https://developer.android.google.cn/ndk/guides/ndk-build 文档 ;


在 命令行中断 , 进入 Y:\\002_WorkSpace\\001_AS\\HackTool 路径 , 这是 NDK 项目的存放路径 ;

执行

Y:/001_DevelopTools/002_Android_SDK/ndk/android-ndk-r14b-windows-x86_64/android-ndk-r14b/ndk-build.cmd NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk NDK_APPLICATION_MK=./Application.mk

命令 , 编译 Android 平台的代码调试器 ;

其中 Y:/001_DevelopTools/002_Android_SDK/ndk/android-ndk-r14b-windows-x86_64/android-ndk-r14b/ndk-build.cmd 是 android-ndk-r14b 版本 ndk 的 ndk-build.cmd 编译工具 , 注意不要用错版本 ;

NDK_PROJECT_PATH=. 用于指定 NDK 项目的路径 , 一般都是在当前路径执行 ;

APP_BUILD_SCRIPT=./Android.mk 用于指定 Android.mk 构建脚本 ;

NDK_APPLICATION_MK=./Application.mk 用于指定 Application.mk 构建脚本 ;


命令行输出 :

Microsoft Windows [版本 10.0.19041.1288]
(c) Microsoft Corporation。保留所有权利。

Y:\\002_WorkSpace\\001_AS\\HackTool>Y:/001_DevelopTools/002_Android_SDK/ndk/android-ndk-r14b-windows-x86_64/android-ndk-r14b/ndk-build.cmd NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk NDK_APPLICATION_MK=./Application.mk
[armeabi] Compile thumb  : bridge <= bridge.c
[armeabi] SharedLibrary  : libbridge.so
[armeabi] Install        : libbridge.so => libs/armeabi/libbridge.so
[armeabi] Compile++ arm  : hacktool <= HackTool.cpp
[armeabi] Compile++ arm  : hacktool <= main.cpp
[armeabi] Compile++ arm  : hacktool <= public.cpp
[armeabi] Compile++ arm  : hacktool <= Ptrace.cpp
[armeabi] Compile++ arm  : hacktool <= json_reader.cpp
[armeabi] Compile++ arm  : hacktool <= json_value.cpp
[armeabi] Compile++ arm  : hacktool <= json_writer.cpp
[armeabi] Compile arm    : hacktool <= adler32.c
[armeabi] Compile arm    : hacktool <= compress.c
[armeabi] Compile arm    : hacktool <= crc32.c
[armeabi] Compile arm    : hacktool <= deflate.c
[armeabi] Compile arm    : hacktool <= gzclose.c
[armeabi] Compile arm    : hacktool <= gzlib.c
[armeabi] Compile arm    : hacktool <= gzread.c
[armeabi] Compile arm    : hacktool <= gzwrite.c
[armeabi] Compile arm    : hacktool <= infback.c
[armeabi] Compile arm    : hacktool <= inffast.c
[armeabi] Compile arm    : hacktool <= inflate.c
[armeabi] Compile arm    : hacktool <= inftrees.c
[armeabi] Compile arm    : hacktool <= trees.c
[armeabi] Compile arm    : hacktool <= uncompr.c
[armeabi] Compile arm    : hacktool <= zutil.c
[armeabi] Compile++ arm  : hacktool <= Compressor.cpp
[armeabi] Executable     : hacktool
[armeabi] Install        : hacktool => libs/armeabi/hacktool
[armeabi-v7a] Compile thumb  : bridge <= bridge.c
[armeabi-v7a] SharedLibrary  : libbridge.so
[armeabi-v7a] Install        : libbridge.so => libs/armeabi-v7a/libbridge.so
[armeabi-v7a] Compile++ arm  : hacktool <= HackTool.cpp
[armeabi-v7a] Compile++ arm  : hacktool <= main.cpp
[armeabi-v7a] Compile++ arm  : hacktool <= public.cpp
[armeabi-v7a] Compile++ arm  : hacktool <= Ptrace.cpp
[armeabi-v7a] Compile++ arm  : hacktool <= json_reader.cpp
[armeabi-v7a] Compile++ arm  : hacktool <= json_value.cpp
[armeabi-v7a] Compile++ arm  : hacktool <= json_writer.cpp
[armeabi-v7a] Compile arm    : hacktool <= adler32.c
[armeabi-v7a] Compile arm    : hacktool <= compress.c
[armeabi-v7a] Compile arm    : hacktool <= crc32.c
[armeabi-v7a] Compile arm    : hacktool <= deflate.c
[armeabi-v7a] Compile arm    : hacktool <= gzclose.c
[armeabi-v7a] Compile arm    : hacktool <= gzlib.c
[armeabi-v7a] Compile arm    : hacktool <= gzread.c
[armeabi-v7a] Compile arm    : hacktool <= gzwrite.c
[armeabi-v7a] Compile arm    : hacktool <= infback.c
[armeabi-v7a] Compile arm    : hacktool <= inffast.c
[armeabi-v7a] Compile arm    : hacktool <= inflate.c
[armeabi-v7a] Compile arm    : hacktool <= inftrees.c
[armeabi-v7a] Compile arm    : hacktool <= trees.c
[armeabi-v7a] Compile arm    : hacktool <= uncompr.c
[armeabi-v7a] Compile arm    : hacktool <= zutil.c
[armeabi-v7a] Compile++ arm  : hacktool <= Compressor.cpp
[armeabi-v7a] Executable     : hacktool
[armeabi-v7a] Install        : hacktool => libs/armeabi-v7a/hacktool
[x86] Compile        : bridge <= bridge.c
[x86] SharedLibrary  : libbridge.so
[x86] Install        : libbridge.so => libs/x86/libbridge.so
[x86] Compile++      : hacktool <= HackTool.cpp
[x86] Compile++      : hacktool <= main.cpp
[x86] Compile++      : hacktool <= public.cpp
[x86] Compile++      : hacktool <= Ptrace.cpp
[x86] Compile++      : hacktool <= json_reader.cpp
[x86] Compile++      : hacktool <= json_value.cpp
[x86] Compile++      : hacktool <= json_writer.cpp
[x86] Compile        : hacktool <= adler32.c
[x86] Compile        : hacktool <= compress.c
[x86] Compile        : hacktool <= crc32.c
[x86] Compile        : hacktool <= deflate.c
[x86] Compile        : hacktool <= gzclose.c
[x86] Compile        : hacktool <= gzlib.c
[x86] Compile        : hacktool <= gzread.c
[x86] Compile        : hacktool <= gzwrite.c
[x86] Compile        : hacktool <= infback.c
[x86] Compile        : hacktool <= inffast.c
[x86] Compile        : hacktool <= inflate.c
[x86] Compile        : hacktool <= inftrees.c
[x86] Compile        : hacktool <= trees.c
[x86] Compile        : hacktool <= uncompr.c
[x86] Compile        : hacktool <= zutil.c
[x86] Compile++      : hacktool <= Compressor.cpp
[x86] Executable     : hacktool
[x86] Install        : hacktool => libs/x86/hacktool

Y:\\002_WorkSpace\\001_AS\\HackTool>

编译后 , 在 ndk 工程目录下生成了 libs 和 obj 目录 ;

libs 目录下是编译结果 , 分别表示不同 cpu 架构的编译结果 ;

Y:\\002_WorkSpace\\001_AS\\HackTool\\libs\\x86\\hacktool 是编译出来可以在 x86 手机 , 也就是电脑上的 Android 模拟器中 , 可以运行的 Android 代码调试器 程序 ;





五、博客资源



CSDN 下载 : https://download.csdn.net/download/han1202012/35933121

以上是关于Android 逆向代码调试器开发 ( 使用 NDK 中的 ndk-build + Android.mk 编译 Android 平台的代码调试器可执行应用 )的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向代码调试器开发 ( ptrace 函数 | 读取进程内存数据 )

Android 逆向代码调试器开发 ( ptrace 函数 | 向进程内存写出数据 )

Android 逆向代码调试器开发 ( ptrace 函数 | 读寄存器 | 写寄存器 )

Android 逆向代码调试器开发 ( 等待进程状态改变 | detach 脱离进程调试 PTRACE_DETACH | 调试中继续运行程序 PTRACE_CONT )

Android 逆向代码调试器开发 ( 代码调试器功能简介 | 设置断点 | 读写内存 | 读写寄存器 | 恢复运行 | Attach 进程 )

Android逆向笔记-使用Android Studio调试Smali代码(方式一)