天天看點

Android NDK介紹Android NDK靜态注冊 動态注冊:

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