안드로이드 보안 - 코드 보안 5 - 디버거 및 에뮬레이터 테스트
1. 시뮬레이터의 검측
일반적으로 APK를 분석하는 과정에서 안드로이드 시뮬레이터, 예를 들어 네트워크 행위 분석, 동적 디버깅 등을 빌린다.따라서 APK 자체 보호 차원에서 APK의 현재 실행 환경에 대한 검측을 늘려 시뮬레이터에서 실행되는지 판단할 수 있고 시뮬레이터에서 실행되면 전체 응용 프로그램의 실행을 종료하거나 다른 지점으로 이동할 수 있다.시뮬레이터 검측의 수단이 매우 많으니 다음에 하나하나 분석하겠다.
(1) 일부 고유 속성 판단
//현재 장치가 시뮬레이터인지 판단합니다.TRUE를 반환하면 FALSE public static boolean is Emulator(Context context) {try {Telephony Manager tm = (Telephony Manager) context.getSystem Service(Context.TELEPHONY SERVICE), String imei = tm.getDevice Id(), if(imei!= null &imei.ei.equals("00000){0000}return (Build.MODEL.equals("sdk")) || (Build.MODEL.equals("google_sdk")); }catch (Exception ioe) {
} return false; }
물론 배터리의 배터리 상태, 배터리 전량, Secure 등 다른 값도 검사할 수 있다.ANDROID_ID, DeviceId, 휴대폰 번호 등.
(2) VM 파일 테스트
실제 설정에 맞게 안드로이드 모듈러에는/system/bin/qemu-props와 같은 특수한 문서나 목록이 저장되어 있습니다. 이 실행 가능한 파일은 아날로그에 시스템 속성을 설정할 수 있습니다.또한/system/lib/libcmalloc_debug_qemu.so 파일 및/sys/qemutrace 디렉토리이러한 특수 파일이나 디렉토리의 존재 여부를 감지하여 다음과 같은 주요 코드로 Android 애플리케이션이 에뮬레이터에서 실행되는지 확인할 수 있습니다.
코드:
1. private static String[] known_files = {
2. "/system/lib/libc_malloc_debug_qemu.so",
3. "/sys/qemu_trace",
4. "/system/bin/qemu-props"
5. };
6.
7. public static boolean hasQEmuFiles() {
8. for(String pipe : known_files) {
9. File qemu_file = new File(pipe);
10. if (qemu_file.exists())
11. return true;
12. }
13. return false;
14. }
더 완전한 코드는 Tim Strazzere의 Github에서 anti-emulator를 참고할 수 있으며, 이 항목에서는 socket 파일/dec/socket/qemud를 검사하는 등 다른 아날로그 검사 방법을 열거합니다.
2. 디버거의 검측
APK 역방향 분석을 할 때 왕왕 동적 디버깅 기술을 채택하는데 넷빈스+apktool을 사용하여 어셈블리에서 생성된 smali 코드를 동적 디버깅할 수 있다.APK의 동적 디버깅을 방지하기 위해 디버거 연결이 있는지 확인할 수 있습니다.안드로이드 시스템은android에 있습니다.os.디버그 클래스에서는 디버거 연결이 있는지 확인하는 isDebuggerConnected() 방법을 제공합니다.Application 클래스에서 isDebuggerConnected() 방법을 호출하여 디버거 연결 여부를 판단하고 있으면 프로그램을 종료할 수 있습니다.isDebuggerConnected 방법 외에도 안드로이드 매니페스트 파일의 응용 프로그램 노드에android:debuggable="false"를 추가하여 프로그램을 디버깅할 수 없도록 할 수 있습니다. 이렇게 하면 디버깅을 원한다면 이 값을true로 수정해야 하기 때문에 코드에서 이 속성의 값을 검사하여 프로그램이 수정되었는지 판단할 수 있습니다. 코드는 다음과 같습니다.
코드:
1. if(getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE != 0){
2. System.out.println("Debug");
3. android.os.Process.killProcess(android.os.Process.myPid());
4. }
:http://bbs.pediy.com/showthread.php?t=183116
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.