byOpen是一個繞過行動裝置系統限制的增強版dlfunctions函式庫。
byOpen特性
支援App中載入和使用Android系統庫介面(即使maps中還沒有被載入也支援)。
Android 7以上dlopen, System.load都是被限制呼叫的,雖然目前網路上有Nougat_dlfunctions等函式庫透過從maps找so函式庫來繞過載入限制。
不過對於app中還沒被載入到maps的so函式庫,這種方式就不行了。
而byOpen不僅支援fake dlopen方式從maps加載,還可以將還沒載入到maps的so函式庫繞過系統限制強行載入進來使用,實作更加通用化得dlopen。
註:目前的實作方式理論上還是比較通用的,至少我這Android 10上測試ok,但還沒完整詳細測試過,是否使用請自行評估。
byOpen相關原理
具體實作原理還是比較簡單的,主要還是藉鏡了一種繞過Android P對非SDK介面限制的簡單方法的想法和實作方式。
雖然這篇文章中主要目的是為了繞過hide api,不過它裡面使用的將自己假裝成系統呼叫的方式,一樣可以用到System.loadLibrary上去,讓系統以為是系統本身在呼叫System.loadLibrary
從而繞過Android N的classloader-namespace限制,將系統/system/lib中任意so函式庫載入到maps中,然後再透過fake dlopen的方式去dlsym。
byOpen介面用法
相關靜態庫和介面在:dlopen.h
相關使用方式跟原生dlopen完全相同
typedef by_char_t const* (*curl_version_t)();
by_pointer_t handle = by_dlopen("libcurl.so", BY_RTLD_LAZY);
if (handle)
{
by_pointer_t addr = by_dlsym(handle, "curl_version");
if (addr)
{
curl_version_t curl_version = (curl_version_t)addr;
by_print("curl_version: %s", curl_version());
}
by_dlclose(handle);
}