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 소스 코드를 볼 수 있습니다.
유형 2: APK 프로그램
Android 프로젝트가 컴파일되면 원하는 APK 설치 패키지가 제공됩니다. APK 파일은 실제로 압축된 패키지입니다. ㅋㅋㅋ .
res 폴더:
아이콘 및 xml 파일을 포함한 리소스 파일을 저장합니다.
AndroidManifest.xml 파일:
많은 Android 리버스 엔지니어링 도구가 smali 파일로 디컴파일됩니다.
JEB smali 파일을 선택하고 Q를 누르면 java 파일을 볼 수 있습니다.
장점: smali 파일에서 디컴파일된 Java 파일의 코드 구조가 명확합니다.
단점: 수정할 수 없습니다.
2. ApkIDE 사용:
Project->Open Apk
디컴파일이 완료될 때까지 기다립니다.
smali 파일을 확인하세요.
Java 소스 코드를 원하는 smali 파일을 선택하고, 아래 버튼을 클릭하여 Java 소스 코드를 엽니다.
ApkIDE의 ApkIDE_v3.3ApkIDEWorksrc 프로젝트 디렉터리에서 디컴파일된 클래스 파일을 확인할 수 있습니다.
이점: 강력합니다. 디컴파일된 smali 파일을 수정하고 다시 컴파일하여 APK를 생성할 수 있습니다.
그래서 디컴파일 과정도 다르고, 도구도 다르며, 자바 소스코드도 확실히 다릅니다
classes.dex 파일, 이것은 Android 소스 코드에서 컴파일된 바이트코드 패키지입니다.
다음과 같이 dex2.jar 도구를 사용하여 Java 소스 코드 명령을 가져옵니다.
.d2j -dex2jar.bat C:UserslinDesktopclasses.dexjar 파일은 클래스 파일의 압축 패키지로 이해될 수 있으며, Java 가상 머신을 직접 실행할 수 있습니다.
Jd-gui를 사용하여 Class-dex2jar.jar을 열어 Java 소스 코드를 확인하세요
유형 4 : smali 파일
smali 파일이 하나만 있는 경우 위 도구를 사용하여 직접 디컴파일할 수 없습니다.
Dou 형제는 ApkIDE가 APK를 smali 파일로 디컴파일하고 추가, 삭제, 수정이 가능하다고 생각했습니다. 그리고 smali 파일을 확인하세요
ApkIDE를 사용하여 완전한 APK를 열고 smali 파일을 추가하세요(APK는 직접 개발할 수 있습니다)
Smali 파일을 ApkIDE 프로젝트에 추가하세요.
다시 컴파일하여 APK를 생성하세요.
성공적으로 컴파일되면 원본 APK 디렉터리에 APK가 생성됩니다.
JEB 등의 도구로 열어 Ezreal.smali 파일을 확인하세요.
기타 도구:
Editor: notepad++, Sublime 등
Android 시뮬레이터: Night God 시뮬레이터 등
0X04 예시 질문 분석
시뮬레이터에 애플리케이션을 설치하고 해당 프로그램이 있는지 확인하세요. 인터페이스의 모든 프롬프트.
텍스트 상자에 문자를 입력하고 버튼을 클릭하면 올바른 플래그를 결정하는 데 사용할 수 있는지 추측해 보세요.
JEB 도구를 사용하여 Java 파일로 컴파일합니다. Android 파일 아래에 com 패키지 아래의 소스 코드 파일을 분석하려고 합니다.
코드에는 세 가지 범주만 있습니다. 먼저 프로그램 항목 MainActivity를 분석하여 핵심 코드 블록을 찾습니다.
이 if문은 플래그가 맞는지 판단하는 문장입니다.
클래스를 검색하여 이 메서드가 호출되는 위치를 확인하세요.
분석 결과 arg12가 인터페이스에 입력되는 매개변수인 것으로 나타났습니다. 이때 v5의 값이 우리가 원하는 플래그라는 것을 알 수 있습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!