>운영 및 유지보수 >안전 >Android에서 정적 분석을 수행하는 방법

Android에서 정적 분석을 수행하는 방법

WBOY
WBOY앞으로
2023-05-11 22:28:121212검색

Android 리버스 엔지니어링은 디컴파일 과정입니다. Android 순방향 컴파일의 결과는 이해할 수 없기 때문에 CTF의 정적 분석의 전제는 기존 파일을 우리가 이해하고 정적 분석을 수행할 수 있는 소스 코드 계층으로 디컴파일하는 것입니다.

0X01 기본 설명

Android 애플리케이션의 로직 코드는 Java로 개발되었으므로 첫 번째 레이어는 Java 코드입니다.

Java 가상 머신 JVM은 Java 파일에서 컴파일된 클래스 파일을 실행합니다.

Android 가상 머신 Dalvik Java Virtual Machine의 JVM 컴파일 후 생성된 클래스 파일을 실행하지만 패키징 후 생성된 dex 파일을 실행하여 다시 통합합니다. 컴파일된 smali 파일

APK: 컴파일된 Android 애플리케이션 설치 패키지

dex 파일입니다. class 파일의 패키지 파일

smali 파일: Dalvik 바이트코드 파일입니다.

class 파일: JVM 바이트코드 파일입니다.

0X02 도구 사용

CTF의 Android 질문에서는 컴파일된 전체 APK를 제공하지 못할 수 있습니다. 어쩌면 컴파일 과정에서 어떤 파일 형식이든 가능합니다. 아래에서 Dou 형제는 다음과 같은 파일 형식을 구분하고 도구를 사용하여 Dou 형제가 이해할 수 있는 Java 소스 코드를 얻습니다.

유형 1: 클래스 파일

이 상황은 비교적 간단합니다. 추천 도구 jd-gui

직접 클래스 파일을 끌어오면 Java 소스 코드를 볼 수 있습니다.


Android에서 정적 분석을 수행하는 방법

유형 2: APK 프로그램

Android 프로젝트가 컴파일되면 원하는 APK 설치 패키지가 제공됩니다. APK 파일은 실제로 압축된 패키지입니다. ㅋㅋㅋ .

res 폴더:

아이콘 및 xml 파일을 포함한 리소스 파일을 저장합니다.
Android에서 정적 분석을 수행하는 방법AndroidManifest.xml 파일:

각 애플리케이션에서 정의하고 포함해야 하는 애플리케이션 구성 파일입니다. 애플리케이션 이름, 버전, 권한, 참조 라이브러리 파일 및 기타 정보를 설명합니다.

classes.dex 파일:

Java 파일에서 IDE로 컴파일하고 생성한 파일을 Dalvik 가상 머신에서 직접 로드하여 실행할 수 있습니다.

resources.arsc 파일>

문자열 등을 포함한 바이너리 리소스 파일

APK 디컴파일을 위한 권장 도구: ApkIDE 및 JEB

1. JEB 사용법:

JEB는 APK를 직접 가져오며, 디컴파일이 완료된 후 smali 파일을 볼 수 있습니다.

많은 Android 리버스 엔지니어링 도구가 smali 파일로 디컴파일됩니다.

JEB smali 파일을 선택하고 Q를 누르면 java 파일을 볼 수 있습니다.


Android에서 정적 분석을 수행하는 방법
장점: smali 파일에서 디컴파일된 Java 파일의 코드 구조가 명확합니다.

단점: 수정할 수 없습니다.

2. ApkIDE 사용:

Project->Open Apk
Android에서 정적 분석을 수행하는 방법디컴파일이 완료될 때까지 기다립니다.

smali 파일을 확인하세요.

Java 소스 코드를 원하는 smali 파일을 선택하고, 아래 버튼을 클릭하여 Java 소스 코드를 엽니다.
Android에서 정적 분석을 수행하는 방법

ApkIDE는 jd-gui와 연결되어 있습니다. 클릭하면 jd-gui로 이동합니다.

