본문 바로가기

관리 메뉴

[CMD] Windows Batch Command를 이용해 APK Manifest 분석하기 본문

프로그래밍/ㄴ기타

[CMD] Windows Batch Command를 이용해 APK Manifest 분석하기

최갓 2019. 6. 13. 15:06
반응형

안녕하세요

 

이번엔 안드로이드 빌드 결과물로 나온 APK의 AndroidManifest를 디컴파일(Decompile)해서

해당 내용을 들여다보고, 분석하는 자동화 배치 파일을 만들어보겠습니다.

 

 

규모가 큰 하나의 프로젝트를 여러 플랫폼으로 빌드하다 보면,

플랫폼에 따라 필요한 .aar이나 기타 라이브러리 파일의 관리가 점점 어려워집니다.

 

Google Play Resolver를 사용하고, 직접 aar파일을 관리해주곤 해도 결국 어디선가 실수를 하거나

구멍이 나거나 하면 이유를 찾지 못해 시간을 낭비하곤 합니다.

 

저는 원스토어, 플레이스토어, 여러 국외 마켓 등 여러가지 플랫폼으로 빌드하는 과정에서

AndroidManifest에 의도치 않은 Permission등이 들어가 중복 설치가 안되거나 하는 것 때문에 꽤 시간을 많이 낭비했습니다.

(PermissionAlreadyExist .. 류의 에러가 뜨며 중복 설치가 안되거나 합니다)

 

 

그럼, 본론으로 들어가겠습니다.

 

일단 배치파일의 전문은 아래와 같습니다

@echo off

SET OUTPUT_FOLDER=압축해제폴더명

set /p APK_PATH=APK경로 입력(.apk파일 이름 포함): 
echo.
set /p CODE=검사할 타입이나 코드 등 입력(0:종료): 

IF %CODE% EQU 0 (
	goto:EOF
	)

set RENAME=%APK_PATH:~,-3%zip
copy %APK_PATH% %RENAME%
--APK파일을 복사 하며 확장자를 zip파일로 변경합니다.

echo.
unzip.exe -o %RENAME% -d %OUTPUT_FOLDER% > NUL
echo.

--AXMLPrinter2를 이용해 암호화된 AndroidManifest를 디컴파일 합니다.
java -jar AXMLPrinter2.jar %OUTPUT_FOLDER%\AndroidManifest.xml > %OUTPUT_FOLDER%\DecompiledManifest.xml
--해당 과정이 끝나면, APK에 포함된 Manifest를 볼 수 있습니다.


--검사할 타입이나 코드에 따라 포함되면 안되는 펄미션이나 패키지명 등이 있는지 확인합니다.
--해당 결과는 콘솔창에 나열됩니다. 스페이스바를 통해 구분됩니다.
--예를들어, Google Play Store용 APK인데, One Store관련 패키지나 펄미션이 포함되어 있는지 확인하려면 다음과 같이 합니다.
IF "%CODE%" EQU "Google" (
	findstr "onestore onestore.permission onestore.pakcage" %OUTPUT_FOLDER%\DecompiledManifest.xml
	--onestore, onestore.permission, onestore.pakcage에 해당하는 문자열이 AndroidManifest에 포함되어 있다면 콘솔 로그에 표기됩니다.
	)
...
...

--확인이 끝나면 압축해제해서 본 폴더를 지워서 정리해줍니다.
@rd /S /Q %OUTPUT_FOLDER% > NUL

 

하나씩 잘라서 설명하겠습니다.

SET OUTPUT_FOLDER=압축해제폴더명

set /p APK_PATH=APK경로 입력(.apk파일 이름 포함): 
echo.
set /p CODE=검사할 타입이나 코드 등 입력(0:종료): 

제가 사용한 방법은 APK파일을 zip확장자로 변경 후 압축 해제하고, 해당 매니페스트를 디컴파일해서 불순물이 들어가있는지 확인하는 형식입니다.

그러기 위해 apk를 압축해제했을때 생길 폴더명과, 검사할 apk가 있는 경로, 검사할 타입등을 입력받습니다.

 

set RENAME=%APK_PATH:~,-3%zip
copy %APK_PATH% %RENAME%
--APK파일을 복사 하며 확장자를 zip파일로 변경합니다.

입력받은 APK경로를 기반으로 .apk확장자를 zip으로 변경해, 복사 생성합니다.

 

unzip.exe -o %RENAME% -d %OUTPUT_FOLDER% > NUL

그리고 unzip.exe를 이용해 apk파일을 압축 해제합니다.

unzip.exe파일은 다음의 경로에서 받을 수 있습니다. 다운받은 파일은 .bat파일과 같은 경로에 두시거나, 경로를 직접 지정해주세요.

:https://ko.osdn.net/projects/sfnet_unigw/downloads/unzip/5.50/unzip.exe/

 

java -jar AXMLPrinter2.jar %OUTPUT_FOLDER%\AndroidManifest.xml > %OUTPUT_FOLDER%\DecompiledManifest.xml

그리고 AXMLPrinter2.jar을 이용해 AndroidManifest.xml파일을 디컴파일합니다.

기본적으로 IL2CPP등으로 빌드된 매니페스트 파일은 암호화가 되어있지만 AXMLPrinter2.jar을 통해 디컴파일 할 수 있습니다.

>이후 열거되는 경로는 디컴파일된 AndroidManifest내용이 어디에 파일로 저장되는가 설정해주는 것입니다.

지정하지 않으면 콘솔창에 AndroidManifest내용이 표기됩니다.

AXMLPrinter2는 다음의 경로에서 받을 수 있습니다.

:https://code.google.com/archive/p/android4me/downloads

 

IF "%CODE%" EQU "Google" (
	findstr "onestore onestore.permission onestore.pakcage" %OUTPUT_FOLDER%\DecompiledManifest.xml
	--onestore, onestore.permission, onestore.pakcage에 해당하는 문자열이 AndroidManifest에 포함되어 있다면 콘솔 로그에 표기됩니다.
	)

findstr을 통해 디컴파일된 매니페스트 파일 내에 원하지 않는 문자열이 있는지 확인할 수 있습니다.

예를 들어 구글버전인데, 원스토어나 기타 다른 플랫폼의 패키지나, 펄미션 등이 포함되어있는지 확인가능합니다.

이를 확장해 여러가지 버전 및 자동화 시스템을 설계하면 됩니다.

 

 

이상입니다.

 

반응형
Comments