Android 앱의 일반적인 보호 방법과 해당 역분석 방법을 알고 싶으십니까?
이 공유에서는 난독화된 코드, 전체 Dex 강화, 분할 Dex 강화 및 가상 머신 강화를 포함하여 Android 앱 보안의 여러 측면에 대해 논의합니다. 이러한 콘텐츠는 최근 몇 년간 중국 Android 앱 보안 보호의 주요 트렌드가 되었습니다.
Java 코드는 크로스 플랫폼 해석 언어로서 중간 "바이트 코드"로 컴파일되어 클래스 파일에 저장됩니다. 크로스 플랫폼이어야 하기 때문에 이러한 바이트코드에는 많은 양의 의미 정보가 포함되어 있으며 Java 소스 코드로 쉽게 디컴파일됩니다. 개발자는 Java 소스 코드를 더 잘 보호하기 위해 컴파일된 클래스 파일을 난독화하는 경우가 많습니다.
난독화는 처리된 코드가 전처리된 코드와 동일한 기능을 완성하도록 출시된 프로그램을 재구성하여 처리하는 것입니다. 난독화된 코드는 디컴파일에 성공하더라도 프로그램의 정체성을 얻기 어렵습니다. . 실제 의미론. ProGuard는 바이트코드를 난독화하고, 줄이고, 최적화할 수 있는 오픈 소스 프로젝트입니다.
Proguard 처리 흐름 차트는 압축, 최적화, 난독화 및 사전 확인의 네 가지 주요 링크를 포함하여 아래에 표시됩니다.
압축(축소): 쓸모 없는 클래스, 필드, 메서드 및 속성을 감지하고 제거합니다.
최적화: 바이트코드를 최적화하고 불필요한 명령어를 제거합니다. 코드를 최적화하세요. 비항목 노드 클래스는 private/static/final로 추가되고, 사용되지 않는 매개변수는 삭제되며, 일부 메소드는 인라인 코드가 될 수 있습니다.
Obfuscate: a, b, c, d를 사용하세요. 클래스, 필드 및 이름을 바꾸세요. 짧고 의미 없는 이름을 가진 메소드
Preveirfy: 로드된 클래스 파일이 실행 가능한지 확인하기 위해 Java 플랫폼에서 처리된 코드를 사전 실행합니다.
공유에서 Zhong Yaping은 Proguard를 사용하여 Dex2jar을 디컴파일한 후 Apk 효과의 예를 보여주었습니다.
Proguard 처리 후
Proguard 난독 처리기는 코드를 보호할 뿐만 아니라 합리화도 할 수 있습니다. 컴파일된 프로그램 크기는 메모리 사용량을 줄입니다.
Zhong Yaping은 DEGUADR이라는 외국 도구를 공유했습니다. 이 도구는 통계적 방법을 사용하여 디컴파일을 위해 코드를 난독화합니다. 이 도구의 정확도는 100%는 아니지만 코드 디컴파일에 부분적으로 도움이 될 수 있습니다.
DEGUADR을 사용하여 난독화하는 예:
com.xxxxx.common.util.CryptoUtil 웹사이트에서도 아래와 같이 역컴파일 서비스를 제공합니다.
java.lang.String a(byte[]) -> encodeToStringjava.lang.String a(byte[],boolean,java.lang.String) -> a byte[] a(byte[],byte[]) -> encrypt byte[] b(byte[]) -> getKey byte[] b(byte[],byte[]) -> decrypt byte[] d(java.lang.String) -> getKey java.lang.String a(byte,char[]) -> a java.lang.String a(java.io.File) -> getHash java.lang.String a(java.lang.String) -> c java.lang.String b(java.lang.String) -> encode
보안 기술이 지속적으로 발전하면서 안드로이드의 보호 강도를 강화하는 새로운 '강화 기술'이 등장했습니다. DEX 강화는 DEX 파일이 정적 디컴파일 도구에 의해 크랙되거나 소스 코드가 유출되는 것을 방지하기 위해 압축하고 보호하는 것입니다. 가장 먼저 나타나는 것은 전체 강화 기술 솔루션입니다.
전체적인 강화 기술의 원리는 위와 같으며, application/classes.dex 교체, 원본 class.dex 복호화/동적 로딩, 원본 애플리케이션 관련 메소드 호출, 원본 애플리케이션 객체/ 시스템의 관련 내부 변수에 대한 이름 4개의 주요 링크. 가장 중요한 단계는 원본 class.dex를 복호화/동적으로 로드하고, 컴파일된 최종 dex 소스 코드 파일을 암호화한 다음, 새 프로젝트에서 새 프로젝트의 애플리케이션 시작을 사용하여 원본 프로젝트 코드를 복호화하고 메모리에 로드하는 것입니다. 그런 다음 현재 프로세스가 해독된 코드로 대체되어 소스 코드를 잘 숨기고 직접적인 디컴파일을 방지할 수 있습니다.
전체 Dex 강화 역분석에는 일반적으로 사용되는 두 가지 방법이 있습니다. 하나는 메모리에서 dexn035를 격렬하게 검색한 후 덤프하는 것입니다. 다음은 32비트 시스템에 미치는 영향의 예입니다.
또 다른 방법은 HookdvmDexFileOpenPartial(void* addr, int len, DvmDex**)을 사용하는 것입니다.
비즈니스 규모가 어느 정도 발전함에 따라 새로운 기능과 새로운 클래스 라이브러리가 지속적으로 추가되는 반면, 해당 APK 패키지의 크기도 급격히 증가합니다. 체계는 보안 요구 사항을 잘 충족할 수 없습니다. 전체 강화 체계 외에도 분할 강화 기술 솔루션이 등장했습니다.
하지만 위에서 본 것처럼 dex 파일을 강화하면 누락된 데이터 중 일부가 복호화된 데이터로 대체되기도 합니다. 이러한 분할 및 교체로 인해 데이터가 부정확해질 수도 있습니다. 어떤 유형의 데이터를 분할해야 하는지 결정하려면 dex 파일의 데이터 구조를 이해해야 합니다.
Dex 파일 구조는 매우 복잡합니다. 다음 그림에서는 더 중요한 내용을 선택합니다. 사실 dex 파일은 클래스를 핵심으로 모아놓은 파일인데, 가장 중요한 부분은 클래스데이터와 클래스코드인데, 이 두 부분을 분할해서 선택하면 분할된다. 작동하지 않습니다. 클래스 데이터와 바이트 코드 데이터가 유출되지 않으며 디컴파일이 완료되지 않으므로 보안이 높습니다.
Dex 분할 강화 역분석은 아래와 같이 classdata로 대체하여 새로운 dex 파일을 조립할 수 있지만, 원래 dex와 완전히 일치하지는 않습니다. 하지만 분할된 데이터의 모양도 어느 정도 복원됩니다.注意 要
첫 번째는 다음과 같은 클래스 멤버/정적 변수 작업과 관련된 인터페이스입니다.
GetStaticDoubleFieldSetStaticDoubleField GetDoubleField SetDoubleField… :
CallVoidMethodACallBooleanMethodA CallShortMethodA CallObjectMethodA …
CallStaticVoidMethodACallStaticBooleanMethodA CallStaticShortMethodA CallStaticObjectMethodA …
(byte, int, long,double …)
CallObject MethodA(JNIEnv* env, jobject object, jmethoID method, …)
가상 머신 구현 HOOKJNI 인터페이스를 통해 역분석 강화
HOOK JNI 인터페이스를 사용하면 기본 역설계 없이도 앱의 대략적인 호출 프로세스를 이해할 수 있습니다. 그러나 복잡한 호출 프로세스의 경우 또는 많은 수의 가상화 방법이 있는 경우 산술 및 논리 연산과 같이 실행을 위해 Java 계층에 다시 반영될 필요가 없는 명령에 대해 이 역분석 방법이 혼란스러워 보일 수 있습니다. 도착하면 모니터링할 수 없습니다.
가상 머신 강화 역분석 - 명령 opcode 매핑 분석
위 내용은 Android APP의 역분석 및 보호 메커니즘은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!