apk 난독화

공부/보안 2021. 5. 17. 21:44
반응형

Renaming


 

- ClassRename

obfuscapk를 사용하여 app_1.apk를 ClassRename 난독화를 한다.

python3 -m obfuscapk.cli -o ClassRename ../../sample_apps/app_1.apk

그 후 jadx로 원본 앱과 비교하기 위해 패키징을 해준다.

apktool b app_1/ -o app_1_ClassRenamed.apk

 

jadx로 같은 파일을 확인하면, class의 이름이 Base64Coder에서 pabd63bb로 바뀐 것을 알 수 있다.

class renaming은 class의 이름를 "Base64Coder"처럼 식별할 수 있는 문자대신, "pabd63bb"와 같이 무슨 의미인지 알 수 없게 바꾸어준다. 따라서 역공학으로 해당 파일을 보더라도 무슨 역할을 하는 지 알아차리기 힘들어 역공학을 방해한다. [1]

 

기존앱을 virustotal로 검사하면 30개의 백신에서 탐지가 된다.

하지만 ClassRename을 하고 난 뒤에는 20개의 백신에만 탐지가 된다.

 

 

- MethodRename

python3 -m obfuscapk.cli -o MethodRename ../../sample_apps/app_2.apk

 

리패키징을 해준뒤 jadx로 기존앱과 비교하면

 c.ca/a 자바 클래스 파일의 메소드 f가 m8fa14cdd로 변경됨을 알 수 있다.

 

Method Rename은 method의 이름을 식별하기 힘들게 변경하는 것이다. 따라서 역공학시 해당 메소드가 어떠한 역할을 하는지 명시적으로 알기 어려워져 분석하기 어려워진다.[1]

 

백신탐지 비교

(왼쪽 : 기존 앱, 오른쪽 : MethodRename 적용)


 

 

 

 

 

Encryption


- ConstStringEncryption

소스 코드의 문자열 상수를 암호화한뒤 decrypString함수를 통하여 복호화하여 원래의 문자열 상수를 얻도록 한다. 따라서 역공학 분석시, 암호화된 문자열이 어떠한 것을 가리키는 지 인식하기 힘들어 역공학을 어렵게한다.[2]

python3 -m obfuscapk.cli -o ConstStringEncryption ../../sample_apps/app_5.apk

app_5의 connector파일을 보면 "http://" String(왼쪽사진)이 암호화(오른쪽사진)되어 있는 것을 알 수 있다.

(jadx 사용)

 

 

 

백신탐지 비교

(왼쪽 : 기존앱, 오른쪽 : ConstStringEncryption적용)

 

- AssetEncryption

 

python3 -m obfuscapk.cli -o AssetEncryption ../../sample_apps/app_2.apk

smali/android/annotation 안에 DecryptAsset.smali가 생긴 것을 알 수 있다.

new-instance v0, Ljava/io/FileInputStream;

=> FileInputStream 객체 생성

invoke-static {p0, p1}, Lcom/decryptassetmanager/DecryptAsset; >decryptAssetFileUsingContext(Landroid/content/res/AssetManager;Ljava/lang/String;)Ljava/io/File;

=> decryptAssetFileUsingContext메소드 호출, java/io/File로 반환

invoke-direct {v0, v1}, Ljava/io/FileInputStream;-><init>(Ljava/io/File;)V

=> FileInputStream 객체를 생성하여 파일을 읽어들인다.

 

decryptAssetFileUsingContext 메소드

 AES방식으로 암호화되고 ,

invoke-virtual {p0, p1}, Landroid/content/res/AssetManager;->open(Ljava/lang/String;)Ljava/io/InputStream;

파일을 열고

