天天看點

【Android 逆向】ART 函數抽取加殼 ③ ( 禁用 dex2oat 操作 HOOK 點介紹 | 內建 InLineHook )

文章目錄

  • ​​一、禁用 dex2oat 操作 HOOK 點介紹​​
  • ​​二、內建 InLineHook​​

  • ​​【Android 逆向】ART 函數抽取加殼 ① ( ART 下的函數抽取恢複時機 | 禁用 dex2oat 機制源碼分析 )​​
  • ​​【Android 逆向】ART 函數抽取加殼 ② ( 禁用 dex2oat 簡介 | TurboDex 中禁用 dex2oat 參考示例 )​​

兩篇部落格中 , 簡單介紹了 禁用 dex2oat 機制 的原理 , 下面開始 實作 dex2oat 禁用功能 ;

一、禁用 dex2oat 操作 HOOK 點介紹

dex2oat 機制 的實作流程中 , 其中需要調用 exec_utils.cc 源碼中的 ExecAndReturnCode 函數 , 在 ExecAndReturnCode 函數 中調用了 execve 函數

int ExecAndReturnCode(std::vector<std::string>& arg_vector, std::string* error_msg) {
    if (envp == nullptr) {
      execv(program, &args[0]);
    } else {
      execve(program, &args[0], envp);
    }
    return -1;
}      

源碼位址 : ​​http://aospxref.com/android-8.0.0_r36/xref/art/runtime/exec_utils.cc#ExecAndReturnCode​​ ;

二、內建 InLineHook

在上個章節介紹的 exec_utils.cc 源碼 編譯後的二進制代碼被封裝到了 libc 庫 中 ;

禁用 dex2oat 機制 , 需要 HOOK libc 庫中的 execve 函數 , HOOK Java 代碼 , 使用靜态代理 或 動态代理 模式即可 , HOOK C 語言中的代碼需要使用 InLineHook , 這裡先內建 InLineHook ;

将 相關源碼拷貝到 app\src\main\cpp\ 目錄下 , 主要源碼結構如下 :

│  CMakeLists.txt
│  native-lib.cpp
│
└─hook
    │  inlineHook.c
    │  relocate.c
    │  relocate.h
    │  TKHooklib.h
    │
    ├─dlfcn
    │      dlfcn_compat.c
    │      dlfcn_compat.h
    │      dlfcn_nougat.c
    │      dlfcn_nougat.h
    │
    └─include
            inlineHook.h      
add_library( 
    # 設定函數庫名稱
        native-lib
        # 設定函數庫類型 , 動态庫
        SHARED
        # 指定 InLineHook 涉及到的 .c 源碼
        hook/relocate.c
        hook/inlineHook.c
        hook/dlfcn/dlfcn_nougat.c
        hook/dlfcn/dlfcn_compat.c
        # 核心功能源碼
        native-lib.cpp)      
enum ele7en_status registerInlineHook(uint32_t target_addr, uint32_t new_addr, uint32_t **proto_addr);
enum ele7en_status inlineUnHook(uint32_t target_addr);
void inlineUnHookAll();
enum ele7en_status inlineHook(uint32_t target_addr);
void inlineHookAll();