728x90
반응형
악성 앱 분석에서 APK가 요구하는 권한을 파악하는 것은 중요합니다. 따라서, APK 파일을 디컴파일하고 AndroidManifest.xml을 분석하는 과정을 반드시 필요합니다. 이번 글에서는 Python과 apktool을 사용해 다수의 APK 파일을 디컴파하고, 앱이 요청하는 권한을 추출하는 방법을 단계별로 설명합니다.
1. 필요한 도구 및 환경 설정 🛠️
다음 도구와 라이브러리가 필요합니다:
- apktool: APK를 디컴파일하는 데 사용되는 도구입니다. (apktool 다운로드)
- Python 3.x: 코드 실행을 위한 프로그래밍 언어
- Pip 설치
pip install xml.etree.ElementTree
2. 코드 전체 흐름 📜
아래는 코드의 주요 흐름입니다:
- APK 디컴파일: apktool을 사용해 APK를 디컴파일합니다.
- AndroidManifest.xml 파일 찾기: 디컴파일된 디렉토리에서 파일을 검색합니다.
- 권한 분석: AndroidManifest.xml에서 권한 정보를 읽고, 이를 JSON 형식으로 저장합니다.
3. 핵심 코드 분석 🧩
(1) APK 디컴파일 함수: decode_apk
APK 파일을 디컴파일해 결과를 저장할 디렉토리를 생성합니다.
def decode_apk(apk_path):
output_dir = f"{apk_path}_decoded"
if not os.path.exists(output_dir):
call(f"java -jar apktool_2.9.3.jar d {apk_path} -o {output_dir}", shell=True)
else:
print(f"Directory {output_dir} already exists. Skipping decoding.")
return output_dir
(2) AndroidManifest.xml 분석: parse_manifest
AndroidManifest.xml 파일에서 패키지 이름과 권한을 추출합니다.
def parse_manifest(file_path, permissions_dict):
try:
tree = ET.parse(file_path)
root = tree.getroot()
ns = {'android': '{http://schemas.android.com/apk/res/android}'}
package_name = root.get('package', 'Unknown Package')
permissions = root.findall(".//uses-permission", ns)
extracted_permissions = []
for perm in permissions:
perm_name = perm.get(f"{ns['android']}name")
if perm_name:
simple_name = perm_name.split('.')[-1]
description = permissions_dict.get(simple_name, "No description available")
extracted_permissions.append({"permission": simple_name, "description": description})
return package_name, extracted_permissions, file_path
except ET.ParseError:
return 'Unknown Package', [], file_path
(3) 코드 실행 결과 💻
{
"com.example.app": {
"file_path": "Result/com.example.app/AndroidManifest.xml",
"permissions": [
{
"permission": "ACCESS_FINE_LOCATION",
"description": "정확한 위치에 접근"
},
{
"permission": "READ_CONTACTS",
"description": "연락처 읽기"
}
]
}
}
Reference
상세 코드는 아래 Github URL에서 확인할 수 있습니다.
https://github.com/a2sembly/AndroidManifest_Parser
728x90
반응형
'공부 > Programming' 카테고리의 다른 글
Python gspread로 구글 시트(Google Sheet) 연동하기 (1) | 2024.11.15 |
---|---|
Python: WEBP to JPG/PNG - WEBP 확장자를 JPG/PNG로! (0) | 2024.11.13 |
C# Selenium 자동 업데이트 (0) | 2023.08.16 |
[C#] C# Selenium Crawling / C# 크롤링 (0) | 2021.02.17 |