Android Smali 기초 문법 및 구조 분석

Source

  • Evernote/Technote scraps/Android Logcatized! Smali 다루는 법 1.md

Summary

이 문서는 Android의 Dalvik 클래스 파일(.dex)을 Smali 형식으로 디컴파일하고 수정하는 방법을 소개하며, Baksmali Manager 도구를 활용한 작업 흐름을 설명합니다. 핵심 내용은 PowerManagerService.smali 파일을 예시로 들어 Smali 코드의 주요 구성 요소와 문법을 해석하는 것입니다. 주요 포인트는 다음과 같습니다: 1) 클래스 선언(.class, .super, .implements) 및 어노테이션 구조, 2) 필드(.field)의 접근 제어자(private/public 등), final 속성, 데이터 타입(:I, :Z 등)의 의미, 3) 메서드(.method) 내의 생성자(), 상수 할당(const/4, const/16), 필드 대입(iput, iput-boolean), 메서드 호출(invoke-virtual), 조건 분기(if-nez, if-gt) 및 goto 문법, 4) 네이티브 메서드(.method native)의 특징. 이를 통해 Smali 코드의 구조적 이해와 기본 디버깅/수정 능력을 기르는 것을 목표로 합니다.

Key Points

  • Android Dalvik 클래스 파일은 Smali/Baksmali 도구를 통해 텍스트 기반의 Smali 코드로 디컴파일 및 재컴파일 가능
  • Baksmali Manager를 사용하여 framework.jar 등의 시스템 파일을 Smali로 변환할 수 있음
  • Smali 파일 구조: .class(클래스 선언), .super(상위 클래스), .implements(인터페이스 구현), .annotation(메타데이터)
  • 필드(.field) 정의: 접근 제어자(private/public/static/final)와 데이터 타입(:I=정수, :Z=불리언 등)을 명시
  • 메서드(.method) 내부 문법: const(상수 할당), iput(필드 값 대입), invoke-virtual(메서드 호출), if-*(조건 분기), goto(제어 이동)
  • 생성자는 메서드로 표현되며, 네이티브 메서드는 .method native로 선언되어 C++ 라이브러리와 연동
  • Smali 코드는 Dalvik 가상머신 명령어(Dalvik Bytecode)를 텍스트로 표현한 형태로, Android 시스템 앱 수정 및 분석에 활용