invoke-static {v0}, Lcom/decryptassetmanager/DecryptAsset;->readBytes(Ljava/io/InputStream;)[B

값을 읽고

invoke-virtual {v1, v7}, Ljavax/crypto/Cipher;->doFinal([B)[B

복호화 하는 것 같다.

 

백신탐지 비교

(왼쪽 : 기존 앱, 오른쪽 : AssetEncryption 적용)


 

 

 

 

Code


- Goto

java에는 없는 goto bytecode를 추가함으로써, control-flow를 수정하고 control-flow를 이해하기 어렵게 한다. [4]

 

python3 -m obfuscapk.cli -o Goto ../../sample_apps/app_2.apk

"smali/android/view/a.smali" 비교

처음에 메소드의 끝을 가리키는 goto가 있고, 메소드 끝에 메소드의 처음을 가리키는 goto가 추가되었다.

 

백신탐지 비교

(왼쪽 : 기존앱, 오른쪽 : Goto옵션 적용)

 

- Reorder

Reorder는 역공학하여 분석하기 어렵도록, 메소드의 명령어 흐름을 복잡하게 한다. 왼쪽의 그림이 Reorder된 app_3의 BandManager.smali이다. [2] 오른쪽의 기존과 method와 다르게 추가된 내용도 생기고 흐름도 goto문이 생기는 등 복잡하게 바뀐 것을 알 수 있다.

python3 -m obfuscapk.cli -o Reorder ../../sample_apps/app_3.apk

"smali/com/BandManager.smali"

 

백신탐지 비교

(왼쪽 : 기존앱, 오른쪽 : Reoreder 적용)

 

- Nop

Nop 명령어를 추가하여 bytecode 흐름을 수정한다. 따라서 control flow를 이해하기 어렵게 한다. [4]

python3 -m obfuscapk.cli -o Nop ../../sample_apps/app_2.apk

"smali/c/ca/a.smali"

왼쪽의 Nop 옵션이 적용된 app_2/smali/c/ca/a.smali 파일을 보면 오른쪽의 기존 파일과 다르게 nop 명령어들이 추가된 것을 알 수 있다.

 

백신탐지 비교

(왼쪽 : 기존앱, 오른쪽 : nop 옵션 적용)

 

- ArithmeticBranch

ArithmetiBranch 옵션은 의미 없는 코드를 삽입하여 명령어 흐름을 복잡하게 만들다. 따라서 역공학시 분석을 하기 어렵게 한다. [2] 왼쪽의 ArithmeticBranch 옵션이 적용된 app_4/smali/com/example/eroplayer/MainActivity을 보면 오른쪽의 기존 파일과 다르게 junk code가 삽입된 것을 알 수 있다.

python3 -m obfuscapk.cli -o ArithmeticBranch ../../sample_apps/app_4.apk

"smali/com/example/eroplayer/MainActivity.smali"

e

 

일반적인 개발자의 입장에선, 안드로이드 난독화는 역공학을 어렵게하여, 개발자가 만든 소스코드, 파일 등을 보호할 수 있게 해주는 좋은 수단이다.

악성 앱 개발자의 입장에선, 안드로이드 난독화는 control-flow를 바꾸거나, 암호화, renaming등으로 백신이 악성코드를 탐지하게 어렵게 악용하는 수단이다. 

이번 과제를 하면서, 개발자의 자산을 보호하는 것도 중요하지만, 악성코드를 탐지를 위해 난독화를 탐지하는 기술도 중요하다고 느꼈다.

 

참고논문

[1] 난독화에 강인한 안드로이드 앱 버스마킹 기법 김 동 진Š , 조 성 제° , 정 영 기* , 우 진 운**, 고 정 욱***, 양 수 미**** Android App Birthmarking Technique Resilient to Code Obfuscation Dongjin KimŠ , Seong-je Cho° , Youngki Chung* , Jinwoon Woo**, Jeonguk Ko***, Soo-mi Yang****

 

[2] 안드로이드 어플리케이션 역공학 보호기법 하 동 수*, 이 강 효*, 오 희 국*

[4] Android Code Protection via Obfuscation Techniques: Past, Present and Future Directions Parvez Faruki, Malaviya National Institute of Technology Jaipur, India Hossein Fereidooni, University of Padua, Italy Vijay Laxmi, Malaviya National Institute of Technology Jaipur, India Mauro Conti, University of Padua, Italy Manoj Gaur, Malaviya National Institute of Technology Jaipur, India

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

암호화 기본 - 2  (0) 2021.06.02
암호화 기본 - 1  (0) 2021.06.01
Anti-Reverse Engineering  (0) 2021.05.14
Reverse Engineering  (0) 2021.05.14
간단한 Android game app hacking  (0) 2021.05.03
블로그 이미지

아상관없어

,