Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 替換Android中VM 加載動態庫方式

替換Android中VM 加載動態庫方式

編輯:關於Android編程

Android 加載動態庫的代碼在 dalvik/vm/Native.c,加載的方式就是調用 libdl 中 dlopen, dlsym 這些函數

應該可以在這些函數中做些手腳,dlsym 替換為 my_dlsym 這樣就可以調用自己的函數

下面舉一個例子,通常 dlopen, dlsym 使用如下

#include 
void* handle = dlopen("./hello.so", RTLD_LAZY);
typedef void (*hello_t)();
hello_t hello = (hello_t) dlsym(handle, "hello");

 hello();
dlclose(handle);

我們把在另外一個 hello1.so 提供 hello1()

#include 
void* handle = dlopen("./hello1.so", RTLD_LAZY);
typedef void (*hello_t)();
hello_t hello = (hello_t) dlsym(handle, "hello1");

 hello();
dlclose(handle);

用戶依然可以得到他想要 hello 指針


同理 在 Native.c 中定義

extern void *my_dlopen(const char *filename, int flag);
extern char *my_dlerror(void);
extern void *my_dlsym(void *handle, const char *symbol);
extern int my_dlclose(void *handle);

並把 Native.c 相關函數,加上前綴 my_, 就完全改變了 VM load 動態庫的方式


這種方式可以有多種應用方式,下面舉個栗子

比如你想做 profiling, 比如 func()

my_func() {
      // instrument code
       func()
}

而後在 my_dlsym 把對 symbol "func" 的調用替換為 my_func(), 就可以了

也許你說可以直接改 func(); 但當函數多的時候,可以在 my_dlsym中構造數組更方便解決


也許你可以把對 bionic 調用,全部替換為 glibc 的,但要注意 data struct 定義的不同,inline 和 宏定義

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved