중요한
이 프로젝트는 보관되어 더 이상 유지관리되지 않습니다.
가장 일반적인 질문 중 일부는 FAQ 및 문제 해결에 답변되어 있습니다.
Android 앱용 블랙박스 난독화 도구입니다.
Obfuscapk 는 소스 코드 없이 Android 앱을 난독화하기 위한 모듈식 Python 도구입니다. apktool
디컴파일된 smali
코드, 리소스 및 매니페스트에 일부 난독화 기술을 적용한 후 원본 apk 파일을 디컴파일하고 새 애플리케이션을 빌드하는 데 사용되기 때문입니다. 난독화된 앱은 원래 앱과 동일한 기능을 유지하지만, 내부 차이점으로 인해 새 애플리케이션이 원본과 매우 다른 경우가 있습니다(예: 서명 기반 바이러스 백신 소프트웨어).
Obfuscapk는 BundleDecompiler를 사용하여 Android App Bundle(aab 파일)에 대한 지원을 추가하고 있습니다(#121 참조). 이 새로운 기능을 사용하려면 여기에서 최신 버전의 BundleDecompiler를 다운로드하고 PATH
에 포함된 디렉터리(예: Ubuntu, /usr/local/bin
또는 /usr/bin
)에 BundleDecompiler.jar
로 저장하고 실행 가능한 플래그가 설정되어 있는지 확인하세요.
중요한
BundleDecompiler는 아직 Windows에서 작동하지 않으므로 Windows 플랫폼의 Obfuscapk에서는 앱 번들 난독화가 지원되지 않습니다. 또한 App Bundle 지원은 아직 초기 개발 단계이므로 문제가 발생했거나 개선에 도움을 주고 싶다면 기여를 참조하세요.
Obfuscapk 에 대한 자세한 내용은 "Obfuscapk: Android 앱용 오픈 소스 블랙박스 난독화 도구" 논문에서 확인할 수 있습니다. 다음과 같이 논문을 인용할 수 있습니다.
@article { aonzo2020obfuscapk ,
title = " Obfuscapk: An open-source black-box obfuscation tool for Android apps " ,
journal = " SoftwareX " ,
volume = " 11 " ,
pages = " 100403 " ,
year = " 2020 " ,
issn = " 2352-7110 " ,
doi = " https://doi.org/10.1016/j.softx.2020.100403 " ,
url = " https://www.sciencedirect.com/science/article/pii/S2352711019302791 " ,
author = " Simone Aonzo and Gabriel Claudiu Georgiu and Luca Verderame and Alessio Merlo " ,
keywords = " Android, Obfuscation, Program analysis "
}
Obfuscapk은 모듈식으로 설계되었으며 확장이 쉽기 때문에 플러그인 시스템을 사용하여 구축되었습니다. 결과적으로, 모든 난독처리기는 추상 기본 클래스에서 상속되고 obfuscate
메소드를 구현해야 하는 플러그인입니다. 도구가 새로운 Android 애플리케이션 파일 처리를 시작하면 필요한 모든 정보(예: 디컴파일된 smali
코드의 위치)와 작업의 내부 상태(예: 이미 사용된 난독 처리기 목록)를 저장하기 위해 난독화 개체를 생성합니다. . 그런 다음 난독화 개체는 obfuscate
메소드에 대한 매개변수로 모든 활성 플러그인/난독처리기(순서대로)에 전달되어 처리되고 수정됩니다. 활성 플러그인의 목록과 순서는 명령줄 옵션을 통해 지정됩니다.
이 도구는 새로운 난독화 장치로 쉽게 확장 가능합니다. 난독화 기술을 구현하는 소스 코드와 플러그인 메타데이터( <obfuscator-name>.obfuscator
파일)를 src/obfuscapk/obfuscators
디렉터리에 추가하는 것으로 충분합니다(예: Nop
시작 예로서). 도구는 새 플러그인을 자동으로 감지하므로 추가 구성이 필요하지 않습니다. 새 플러그인은 도구와 함께 번들로 제공되는 다른 모든 플러그인처럼 처리됩니다.
자신의 컴퓨터에서 Obfuscapk의 작업 복사본을 얻는 방법에는 Docker를 사용하거나 Python 3
환경에서 소스 코드를 직접 사용하는 두 가지 방법이 있습니다. 두 경우 모두 가장 먼저 해야 할 일은 이 저장소의 로컬 복사본을 얻는 것입니다. 따라서 프로젝트를 저장하려는 디렉터리에서 터미널을 열고 저장소를 복제합니다.
$ git clone https://github.com/ClaudiuGeorgiu/Obfuscapk.git
유일한 요구 사항은 최신 버전의 Docker를 설치하는 것이므로 Obfuscapk 설치에 권장되는 방법입니다.
$ docker --version
Docker version 20.10.21, build baeda1f
공식 Obfuscapk Docker 이미지는 Docker Hub에서 사용할 수 있습니다(이 저장소에서 자동으로 빌드됨).
$ # Download the Docker image.
$ docker pull claudiugeorgiu/obfuscapk
$ # Give it a shorter name.
$ docker tag claudiugeorgiu/obfuscapk obfuscapk
Docker Hub에서 공식 이미지를 다운로드했다면 도구를 사용할 준비가 된 것이므로 사용 지침을 확인하세요. 그렇지 않으면 이전에 생성된 Obfuscapk/src/
디렉터리( Dockerfile
이 포함된 폴더)에서 다음 명령을 실행하여 도커 이미지:
$ # Make sure to run the command in Obfuscapk/src/ directory.
$ # It will take some time to download and install all the dependencies.
$ docker build -t obfuscapk .
Docker 이미지가 준비되면 빠른 테스트를 통해 모든 것이 올바르게 설치되었는지 확인하세요.
$ docker run --rm -it obfuscapk --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
이제 Obfuscapk를 사용할 준비가 되었습니다. 자세한 내용은 사용 지침을 참조하세요.
최신 버전의 apktool
, apksigner
및 zipalign
설치되어 있고 명령줄에서 사용할 수 있는지 확인하세요.
$ apktool
Apktool v2.9.0 - a tool for reengineering Android apk files
...
$ apksigner
Usage: apksigner < command > [options]
apksigner --version
apksigner --help
...
$ zipalign
Zip alignment utility
Copyright (C) 2009 The Android Open Source Project
...
앱 번들 난독화를 지원하려면 BundleDecompiler도 필요하므로 여기에서 사용 가능한 최신 버전을 다운로드하고 PATH
에 포함된 디렉터리(예: Ubuntu, /usr/local/bin
또는 /usr/bin
)에 BundleDecompiler.jar
로 저장하고 실행 가능한 플래그가 설정되어 있는지 확인하세요.
BundleDecompiler 및 apktool
사용하려면 최신 버전의 Java도 필요합니다. zipalign
및 apksigner
Android SDK에 포함되어 있습니다. 실행 파일의 위치는 APKTOOL_PATH
, BUNDLE_DECOMPILER_PATH
, APKSIGNER_PATH
및 ZIPALIGN_PATH
환경 변수를 통해 지정할 수도 있습니다(예: Ubuntu에서는 동일한 터미널에서 Obfuscapk를 실행하기 전에 export APKTOOL_PATH=/custom/location/apktool
실행하세요).
위의 도구 외에도 이 프로젝트의 유일한 요구 사항은 작동하는 Python 3
(최소 3.7
) 설치(패키지 관리자 pip
와 함께)입니다.
프로젝트의 기본 디렉터리( Obfuscapk/
)에서 다음 명령을 실행하여 필요한 종속성을 설치합니다.
$ # Make sure to run the commands in Obfuscapk/ directory.
$ # The usage of a virtual environment is highly recommended.
$ python3 -m venv venv
$ source venv/bin/activate
$ # Install Obfuscapk's requirements.
$ python3 -m pip install -r src/requirements.txt
요구 사항을 설치한 후 모든 것이 올바르게 작동하는지 빠른 테스트를 통해 확인하세요.
$ cd src/
$ # The following command has to be executed always from Obfuscapk/src/ directory
$ # or by adding Obfuscapk/src/ directory to PYTHONPATH environment variable.
$ python3 -m obfuscapk.cli --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
이제 Obfuscapk를 사용할 준비가 되었습니다. 자세한 내용은 사용 지침을 참조하세요.
이제부터 Obfuscapk는 obfuscapk
로 사용 가능한 실행 파일로 간주되므로 도구를 설치한 방법에 따라 명령을 조정해야 합니다.
Docker 이미지 : 난독화할 애플리케이션이 포함된 로컬 디렉터리를 컨테이너의 /workdir
(예: 현재 디렉터리 "${PWD}"
)에 마운트해야 하므로 명령은 다음과 같습니다.
$ obfuscapk [params...]
다음과 같이 됩니다:
$ docker run --rm -it -u $( id -u ) : $( id -g ) -v " ${PWD} " : " /workdir " obfuscapk [params...]
소스에서 : 모든 명령은 Obfuscapk/src/
디렉터리에서 실행되어야 하며(또는 Obfuscapk/src/
디렉터리를 PYTHONPATH
환경 변수에 추가하여) 다음 명령을 실행해야 합니다.
$ obfuscapk [params...]
다음과 같이 됩니다:
$ python3 -m obfuscapk.cli [params...]
도움말 메시지부터 살펴보겠습니다.
$ obfuscapk --help
obfuscapk [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB] [-i] [-p] [-k VT_API_KEY]
[--keystore-file KEYSTORE_FILE] [--keystore-password KEYSTORE_PASSWORD]
[--key-alias KEY_ALIAS] [--key-password KEY_PASSWORD] [--use-aapt2]
< APK_OR_BUNDLE_FILE >
두 개의 필수 매개변수가 있습니다: <APK_OR_BUNDLE_FILE>
, 난독화할 apk 또는 앱 번들 파일에 대한 경로(상대 또는 절대) 및 적용할 난독화 기술의 이름이 포함된 목록(여러 번 사용할 수 있는 -o
옵션으로 지정) 예를 들어, -o Rebuild -o NewAlignment -o NewSignature
). 다른 선택적 인수는 다음과 같습니다.
-w DIR
중간 파일( apktool
에 의해 생성됨)을 저장할 작업 디렉터리를 설정하는 데 사용됩니다. 지정하지 않으면 입력 애플리케이션과 동일한 디렉터리에 obfuscation_working_dir
이라는 디렉터리가 생성됩니다. 이는 디버깅 목적으로 유용할 수 있지만 필요하지 않은 경우 임시 디렉터리(예: -w /tmp/
)로 설정할 수 있습니다.
-d OUT_APK_OR_AAB
는 대상 파일의 경로를 설정하는 데 사용됩니다. 난독화 프로세스에 의해 생성된 apk 파일(예: -d /home/user/Desktop/obfuscated.apk
또는 -d /home/user/Desktop/obfuscated.aab
) ). 지정하지 않으면 난독화된 최종 파일이 작업 디렉터리에 저장됩니다. 참고: 기존 파일은 경고 없이 덮어쓰여집니다.
-i
는 난독화 프로세스 중에 알려진 타사 라이브러리를 무시하고 더 적은 리소스를 사용하며 성능을 높이고 오류 위험을 줄이기 위한 플래그입니다. 무시할 라이브러리 목록은 LiteRadar 프로젝트에서 조정되었습니다.
-p
는 난독화 작업 중에 진행률 표시줄을 표시하기 위한 플래그입니다. 일괄 작업/자동 빌드에서 도구를 사용할 때 진행률 표시줄을 비활성화하는 것이 편리합니다. 그렇지 않으면 난독화 진행률을 보려면 이 플래그를 활성화해야 합니다.
-k VT_API_KEY
는 VirusTotal
obfuscator를 사용하는 경우에만 Virus Total과 통신할 때 사용할 API 키를 설정하는 데 필요합니다.
--keystore-file KEYSTORE_FILE
, --keystore-password KEYSTORE_PASSWORD
, --key-alias KEY_ALIAS
및 --key-password KEY_PASSWORD
사용하여 사용자 지정 키 저장소를 지정할 수 있습니다(apk 서명에 필요함). --keystore-file
사용하는 경우 --keystore-password
및 --key-alias
도 지정해야 하며, --key-password
선택한 키에 키 저장소 비밀번호와 다른 비밀번호가 있는 경우에만 필요합니다. 기본적으로( --keystore-file
지정되지 않은 경우) Obfuscapk와 함께 번들로 제공되는 키 저장소가 서명 작업에 사용됩니다.
--ignore-packages-file IGNORE_PACKAGES_FILE
은 무시할 패키지 이름이 포함된 파일의 경로입니다. 이 옵션을 사용하면 해당 패키지 내의 모든 클래스가 난독화되지 않습니다. 파일에는 아래 예와 같이 한 줄에 하나의 패키지 이름이 있어야 합니다.
com.mycompany.dontobfuscate
com.mycompany.ignore
...
--use-aapt2
apktool
로 앱을 다시 빌드할 때 aapt2 옵션을 사용하기 위한 플래그입니다.
이제 Obfuscapk의 작동 방식을 알아보기 위한 간단한 작업 예제를 살펴보겠습니다.
$ # original.apk is a valid Android apk file.
$ obfuscapk -o RandomManifest -o Rebuild -o NewAlignment -o NewSignature original.apk
위의 명령을 실행할 때 뒤에서는 다음과 같은 일이 발생합니다.
작업 디렉터리가 지정되지 않았으므로 original.apk
와 동일한 위치에 새 작업 디렉터리( obfuscation_working_dir
)가 생성됩니다(오류 발생 시 smali
파일/매니페스트/리소스를 검사하는 데 유용할 수 있음).
필요한 모든 파일/실행 파일이 사용 가능하고 사용할 준비가 되었는지 확인하기 위해 일부 검사가 수행됩니다.
실제 난독화 프로세스가 시작됩니다. 난독화가 더 이상 남지 않거나 오류가 발생할 때까지 지정된 난독화가 순서대로 하나씩 실행됩니다.
첫 번째 obfuscator를 실행하면 apktool
을 사용하여 original.apk
가 디컴파일되고 결과가 작업 디렉터리에 저장됩니다.
첫 번째 난독처리기는 RandomManifest
이므로 디컴파일된 Android 매니페스트의 항목은 xml
구조를 깨지 않고 무작위로 재정렬됩니다.
Rebuild
Obfuscator는 apktool
사용하여 애플리케이션(이제 수정된 매니페스트를 사용하여)을 간단히 재구축하고 출력 파일이 지정되지 않았으므로 결과 apk 파일은 이전에 생성된 작업 디렉터리에 저장됩니다.
NewAlignment
obfuscator는 zipalign
도구를 사용하여 결과 apk 파일을 정렬합니다.
NewSignature
obfuscator는 Obfuscapk와 함께 번들로 제공되는 키 저장소에 포함된 사용자 정의 인증서를 사용하여 새로 생성된 apk 파일에 서명합니다( --keystore-file
매개변수를 사용하여 다른 키 저장소를 지정할 수 있음).
모든 난독 처리기가 오류 없이 실행되면 결과 난독화된 apk 파일은 obfuscation_working_dir/original_obfuscated.apk
에서 찾을 수 있으며, 서명되고 정렬되어 장치/에뮬레이터에 설치할 준비가 됩니다.
이전 예에서 볼 수 있듯이 난독화 작업을 완료하고 난독화된 최종 APK를 빌드하려면 Rebuild
, NewAlignment
및 NewSignature
난독 처리기가 항상 필요합니다. 실제 난독화 기술은 아니지만 빌드 프로세스에 필요하므로 전체 아키텍처를 모듈식으로 유지하기 위해 난독 처리기 목록에 포함됩니다.
예상대로 작동하지 않습니까? FAQ 및 문제 해결을 참조하세요.
Obfuscapk에 포함된 난독처리기는 수행하는 작업에 따라 여러 범주로 나눌 수 있습니다.
Trivial : 이름에서 알 수 있듯이 이 카테고리에는 새 서명으로 apk 파일에 서명하는 것과 같은 간단한 작업(원래 애플리케이션을 많이 수정하지 않음)이 포함됩니다.
Rename : 사용된 식별자(클래스, 필드, 메소드)의 이름을 변경하는 작업입니다.
암호화 : 암호화된 코드/리소스를 패키징하고 앱 실행 중에 이를 복호화합니다. Obfuscapk이 시작되면 암호화에 사용될 임의의 비밀 키(ASCII 문자와 숫자를 사용하여 32자 길이)를 자동으로 생성합니다.
코드 : 디컴파일된 소스 코드의 수정과 관련된 모든 작업입니다.
리소스 : 리소스 파일에 대한 작업(예: 매니페스트 수정)
다른
현재 Obfuscapk과 함께 번들로 제공되는 난독처리기는 아래에 간략하게 표시되어 있습니다(알파벳순). 자세한 내용은 해당 프로젝트의 소스코드를 참고하시기 바랍니다.
팁
아래의 모든 난독 처리기가 실제 난독 처리 기술(예: Rebuild
, NewAlignment
, NewSignature
및 VirusTotal
)에 해당하는 것은 아니지만 아키텍처를 모듈식으로 유지하고 새로운 기능으로 쉽게 확장할 수 있도록 난독 처리기로 구현됩니다.
리플렉션을 사용하여 Android 프레임워크의 위험한 API를 호출합니다. 메소드가 Android 프레임워크에 속하는지 확인하기 위해 Obfuscapk는 Backes 등이 발견한 매핑을 참조합니다.
? AdvancedReflection 소스 코드
정크코드를 삽입하세요. 이 경우, 정크 코드는 산술 연산과 그 연산 결과에 따른 분기 명령으로 구성되며, 분기가 발생하지 않도록 제작됩니다.
? ArithmeticBranch 소스 코드
자산 파일을 암호화합니다.
? AssetEncryption 소스 코드
이 기술은 코드 의미에 영향을 주지 않고 제어 흐름 그래프를 수정합니다. 즉, 원래 메서드를 호출하는 새로운 메서드를 추가합니다. 예를 들어, m1 메소드에 대한 호출은 새로운 래퍼 메소드 m2 로 대체되며, 호출되면 원래 메소드 m1을 호출합니다.
? CallIndirection 소스 코드
패키지 이름을 변경하고 클래스 이름을 바꿉니다(매니페스트 파일에서도).
? ClassRename 소스 코드
코드에서 상수 문자열을 암호화합니다.
? ConstStringEncryption 소스 코드
디버그 정보를 제거합니다.
? 디버그제거 소스 코드
필드 이름을 바꿉니다.
? FieldRename 소스 코드
메소드가 주어지면 메소드의 끝을 가리키는
goto
명령어를 삽입하고 첫 번째goto
다음에 명령어를 가리키는 또 다른goto
삽입합니다. 두 개의 새로운 노드를 추가하여 제어 흐름 그래프를 수정합니다.
? 소스코드로 이동
네이티브 라이브러리를 암호화합니다.
? Lib암호화 소스 코드
이는 Java 프로그래밍 언어의 오버로딩 기능을 활용하여 동일한 이름을 다른 메서드에 할당하지만 다른 인수를 사용합니다. 이미 존재하는 메서드가 있는 경우 이 기술은 동일한 이름과 인수를 사용하여 새로운 void 메서드를 생성하지만 새로운 임의 인수도 추가합니다. 그런 다음 새 메서드의 본문은 임의의 산술 명령어로 채워집니다.
? MethodOverload 소스 코드
메소드의 이름을 바꿉니다.
? 방법소스 코드 이름 바꾸기
응용 프로그램을 다시 정렬합니다.
? NewAlignment 소스 코드
새로운 사용자 정의 서명으로 애플리케이션에 다시 서명하십시오.
? NewSignature 소스 코드
정크코드를 삽입하세요. nop (no-option)은 아무 작업 도 수행하지 않는 전용 명령입니다. 이 기술은 모든 메소드 구현 내에 임의의
nop
명령을 삽입합니다.
? 소스코드 없음
매니페스트 파일의 항목을 무작위로 재정렬합니다.
? RandomManifest 소스 코드
애플리케이션을 다시 빌드합니다.
? 소스 코드 재구축
이 기술은 Android 프레임워크에 대한 호출을 무시하고 앱의 메서드 호출을 찾는 기존 코드를 분석합니다(
AdvancedReflection
참조). 적절한 메소드 호출(즉, 생성자 메소드 없음, 공개 가시성, 충분한 여유 레지스터 등)이 있는 명령을 찾으면 해당 호출은 Reflection API를 사용하여 원래 메소드를 호출하는 사용자 정의 메소드로 리디렉션됩니다.
? 리플렉션 소스 코드
이 기술은 코드의 기본 블록 순서를 변경하는 것으로 구성됩니다. 분기 명령이 발견되면 조건이 반전되고(예: 보다 작으면 분기 되고 크거나 같으면 분기 가 됨) 이에 따라 대상 기본 블록이 재정렬됩니다. 게다가
goto
명령을 남용하는 코드를 무작위로 재배열하기도 합니다.
? 소스 코드 재정렬
리소스의 문자열을 암호화합니다(코드 내부에서 호출되는 문자열만).
? ResStringEncryption 소스 코드
원본과 난독화된 애플리케이션을 Virus Total로 보내세요. VT API 키를 제공해야 합니다(
-k
옵션 참조).
? VirusTotal 소스 코드
MIT 라이선스에 따라 이 코드를 자유롭게 사용할 수 있습니다.
이 소프트웨어는 제노바 대학교 DIBRIS에 호스팅된 컴퓨터 보안 연구소(CSecLab)에서 연구 목적으로 개발되었습니다.