Android에서 정적 분석을 수행하는 방법

ApkIDE는 APK를 클래스로 디컴파일한 다음 jd-gui를 사용하여 Java 소스 코드를 가져옵니다.

Android에서 정적 분석을 수행하는 방법ApkIDE의 ApkIDE_v3.3ApkIDEWorksrc 프로젝트 디렉터리에서 디컴파일된 클래스 파일을 확인할 수 있습니다.

Android에서 정적 분석을 수행하는 방법이점: 강력합니다. 디컴파일된 smali 파일을 수정하고 다시 컴파일하여 APK를 생성할 수 있습니다.

단점: 컴파일된 Java 코드가 충분히 명확하지 않습니다.

3. 디컴파일 차이점

Smali 파일은 Smali 구문으로 작성되었으며 Smali 구문은 느슨한 구문입니다

Android에서 정적 분석을 수행하는 방법그래서 디컴파일 과정도 다르고, 도구도 다르며, 자바 소스코드도 확실히 다릅니다

다음은 위의 두 도구를 사용하는 동일한 APK 역 결과:

Java 개발 애호가인 Dou 형제는 더 편안해 보이는 JEB의 역 결과를 좋아합니다.

3번 입력: dex 파일

권장 도구 dex2.jar

Android에서 정적 분석을 수행하는 방법classes.dex 파일, 이것은 Android 소스 코드에서 컴파일된 바이트코드 패키지입니다.

다음과 같이 dex2.jar 도구를 사용하여 Java 소스 코드 명령을 가져옵니다. Android에서 정적 분석을 수행하는 방법

.d2j -dex2jar.bat C:UserslinDesktopclasses.dex


Android에서 정적 분석을 수행하는 방법

jar 파일은 클래스 파일의 압축 패키지로 이해될 수 있으며, Java 가상 머신을 직접 실행할 수 있습니다.

Jd-gui를 사용하여 Class-dex2jar.jar을 열어 Java 소스 코드를 확인하세요


Android에서 정적 분석을 수행하는 방법

유형 4 : smali 파일

smali 파일이 하나만 있는 경우 위 도구를 사용하여 직접 디컴파일할 수 없습니다.

Dou 형제는 ApkIDE가 APK를 smali 파일로 디컴파일하고 추가, 삭제, 수정이 가능하다고 생각했습니다. 그리고 smali 파일을 확인하세요

ApkIDE를 사용하여 완전한 APK를 열고 smali 파일을 추가하세요(APK는 직접 개발할 수 있습니다)


Android에서 정적 분석을 수행하는 방법

Smali 파일을 ApkIDE 프로젝트에 추가하세요.


Android에서 정적 분석을 수행하는 방법

다시 컴파일하여 APK를 생성하세요.

Android에서 정적 분석을 수행하는 방법

성공적으로 컴파일되면 원본 APK 디렉터리에 APK가 생성됩니다.


Android에서 정적 분석을 수행하는 방법

JEB 등의 도구로 열어 Ezreal.smali 파일을 확인하세요.


Android에서 정적 분석을 수행하는 방법

기타 도구:

Editor: notepad++, Sublime 등

Android 시뮬레이터: Night God 시뮬레이터 등

0X04 예시 질문 분석

시뮬레이터에 애플리케이션을 설치하고 해당 프로그램이 있는지 확인하세요. 인터페이스의 모든 프롬프트.

텍스트 상자에 문자를 입력하고 버튼을 클릭하면 올바른 플래그를 결정하는 데 사용할 수 있는지 추측해 보세요.


Android에서 정적 분석을 수행하는 방법

JEB 도구를 사용하여 Java 파일로 컴파일합니다. Android 파일 아래에 com 패키지 아래의 소스 코드 파일을 분석하려고 합니다.


Android에서 정적 분석을 수행하는 방법

코드에는 세 가지 범주만 있습니다. 먼저 프로그램 항목 MainActivity를 분석하여 핵심 코드 블록을 찾습니다.

