본문 바로가기

AppDev/Android

[ Android ] 안드로이드 APK 디컴파일

오픈소스로 제공되는 안드로이드 디컴파일 도구를 소개한다.
해당 글에서 아래 툴들의 용도는 다음과 같다.

□ apktool : apk 파일의 리소스 파일 추출
 dex2jar : dex 파일 jar 파일로 변환
 jd-cli : jar 파일을 java 파일로 변환
 jadx : 리소스 파일 및 java 파일 추출

개인적으로 apk 소스 분석을 위한 디컴파일용 툴은 jadx 하나로 해결된다.(나머지 툴들은 리패키징 등 다른 용도로 사용)


apk파일 다운로드 : https://m.apkpure.com/kr/search

○ apktool 디컴파일

1. Mac

/bin/bash

# apktool 설치 폴더 생성
mkdir -p ~/App/Tools/AST/SAST/

# apktool 다운로드
curl -L -o ~/App/Tools/AST/SAST/apktool.jar https://github.com/iBotPeaches/Apktool/releases/download/v2.9.3/apktool_2.9.3.jar

# apktool 별칭 등록 삭제 1
sed -i '' '/^alias[[:space:]]*apktool=.*/d' ~/.bash_profile

# apktool 별칭 등록 삭제 2
sed -i '' '/^alias[[:space:]]*apktool=.*/d' ~/.zshrc

# apktool 별칭 등록 1
echo "alias apktool='java -jar $(ls ~/App/Tools/AST/SAST/apktool.jar)'" >> ~/.bash_profile

# apktool 별칭 등록 2
echo "alias apktool='java -jar $(ls ~/App/Tools/AST/SAST/apktool.jar)'" >> ~/.zshrc

# 현재 터미널에 별칭 등록 적용
source ~/.zshrc

# apktool 버전 확인
apktool --version

# APK 파일 디컴파일
# e.g. apktool -f -s -o decompile app-release.apk
apktool d -f -s -o [디컴파일 폴더] [APK 파일 명].apk

 

리소스 파일(res) 및 classes.dex(소스파일) 생성



○ dex2jar 디컴파일

1. Mac

/bin/bash

# dex2jar 설치 폴더 생성
mkdir -p ~/App/Tools/AST/SAST/dex2jar

# dex2jar 다운로드
curl -L -o /tmp/dex-tools.zip https://github.com/pxb1988/dex2jar/releases/download/v2.4/dex-tools-v2.4.zip

# 설치 폴더로 압축 풀기
unzip /tmp/dex-tools.zip -d ~/App/Tools/AST/SAST/dex2jar/

# 압축 해제후 생성된 폴더에 있는 파일 설치 폴더로 이동
mv ~/App/Tools/AST/SAST/dex2jar/*/* ~/App/Tools/AST/SAST/dex2jar/

# 압축 해제 후 이동하며 생성된 빈 폴더 제거
rmdir ~/App/Tools/AST/SAST/dex2jar/dex-tools-v2.4

# 별칭 삭제 1
sed -i '' '/^alias[[:space:]]*dex2jar=.*/d' ~/.bash_profile

# 별칭 삭제 2
sed -i '' '/^alias[[:space:]]*dex2jar=.*/d' ~/.zshrc

# 별칭 생성 1
echo "alias dex2jar='$(ls ~/App/Tools/AST/SAST/dex2jar/d2j-dex2jar.sh)'" >> ~/.bash_profile

# 별칭 생성 2
echo "alias dex2jar='$(ls ~/App/Tools/AST/SAST/dex2jar/d2j-dex2jar.sh)'" >> ~/.zshrc

# 현재 터미널에 적용
source ~/.zshrc

# 버전 확인
dex2jar 2>&1 | grep version

# apk 파일도 jar 파일로 변환 가능
dex2jar app-release.apk

# apk-tools 을 통해서 생성된 dex 파일 jar 파일 변환
dex2jar decompile/classes.dex

[ app-release-dex2jar.jar, classes-dex2jar.jar ] 생성 확인

 

