Android NDK静态注册 动态注册:
https://blog.csdn.net/weixin_38927522/article/details/119672156
1. 如何编译原生程序
Application.mk(ARM硬件指令集/工程编译脚本/stl支持等)
Android.mk(编译选项/头文件/源文件及依赖库等)
local_path(call my-dir)
include $(clear_vars)
local_arm_mode:= arm指令模式
local_module:=模块名称
local_src_files:=源文件
build_executable(可执行文件)
build_shared_library(动态链接库)
build_static_library(静态链接库))
2. 原生程序的启动流程
原生程序的入口函数
动态库的加载/程序参数argc和argv的初始化
静态链接/动态链接(动态链接程序/动态链接库)
静态链接(crtbedin_static.o/crend_android.o)
动态链接(crtbegin_dynamic.o/crtend_android.o/加载 器 (system/bin/linker))
静态链接程序在启动时不需要额外的加载其他的动态库 (init/adbd/linker)
静态链接与动态链接程序的入口函数相同,动态链接程序 在执行入口函数前需要通过linker进行额外的初始化
main函数究竟何时被执行
静态链接(libc_init_static)/动态链接程序 (libc_init_dynamic)
3. 原生C++程序逆向分析
C++类的逆向
C++中的类可以理解为C语言中的结构体,每一个成员变 量就是一个结构字段,每一个成员函数的代码都被优化到 了类的外部,它们不占据存储空间
Android NDK对C++特性的支持(app_stl)
system
gabi++(rtti)=>gabi++_static/gabi_shared
stlport(rtti/stl)=>stlport_static/stlport_shared
gnustl(c++异常/rtti/stl)=>gnustl_static/gnustl_shared
4. Android NDK JNI API逆向分析
Android NDK提供了那些函数
Linux C/C++
Android NDK<=>JNI接口<=>java
JNINativeInterfasce(jni本地接口)
JNIInvokeInterface(jni调用接口)
移植/保护核心代码
如何静态分析Android NDK程序
file=>load file=>parse c header file=>jni.h=>structures