[정적 분석]
분석할 타켓을 실제 실행시키지 않는 상태로 분석. 정적분석은 Binary 분석과 Directory 탐색이 있다. 목적은 (1) 앱의 동작 로직을 파악하기 위함과 (2) 동적 분석을 쉽게 하기 위함 (3) 중요 정보 포함 여부 확인이다. apk 추출 방법은 (1) 백업 기능을 이용한 apk 다운으로 파일 관리> 백업> apk 백업> 해당 파일 PC로 추출 (2) playstore app경로로 다운 (3) apk 추출 app으로 추출
<순서도>
자바+xml > 컴파일 > 클래스 > .dex(dex tool로) > dex+resouce+xml > apk
<smali 코드>
자료형 타입
표현 | 타입 | 표현 | 타입 |
I | int | F | float |
J | long | S | short |
Z | Boolean | C | char |
D | double | V | void |
메서드 종류
> static "this"인수가 암묵적으로 첫번쨰 인수로 전달되지 않으면 Static 메소드
> Direct vrable 개입 없이 직접 invoke 함. (private method, constructor)
> Virtual 자식 클래스에서 override 될 수 있는 Vitual 메소드. 클래스와 관련된 Vtable 이용하여 invoke함.
(1) Register 간 데이터 이동
move, move/from 16, move-wide/from16, move-object, move-object/from16
(2) 리턴 값 세팅 및 처리
move-result, move-result-wide, move-result-object, return-void, return, return-wide, return-dbject
(3) 예외 처리
throw, move-exception
(4) 레지스터에 상수 대입
const/4, const/16, const, const/high16, const-wide/1, const-wide/32. const-wide, const-wide/high15, const-string, const-clasls
(5) 동기화
monitor-enter, moniter-exit
(6) 인스턴스 생성
new-instance
(7) 분기
goto, goto/16, packed-switch, if-eq, if-ne- if-lt, if-ge, if-gt, if-le, if-eqx, if-nez, if-itz, if-gez, if-gtz, if-lez
(8) 비교
cmpl-float, cmog-float,cmpl-double, cmpg-double, cmp-long
.locals2 메서드에서 사용하는 레지스터의 개수
.param p1,"amt"(이름) #I(int)
.prologue(시작)
const/4 v0(V0라는 레지스터에 0을 대입) 0x0
.line 512
iget-boolean v1, p0, Lcom/limbenjamin/Example; ->isPaid:Z(해당 함수 실행 후 v1에 대입)
if-nez v1, :cond_1(비교) //결과가 0 = cond0이면 밑, 아니면 cond1로 감.
.line 514
:cond_0
:goto_0
return v0
.line 513
:cond_1
iget-object v1,p0, Lcom/limbenjamin/Example; ->handler:Lcom/limbenjamin/ExampleHandler;
if-eqz v1, :cond_0 //0이되면 return cond0으로
실제 사용하면 좋은 코드
Smali code
(1) so 라이브러리 로드
const-string v0, "so_file_name"
invoke-static {v0}, Ljava/lang/System; -> loadLibrary(Ljava/lang/String;)V
(2) 로그 출력
.local v0, "Log":Ljava/lang/String;
const-string v1, "This code Execute!" //출력할 문자열
invoke-static {v1, v0}, Landroid/util/Log; -> e(Ljava/lang/String;Ljava/lang/String;)l
(3) toast 문자열 띄우기
const/4 v0, 0x1
const-string v1, "Modified By Normaltic"
invoke-static {p0, v1, v0}, Landroid/widget/Toast; -> makeText(Landroid/content/Context;Ljava/lang/CharSequence;l) Landroid/widget/Toast; move-result-object v0
invoke-virtual {v0}, Landroid/widget/Toast; -> show()V
앱 추출하는 방법
앱 백업) adb 쉘 연결 > cd /sdcard/ > cd backups/ > cd apps/ > mv js > /data/local/tmp 나와서 adb pull /data/local/tmp/~apk 로 앱을 가져온다.
플레이스토어) apk Extractor로 원하는 앱을 선택해준 후 추출 메세지 확인.
adb shell> cd /storage/ > cd emulated/ > cd 0/ > cd ExtractedApks > mv Di > /data/local/tmp > exit 후 /data/local/tmp/~apk
ARM
ARM 명령어 : 아이다가 복잡하거나 잘못해석할 수 있기 때문에 ARM을 공부해 분석할 경우가 있따.
CISC vs RISC
apk 디컴파일 하는 방법
java -jar apktool_2.4.1.jar d diva-beta.apk
(./d2j-dex2jar.bat diva-beta.apk) - jadx
apk studio
adb shell > su > cd /data/data > 해당 앱 디렉토리에 들어가서 봄.
(12) 안에 68diva 풀이 있음.
'App hacking' 카테고리의 다른 글
[안드로이드] 프리다 환경 구축 (0) | 2022.05.10 |
---|---|
[안드로이드] APKStudio - apk 파일 변조 후 리패키징 사인하기 (1) | 2022.05.09 |
[안드로이드] 앱 변조 후 rebuild 후 singing 하기 (0) | 2022.05.03 |
[안드로이드] apk 파일 apktool 사용, Burp 잡기, android developer site (0) | 2022.05.02 |
[모바일 앱 취약점] Diva tutorial 8 - Input Validation Issues (Part 2) (0) | 2022.03.19 |