이 if문은 플래그가 맞는지 판단하는 문장입니다.

Android에서 정적 분석을 수행하는 방법

클래스를 검색하여 이 메서드가 호출되는 위치를 확인하세요.

분석 결과 arg12가 인터페이스에 입력되는 매개변수인 것으로 나타났습니다. 이때 v5의 값이 우리가 원하는 플래그라는 것을 알 수 있습니다.


Android에서 정적 분석을 수행하는 방법

onCreate 함수는 checkSN 메서드를 호출하고 두 개의 매개 변수

MainActivity.this.edit_userName.trim()

MainActivity.this.edit_sn.getText().toString().trim( )

을 전달합니다.

//OnCreate는 "창이 생성되고 있음을 나타내는" 데 사용되는 Android의 특수 함수입니다.

//창을 생성하지 않고, 창이 표시되기 전에 스타일, 위치, 색상 등 창의 속성만 설정합니다.

public void onCreate(Bundle arg3) {

super.onCreate(arg3);

this.setContentView(0x7F040019);

this.setTitle(0x7F06001D);

this.edit_ userName = "Tenshine";

this .edit_sn = this.findViewById(0x7F0C0051);

this.btn_register = this.findViewById(0x7F0C0052);

this.btn_register.setOnClickListener(new View$OnClickListener() {

public void onClick(View arg5) {

if(!MainActivity.this.checkSN(MainActivity.this.edit_userName.trim(), MainActivity.this.edit_sn.getText().toString().trim())) {

      Toast.makeText(MainActivity.this, 0x7F06001E , 0).show (); MainActivity.this.btn_register.setEnabled(false);

MainActivity .this.setTitle(0x7F060019);

                                                                                                   직접 사용할 수 있으며

v3은 toHexString의 반환 값입니다. 메소드이며 전달되어야 합니다. v1은 v1.update(arg11.getBytes())입니다. 생성된

arg11은 전달된 매개변수 "Tenshine"

입니다.

private boolean checkSN(String arg11, String arg12) {

   boolean v7 = false;

   if(arg11 != null) {

       시도 {

           if(arg11.length() == 0) {

               반환 v7;

           }

           if(arg12 == null) {

               return v7;

           }

           if(arg1 2.length() != 22) {

               return v7;

           }

           MessageDigest v1 = MessageDigest.getInstance("MD5");

           v1.reset();

           v1.update(arg11.getBytes());

           String v3 = MainActivity.toHexString(v1.digest(), "");

ㅋㅋㅋ 5.추가(v3.charAt(v4)) ;

           }

           if(!"flag{" + v5.toString() + "}".equalsIgnoreCase(arg12)) {

               return v7;

           }

       }

       catch(NoSuchAlgorithmException v2) {

ㅋㅋㅋ

   return v7;

}

将上面的分析结果,取分生成v5의 关系代码

tour是纯java代码, 不需要Android의 包引入, 只需引入java는 依赖包。

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

공개 수업 코드 {

   static String toHexString(byte[] arg8, String arg9) {

       StringBuilder v3 = new StringBuilder();

       byte[] v0 = arg8;

       int v5 = v0.length;

      int v4;

       for(v4 = 0; v4

           String v2 = Integer.toHexString(v0[v4] & 255);

           if(v2.length() == 1) {

               v3.append('0');

           }

           v3.append(v2).append(arg9);

       }

       return v3.toString();

   }

   public static void main(String[] args)throws NoSuchAlgorith mException{

       MessageDigest v1 = MessageDigest .getInstance("MD5");

       v1.reset();

       v1.update("Tenshine".getBytes());

       String v3 = Code.toHexString(v1.digest(), "");

       StringBuilder v5 = new StringBuilder();

       int v4;

       for(v4 = 0; v4

           v5.append(v3.charAt( v4) );

       }

       System.out.println("flag{" + v5.toString() + "}");

   }

}

사용IDEA编辑运行,拿到flag。

위 내용은 Android에서 정적 분석을 수행하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제