byOpen은 모바일 시스템 제한을 우회하는 dlfunctions 라이브러리의 향상된 버전입니다.
byOpen 기능
앱에서 Android 시스템 라이브러리 인터페이스 로드 및 사용을 지원합니다(지도가 아직 로드되지 않은 경우에도 마찬가지).
Android 7 이상에서는 dlopen 및 System.load 호출이 제한됩니다. 현재 인터넷에는 지도에서 so 라이브러리를 찾아 로딩 제한을 우회하는 Nougat_dlfunctions와 같은 라이브러리가 있습니다.
그러나 이 방법은 지도에 로드되지 않은 앱의 so 라이브러리에는 작동하지 않습니다.
ByOpen은 맵에서 가짜 dlopen 로딩을 지원할 뿐만 아니라 시스템 제한을 우회하여 아직 맵에 로드되지 않은 라이브러리를 강제로 로드하여 보다 보편적인 dlopen을 달성할 수도 있습니다.
참고: 현재 구현 방법은 이론적으로 비교적 보편적입니다. 적어도 내 Android 10에서는 테스트가 완료되었으나 아직 완전히 테스트되지 않았습니다. 사용 여부를 직접 평가해 보세요.
byOpen 관련 원칙
구체적인 구현 원칙은 비교적 간단합니다. 비 SDK 인터페이스에 대한 Android P의 제한 사항을 우회하는 간단한 방법의 아이디어와 구현을 주로 활용합니다.
이 글의 주된 목적은 hide api를 우회하는 것이지만, 그 안에서 자신을 시스템 호출로 위장하기 위해 사용된 메소드를 System.loadLibrary와 함께 사용하여 시스템이 시스템 자체가 System.loadLibrary를 호출하고 있다고 생각하게 만들 수도 있습니다.
이는 Android N의 클래스 로더 네임스페이스 제한을 우회하고 system/system/lib의 so 라이브러리를 맵에 로드한 다음 dlsym에 가짜 dlopen을 사용합니다.
byOpen 인터페이스 사용
관련 정적 라이브러리 및 인터페이스는 dlopen.h에 있습니다.
관련 사용 방법은 기본 dlopen과 완전히 동일합니다.
typedef by_char_t const* (*curl_version_t)();
by_pointer_t 핸들 = by_dlopen("libcurl.so", BY_RTLD_LAZY);
if(처리)
{
by_pointer_t addr = by_dlsym(handle, "curl_version");
if (주소)
{
컬_버전_t 컬_버전 = (curl_version_t)addr;
by_print("curl_version: %s", 컬_버전());
}
by_dlclose(핸들);
}