2016-09-19 6 views
0

저는 현재 SO 라이브러리 (GTA SA for Android) 용 SO 플러그인 로더를 개발 중입니다. Android의 SO 라이브러리는 Unix ELF 파일입니다. 라이브러리의 소스 코드가 없으므로 가져온 함수를 소스 코드에 추가하고 SO 라이브러리를 다시 컴파일 할 수 없습니다.기존 Android SO 라이브러리에 가져온 기능을 추가하는 방법은 무엇입니까?

libGTASA.so가 있습니다. 임포트 테이블을 편집 및 변경하고, libFTXA.so가 Java 코드에 의해로드되기 전에 이미로드 된 libFastman92pluginLoader.so에 구현 될 RunSOpluginLoader라는 새로운 심볼을 추가합니다. (classes.dex)도 수정했습니다.

Windows 용 EXE 파일의 경우 많은 편집 프로그램이있어 LordPE를 사용합니다. ELF 파일의 경우 다른 해결책이 필요하지만 하나를 찾는 데 문제가 있습니다.

ELF 파일을 열어 편집해야하는 HT Editor를 사용했지만 HT Editor에서 libGTASA.so가 열리고 몇 초 만에 응용 프로그램이 중단됩니다.

SO 라이브러리에 가져 오기를 추가하는 해결책이 필요합니다. Windows에서 실행할 수있는 솔루션이 바람직하지만, 없으면 Linux 시스템에서 기꺼이 수행 할 것입니다.

제대로 가져 오기를 추가 한 후에 libGTASA.so 안에 약간의 ARM 코드를 편집하여 실제로 새로 가져온 함수를 호출합니다.

기본적으로
libGTASA.so - 가져온 심볼 RunSOpluginLoader를이 파일에 추가하려고합니다.

답변

0

몇 일 후에 나는이 작업을 수행하는 방법을 알아 냈습니다. - 헤더, 섹션 및 프로그램 세그먼트 (PT_DYNAMIC에 의해 지적) 동적 테이블의 표현을 만들

  • 로드 ELF 파일 : 나는 다음을 수행 간단한 ELF 파일 관리자 C 클래스 ++ 프로그램을 작성했다
  • 는 I 프로그램 세그먼트가 정렬되어야 발견 새로운 섹션
  • 커버 새로운 프로그램 세그먼트를 추가 (권한 RWX와 .fastman92_code) 새 섹션을 추가 I 32768의 정렬을 제작하며했다.
  • 새 문자열을 문자열 테이블에 추가했습니다 (this-> header.e_shstrndx가 가리킴). 문자열 "fastman92.code", 섹션 이름입니다.
  • 섹션이 재배치되고 파일 끝에 기록되므로 elfManager.header.e_shoff를 업데이트해야합니다.
    { "libFastman92pluginLoader.so"}, { "ProcessPluginLoading"
  • }
  • rellocated .dynsym 어레이에 두 항목을 추가 : 그것은 두 importedentries 추가
  • rellocated .dynstr (DT_STRTAB 가리키는 부) . 동적 테이블 DT_JMPREL 가리키는
  • 재배치 섹션 내 라이트주는 JNI_OnLoad 함수 근처 ProcessLoadingPlugin에
  • rellocated 프로그램 세그먼트를 가리키는 하나 명의 엔트리를 추가, 프로그램 세그먼트의 이상 부분이기 때문에,이 켜지지이다 PT_DYNAMIC 항목을 추가 첫 번째로드 가능한 세그먼트. 그것들은 더 이상 가상 주소가 0x0 인 세그먼트의 일부가 아닙니다.
  • 은 libFastman92pluginLoader.so에 구현 된 가져온 기호 ProcessPluginLoading을 호출하는 Jni_OnLoad를 대체 한 다음 .init_array에서 함수를 실행 한 다음 원래 Jni_OnLoad를 실제로 호출합니다. "Jni_OnLoad"기호는 필자의 몇 가지 기능을 가리켜 야했다. 이 "libFastman92pluginLoader.so"를 가리키는 문자열 오프셋
  • 편집 동적 테이블 DT_NEEDED 추가
  • 편집 제로로 그것의 크기를 설정하는 동적 테이블 비활성화 .init_array (InitArraySzIt-> d_un.d_val = 0;) 여기서 자동 InitArraySzIt = elfManager.FindFirstEntryInDynamicTableWithTag (0x1B); 당신에 대한 자세한 내용 또는 코드를 얻을, 저에게 연락 주시기 바랍니다하려는 경우
  • 새로운 .so를 파일

을 저장합니다.