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 进程 )