2012-06-20 4 views
0

JNI 글루 코드가 포함 된 공유 라이브러리에서 관련 심볼을 추출하려고하는데 nm은 충분히 도움이되지 않습니다. 메서드 시그니처가 없으므로 어떤 인수가 전달 될지 알 수 없습니다.Android - NDK nm/objdump로 관련 JNI 후크를 추출하는 공유 라이브러리

아이디어가 있으십니까?

bash-3.2# ./arm-linux-androideabi-nm -D ~/Desktop/backup/whiteBox/libamplayerjni.so | grep Java 
00030d6c T Java_com_farcore_playerservice_AmPlayer_GL2XScale 
00030da8 T Java_com_farcore_playerservice_AmPlayer_close 
00030d74 T Java_com_farcore_playerservice_AmPlayer_disable2X2XYScale 
... 

obdump의 많은 도움의 밤은 어느 JNI로

bash-3.2# ./arm-linux-androideabi-objdump -TC ~/Desktop/backup/whiteBox/libamplayerjni.so | grep Java 
00030c00 g DF .text 00000008 Java_com_farcore_playerservice_AmPlayer_getDivxInfo 
00030c08 g DF .text 00000008 Java_com_farcore_playerservice_AmPlayer_setIVolume 
00030c10 g DF .text 00000008 Java_com_farcore_playerservice_AmPlayer_mute 
00030c18 g DF .text 00000008 Java_com_farcore_playerservice_AmPlayer_unmute 
00030c20 g DF .text 00000008 Java_com_farcore_playerservice_AmPlayer_setVideoBlackOut 

답변

2

은 함수 서명에 인수 정보가없는, C는 규칙 (cdecl 규칙)를 호출 사용합니다. 인수 유형을 찾으려면 해당 java (dalvik) 코드를 분석해야합니다. 이 과부하 방법입니다, 서명 인수 정보를 포함하지 않을 경우

00001408 g DF .text 0000000a Java_info_kghost_android_openvpn_FileDescriptorHolder_close 
00001a14 g DF .text 00000198 Java_info_kghost_android_openvpn_ManagementSocket_read__ILjava_nio_ByteBuffer_2II 
00001414 g DF .text 0000000c Java_info_kghost_android_openvpn_ManagementSocket_shutdown 
000017c4 g DF .text 00000250 Java_info_kghost_android_openvpn_ManagementSocket_read__ILjava_nio_ByteBuffer_2IILinfo_kghost_android_openvpn_FileDescriptorHolder_2 
0000142c g DF .text 00000200 Java_info_kghost_android_openvpn_ManagementSocket_write__ILjava_nio_ByteBuffer_2IILinfo_kghost_android_openvpn_FileDescriptorHolder_2 
00001420 g DF .text 0000000a Java_info_kghost_android_openvpn_ManagementSocket_close 
0000162c g DF .text 00000198 Java_info_kghost_android_openvpn_ManagementSocket_write__ILjava_nio_ByteBuffer_2II 
00001bd4 g DF .text 000000d4 Java_info_kghost_android_openvpn_ManagementSocket_open 

; 여기

내 JNI 라이브러리입니다 메서드가 오버로드되면 시그니처에는 함수 이름에 인수 정보가 포함됩니다.

그리고 당신은 네이티브 메소드 사용하기 전에 명시 적으로 JNI 라이브러리를로드해야합니다 있는지 확인하기 위해

System.loadLibrary("your-library-name"); 

하면 mmap에 (/proc/pid/maps)을 확인, 라이브러리는 안드로이드에 LD_LIBRARY_PATH 내부 /lib 디렉토리에 배치되어 있는지 확인합니다 그것을 성공적으로로드되었습니다.

+0

이것은 들리 겠지만, 종종 VM은 서명 Lcom ... (IIIII) V와 일치하는 함수를 찾을 수 없다고 불평 할 것입니다. –

+0

라이브러리가로드되어 있는지 확인해야합니다. –

+0

라이브러리가로드되었습니다. 공개 된 JNI 후크가있는 공유 라이브러리에서 함수 서명을 가져 오는 방법이 있어야합니다. –