보안/android

[앱][리버싱] 4,5주차 정리 ; ADB로 앱 디버깅

y00&z1 2021. 10. 28. 12:53

(4주차)

+) 지난주에 마무리 못한 리패키징, 키 생성 

[1] 키 생성

keytool (cmd)
안드로이드 스튜디오 - sdk ; sofware delvop kit (안드로이드 도구들이 같이 설치됨)
=> 기본적으로 android studio -> File -> Project Structure -> SDK Location (SDK 경로!)

build-tools + ~tools 라고 되어있는 것들
-> APK 버전별 폴더 있음 -> 각 도구들 있음! 

AVD manager - 에뮬레이터 생성 부분

[키 생성 명령어]

$keytool -genkey -alias [별칭입력] -keyalg RSA -validity 20000 -keystore [keystore 이름].keystore

 

 

 

[2] 리패키징

##서명 - 안드로이드에서는 앱의 무결성 검증을 위해 앱 빌드할 때 서명 필요! 

변조된 앱에 신뢰된 서명 없을 경우 -> 설치 실패 문구 발생시켜 설치 못하게 함

변조된 앱을 디컴파일하는 순간 무결성 깨짐 -> 서명 깨짐 => 이를 다시 설치 가능한 apk로 만들기 위해서, 서명 파일 생성 + 리패키징한 앱에 재서명 작업 필요

 

##apksigner vs jarsigner

1. apksigner <-!!  targetSDKVersion 30 이상  & Signature Version v2 옵션 
2. jarsigner 

-> targetSDKVersion ; AndroidManifest
빌드 관련 정보 - Gragle Scripts - bulid.gradle 
project(전반적인) / module (소스코드 관련) <-!! 주로 여기서!!

 

##zipalign 

★ apksigner로 서명할 때는 - 이전에 zipalign 먼저 진행!

(apksigner를 사용하여 apk 서명한 뒤에 apk 파일에 변경 사항 생기면 서명 무효화)

 

[zipalign 명령어]

zipalign -f -v 4 [zipalign이 필요한 apk 파일 Path] [zipalign 후 저장될 apk 파일 Path]

 

[apksigner 명령어 - windows]

java -jar [APKSIGNER_PATH] sign -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-key-alias [ALIAS_NAME] [APK_FILE_PATH]

 

오류 발생시 아래 명령어로 (java -jar 옵션 생략)

[APKSIGNER_PATH] sign -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-key-alias [ALIAS_NAME] [APK_FILE_PATH]

 

[jarsigner 명령어]

jarsigner -verbose -keystore  [KEYSTORE_PATH] [SAVED_APK_PATH] [ALIAS_NAME]




ADB(Android Debugger)로 앱 디버깅하기

 

-

C:\Users\yoon2\AppData\Local\Android\Sdk\platform-tools>adb devices
List of devices attached
3300356694b333a1        device

connect 안 하고 바로 쉘 연결

C:\Users\yoon2\AppData\Local\Android\Sdk\platform-tools>adb shell
a7xeltektt:/ $

a7xeltektt:/ $ cd /sy
sys/     system/
a7xeltektt:/ $ cd /system/bin/

-

 

##정적분석 vs 동적분석

#정적 분석 - 실행 안 하고 분석하기 (실행 안 하기 때문에 빠름)

 

# 동적분석 - apk 디컴파일하고 분석

# 동적 분석 - 직접 실행하면서 얻은 정보로 분석(파일 크면 오래 걸림,

메모리에 어떤 문자열을 올려서 연산을 하는 프로그램 - 정확히 어떤 데이터가 올라가는지 보기 위해서는 동적 분석)

=> adb 디버깅으로 실시간으로 실행하면서 동적분석 !! 


##android 디버그 브리지(adb) 

-기기와 통신할 수 있는 다목적 명령줄 도구 & adb 명령어 - 앱 설치, 디버깅과 같은 다양한 기기 작업에 사용됨 

- sdk에 포함됨 ; 안드로이드 SDK 설치 시 기본적으로 설치됨 (path : /sdk/platform-tools/)

- 클라이언트, 데몬, 서버로 구성

 

 

[작동방식]

         <개발서버>              <애뮬레이터 or 기기>
adb clinet -  adbserver - adbd(데몬)

클라이언트(나, 실행 주체) 

개발서버(서버, 클라이언트) = 우리 pc
데몬 =  우리 기기

 

1) (clinet) adb 서버 확인하기 (소켓 통신으로 서로 통신하기 때문에 이미 실행 중인 adb 서버 있는지 확인)

=> 없음! - 서버 프로세스 실행 

 

2) (server) server ps 시작 -> tcp 5037에 binding -> 클라이언트로부터 명령어 수신대기

 

3) (server) 실행중인 모든 기기 연결 설정 - 5555~5585 홀수 포트 스캔 

-> adbd(adb 데몬) 찾으면 해당 포트와 연결. 

 

!! 각 애뮬레이터는 한 쌍의 포트로 이루어짐

홀수 포트 - adb 연결용

짝수 포트 - 콘솔 연결용

-> pair로 연결

 


