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