Skip to content
master
Go to file
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
src
Oct 22, 2020
Jul 2, 2020
Jul 2, 2020
Jul 7, 2020

README.md

dyOpen

A dlopen library that bypasses mobile system limitation

简介

byOpen是一个绕过移动端系统�制的增强版dlfunctions库。

支�特性

Android

支�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,但还没完整详细测试过,是�使用请自行评估。

相关原�

具体实现原�还是比较简�的,主�还是借鉴了一�绕过Android P对�SDK接��制的简�方法的�想和实现方�。

虽然这篇文章中主�目的是为了绕过hide api,�过它里�使用的将自己�装�系统调用的方�,一样�以用到System.loadLibrary上去,让系统以为是系统自身在调用System.loadLibrary

从而绕过Android N的classloader-namespace�制,将系统/system/lib中任�so库加载到maps中,然��通过fake dlopen的方�去dlsym。

增强版fake dlopen

关于fake dlopen的方�实现,网上已有很多实现,比如:

byOpenå?‚考了里é?¢çš„实现,é‡?新实现了一é??,并且å?šäº†ä¸€äº›å°?改进:

  • ä¸?在/proc/self/maps中的系统库,也能绕过é™?制强行加载进æ?¥ä½¿ç”¨
  • 除了从.dynsym中检索符å?·ï¼Œè¿˜æ”¯æŒ?从.symtab中检索符å?·ï¼ˆå?‚考:Enhanced_dlfunctions,顺带修å¤?了里é?¢çš„一些bug)
  • 整个dlopen过程å?ªæœ‰ä¸€æ¬¡malloc分é…?(çœ?去整个符å?·è¡¨çš„内存分é…?å’Œcopy)

Android例�

Android相关测试App例�在:Android Sample

注:目å‰?自带的App测试例å­?里é?¢çš„系统库我写死了,有些系统版本上有å?¯èƒ½ä¸?存在,请先改æˆ?用户自己的库和符å?·å??,å†?编译测试

public class MainActivity extends AppCompatActivity {
    private static final String SYSTEM_LIBRARY = "curl";
    private static final String SYMBOL_NAME = "curl_version";

除了Native版本dlopen接å?£ï¼ŒbyOpené¢?外æ??供了java版本的System.loadLibrary接å?£åœ¨java层直接绕过系统库加载。

关键代�如下:

static public boolean loadLibrary(String libraryName) {
    Method forName = Class.class.getDeclaredMethod("forName", String.class);
    Method getDeclaredMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);
    Class<?> systemClass = (Class<?>) forName.invoke(null, "java.lang.System");
    Method loadLibrary = (Method) getDeclaredMethod.invoke(systemClass, "loadLibrary", new Class[]{String.class});
    loadLibrary.invoke(systemClass, libraryName);
}

而native版本的dlopen_android.c实现中,我将这段绕过的系统加载的方å¼?,通过jnié‡?新实现了一é??,然å?Žå’Œfake dlopenæ— ç¼?结å?ˆåˆ°äº†ä¸€èµ·ã€‚

iOS

虽然ioså?¯ä»¥ç›´æŽ¥ä½¿ç”¨dlopen,但是审核上会有风险,苹果有å?¯èƒ½ä¼šå¯¹æ??交AppStoreçš„app扫æ??相关dlopen/dlsym等调用,æ?¥åˆ¤æ–­æ˜¯å?¦å­˜åœ¨ä¸€äº›æ•?感的ç§?有调用。

为了在通过调用一些�有接�的时候��被苹果检测到,byOpen也通过自己实现dlopen/dlsym直接从已�加载进�的images列表里�直接查找对应symbol地��调用。

当然,为了更加安全,相关调用的库符�硬编�字符串等,用户�以自行�层��加密,��直接编译进app。

接�用法

相关��库和接�在: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);
}

编译

编译需�先安装:xmake

Android

直接编译库

$ xmake f -p android --ndk=~/file/android-ndk-r20b
$ xmake

通过gradle编译测试Apk

$ cd src/android
$ ./gradlew app:assembleDebug

通过xmake直接编译apk

$ xmake apk_build

通过xmake直接安装测试apk

$ xmake apk_test

iOS

直接编译库

$ xmake f -p iphoneos -a [armv7|arm64]
$ xmake

MacOS

我们也�以在macOS下编译测试,也是支�的:

$ xmake
$ xmake run

About

🎉A dlopen library that bypasses mobile system limitation

Topics

Resources

License

Releases

No releases published

Sponsor this project

 

Packages

No packages published
You can’t perform that action at this time.