서버가 중간다리 역할! 

 

 

##기기에서 adb 디버깅 사용 설정하기

준비물 : 어댑터 

Android 4.2 이상 버전의 경우 : 설정 > 휴대전화 정보 > 빌드번호 일곱 번 탭! > 이전 화면으로 돌아가기 > 개발자 옵션 > USB 디버깅

 

+) tcp 연결 - 데몬에서 tcp 포트를 열어서 ip랑 포트로 새로 연결을 만듦 (usb는 필요 X)

adb connect -> tcp 연결할 때만! 



 

##adb 명령어 사용하기

https://developer.android.com/studio/command-line/adb?hl=ko#shellcommands 

 

Android 디버그 브리지(adb)  |  Android 개발자  |  Android Developers

기기와 통신할 수 있는 다목적 명령줄 도구인 Android 디버그 브리지를 알아보세요.

developer.android.com

https://blog.naver.com/gyurse/220911727781

 

[TIP] Android Shell (adb.exe) - 안드로이드 여러가지 명령어들

안드로이드의 '안'자도 모르는 초보이지만 보안공부를 하면서 자주 사용했던 안드로이드 명령어들을 한 번 ...

blog.naver.com

 

* adb명령어
  - adb [-d(디바이스 지칭) | -e(에뮬레이터지칭) | -s <serialNumber>] <command> # 명령어 기본형태
  
  - adb shell <command> # 쉘 실행하는것

  
  - adb device # 현재 돌아가고있는 디바이스 목록 출력

 
  - adb pull # device -> pc 파일 복사

  
  - adb push # pc -> device 파일 복사

  
  - adb logcat [<filter-spec>] # 장치 로그보기

  
  - adb install [-l] (Lock을 의미)[-r](reinstall)[-s](처음부터 새로 설치) # 장치에 파일(apk) 설치

  
  - adb uninstall [-k](자료는 놔두고 App만 삭제) <package> # 장치에서 package 삭제

  
  - adb logcat [<filter-spec>] # 장치로그 보기 (여러 정보를 확인할수 있다.)

 

기기에 파일이나 디렉터리 및 하위 디렉터리를 복사하기 : push 

> adb push foo.txt /sdcard/foo.txt

 

sdcard/ 대신? 
/system/vendor
/data

push - 그냥 밀어 넣음

install - 압축까지 풀어서 설치

※etc

@구체적으로 언제 사용?

앱을 동적으로 실행시키면서 로그를 보거나 동적 분석하고 싶을 때 

apk 말고 안드로이드 이미지 덤프를 던져줄 때(핸드폰 os에 대한 이미지)  - 무슨 앱들이 설치되어 있었는지, 데이터가 있었는지 확인 <- (포렌식을 위해) 그 순간을 덤프한 거니까! 

악성 앱은 어떤 앱이고 어떻게 돌아가니~? 

이미지를 모바일에 올리기 - 디스크 이미지 쓰기 해서 올림

가상 머신 띄우는 것처럼

 

@autopsy (vmware 같은)


악성코드 앱

repacking 앱을 찾자! - 기존 앱과 비교(class diff)

 

http://hisjournal.net/blog/361

 

I wannabe FALCON :: HDCON 2011 예선 Stage 4 - 안드로이드 악성코드 분석

 

hisjournal.net

 

@androidAuto

 


(5주차)

과제 보충의 보충(정답 공개) 

참고 : https://y0on-it.tistory.com/25

 

MainActivity 하나 띄우고 코드 복붙 해서 하면 더 빨리 할 수 있음!

R$string.class 
 ㄴ getString() - strings.xml에서 가져올 수 있음

https://developer.android.com/guide/topics/resources/string-resource?hl=ko#String 

 

문자열 리소스  |  Android 개발자  |  Android Developers

문자열 리소스 문자열 리소스는 옵션 사항인 텍스트 스타일 지정 및 서식 지정 기능과 함께 애플리케이션에 사용할 수 있는 텍스트 문자열을 제공합니다. 애플리케이션에 문자열을 제공할 수

developer.android.com



시간 동기화 OTP 유추 가능 

-> TOTP 키워드 검색
: getGoogleAuthenticatorBarCode

GoogleAuthenticator 검색 -> 앱이 따로 있음! 여기에 키를 입력하고 정답 pw 받으면 됨...! (헐)

gettotp

동기화하는 버튼!!
수동으로 해놔도 됨(base 32 Decode)

+)jar intellij import 하는 방법
https://atoz-develop.tistory.com/entry/JAVA-IntelliJ-IDEA-jar-%ED%8C%8C%EC%9D%BC-export-import-%EB%B0%A9%EB%B2%95

 

[JAVA] IntelliJ IDEA - jar 파일 export, import 방법

1. JAR 파일 Export 위 예시 프로젝트의 JarExample 모듈을 jar 파일로 export 하려한다. IntelliJ는 한 프로젝트 안에 다수의 모듈을 가질 수 있다. 지금은 하나의 모듈만을 갖고있는 상태이다. 1 2 3 4 5 6 7 8..

atoz-develop.tistory.com