○ jd-cli 디컴파일

1. Mac

/bin/bash

# jd-cli 설치 폴더 생성
mkdir -p ~/App/Tools/AST/SAST/jd-cli

# jd-cli 다운로드
curl -L -o /tmp/jd-cli.tar.gz https://github.com/intoolswetrust/jd-cli/releases/download/jd-cli-1.2.0/jd-cli-1.2.0-dist.tar.gz

# jd-cli 설치폴더 압축풀기
tar -zxvf /tmp/jd-cli.tar.gz -C ~/App/Tools/AST/SAST/jd-cli

# jd-cli 별칭 삭제 1
sed -i '' '/^alias[[:space:]]*jd-cli=.*/d' ~/.bash_profile

# jd-cli 별칭 삭제 2
sed -i '' '/^alias[[:space:]]*jd-cli=.*/d' ~/.zshrc

# jd-cli 별칭 생성 1
echo "alias jd-cli='java -jar $(ls ~/App/Tools/AST/SAST/jd-cli/jd-cli.jar)'" >> ~/.bash_profile

# jd-cli 별칭 생성 1
echo "alias jd-cli='java -jar $(ls ~/App/Tools/AST/SAST/jd-cli/jd-cli.jar)'" >> ~/.zshrc

# 현재 터미널에 적용
source ~/.zshrc

# jd-cli 버전 확인
jd-cli --version

# jar 파일 java 파일로 변환하여 src 폴더에 저장
# 현재 jd-cli 실행시 [ Class name or java source is null ]
# 에러와 함께 진행이 안되는 증상이 확인됨
# 해당 증상 확인 필요(일부는 변환이됨)
jd-cli *-dex2jar.jar -od src

src 폴더내에 변환된 java 파일을 확인

 

○ jadx 디컴파일

1. Mac

# jadx 설치 폴더 생성
mkdir -p ~/App/Tools/AST/SAST/jadx

# jadx 압축 해제
curl -L -o /tmp/jadx.zip https://github.com/skylot/jadx/releases/download/v1.5.0/jadx-1.5.0.zip

# jadx 설치 폴더 압축 해제
unzip /tmp/jadx.zip -d ~/App/Tools/AST/SAST/jadx/

# jadx 별칭 삭제 1
sed -i '' '/^alias[[:space:]]*jadx=.*/d' ~/.bash_profile

# jadx-gui 별칭 삭제 1
sed -i '' '/^alias[[:space:]]*jadx-gui=.*/d' ~/.bash_profile

# jadx 별칭 삭제 2
sed -i '' '/^alias[[:space:]]*jadx=.*/d' ~/.zshrc

# jadx-gui 별칭 삭제 2
sed -i '' '/^alias[[:space:]]*jadx-gui=.*/d' ~/.zshrc

# jadx 별칭 생성 1
echo "alias jadx='$(ls ~/App/Tools/AST/SAST/jadx/bin/jadx)'" >> ~/.bash_profile

# jadx-gui 별칭 생성 1
echo "alias jadx-gui='$(ls ~/App/Tools/AST/SAST/jadx/bin/jadx-gui)'" >> ~/.bash_profile

# jadx 별칭 생성 2
echo "alias jadx='$(ls ~/App/Tools/AST/SAST/jadx/bin/jadx)'" >> ~/.zshrc

# jadx-gui 별칭 생성 2
echo "alias jadx-gui='$(ls ~/App/Tools/AST/SAST/jadx/bin/jadx-gui)'" >> ~/.zshrc

# 현재 터미널에 적용
source ~/.zshrc

# jadx 버전 확인
jadx --version

# jadx-gui 버전 확인
jadx-gui --version

# apk 파일 디컴파일 폴더에 디컴파일
# e.g. jadx -d app-release app-release.apk
jadx -d [디컴파일 폴더] [apk 파일 명].apk

# gui 로 디컴파일된 apk 확인
# e.g. jadx-gui [apk 파일 명].apk
jadx-gui app-release.apk

jadx 디컴파일
jadx-gui 디컴파일 내용 확인