
안드로이드 APK 패키지에 대한 닌자 리버스 엔지니어링
NinjaDroid는 Android APK 패키지를 리버스 엔지니어링하는 간단한 도구입니다.
게시 위치: https://snapcraft.io/ninjadroid```shell $ snap install ninjadroid --channel=beta
[](https://github.com/rovellipaolo/NinjaDroid/actions)
[](https://coveralls.io/github/rovellipaolo/NinjaDroid)
[](https://www.gnu.org/licenses/gpl-3.0)
[](https://snapcraft.io/ninjadroid)

## 개요
NinjaDroid는 [AXMLParser](https://github.com/appknox/pyaxmlparser)와 `aapt`, `keytool`, `string` 등을 기반으로 한 일련의 Python 스크립트를 함께 사용하여 주어진 APK 패키지에서 다양한 정보를 추출합니다. 예를 들면:
- APK 파일 목록: 파일 이름, 크기, MD5, SHA-1, SHA-256 및 SHA-512
- `AndroidManifest.xml` 정보: 앱 이름, 패키지 이름, 버전, SDK, 권한, 활동, 서비스, 브로드캐스트 리시버, ...
- `CERT.RSA/DSA` 디지털 인증서 정보: 일련번호, 유효 기간, 지문, 발급자 및 소유자
- `classes.dex` 파일에 하드코딩된 URL, 셸 명령 및 기타 일반 문자열 목록
또한 NinjaDroid는 [apktool](https://github.com/iBotPeaches/Apktool)과 [dex2jar](https://github.com/pxb1988/dex2jar)를 사용하여 다음을 추출하고 저장합니다:
- 추출된 모든 APK 정보가 포함된 JSON 보고서 파일
- `AndroidManifest.xml` 파일 (`apktool` 덕분에)
- `CERT.RSA/DSA` 디지털 인증서 파일
- `classes.dex` 파일
- 변환된 _.jar_ 파일 (`dex2jar` 덕분에)
- 디스어셈블된 smali 파일 (`apktool` 덕분에)
- `assets/` 및 `res/` 폴더와 그 내용 (`apktool` 덕분에)
## 빌드
첫 번째 단계는 NinjaDroid 저장소를 클론하거나 소스 코드를 다운로드하는 것입니다.```shell
$ git clone https://github.com/rovellipaolo/NinjaDroid
$ cd NinjaDroid
NinjaDroid는 여러 가지 방식으로 실행할 수 있습니다: 로컬 환경에서 네이티브로, Docker, Flatpak (실험적), Snap (실험적)을 통해서도 가능합니다.
로컬 머신에서 NinjaDroid를 실행하려면 Python 3.5 이상, Java 8 이상, 그리고 binutils를 설치해야 합니다.
선택적으로, Android SDK가 로컬에 설치되어 있다면 포함된 aapt 대신 SDK 버전의 aapt를 사용할 수 있습니다. 이렇게 하려면 ninjadroid/aapt/Aapt.py에서 aapt 경로를 변경해야 합니다 (예: __AAPT_EXEC_PATH = "ninjadroid/aapt/aapt").
다음 명령어를 실행하면 모든 Python 종속성이 설치되고 (aapt, apktool, dex2jar에 실행 권한이 부여됨) ninjadroid 심볼릭 링크가 /usr/local/bin/에 추가됩니다.```shell
$ make build-linux
$ make install
$ ninjadroid --help
#### MacOS
다음 명령어를 실행하기만 하면 필요한 모든 Python 종속성이 설치되고 ( `aapt`, `apktool`, `dex2jar` 에 실행 권한이 부여되었는지 확인) `/usr/local/bin/`에 `ninjadroid` 심볼릭 링크가 추가됩니다.```shell
$ make build-macos
$ make install
$ ninjadroid --help
NinjaDroid를 Docker에서 실행하려면 Docker가 설치되어 있어야 합니다.
Docker 이미지를 빌드하려면 다음 명령어를 실행하세요:```shell
$ make build-docker
$ docker run --name ninjadroid ninjadroid:latest ninjadroid --help
대상 APK 패키지가 포함된 디렉토리를 Docker 이미지에 바인드해야 합니다:```shell
$ mkdir apks
$ cp /path/to/your/package.apk apks/package.apk
$ docker run --name ninjadroid -it --rm -v $(pwd)/apks:/apks ninjadroid:latest ninjadroid /apks/package.apk -aj
또한 -e/--extract 옵션을 사용할 때 출력 디렉터리에도 동일하게 적용되며, 해당 디렉터리에 대한 권한도 부여해야 합니다:```shell
$ mkdir output
$ chmod 777
$ docker run --name ninjadroid --rm -v $(pwd)/apks:/apks -v $(pwd)/output:/output ninjadroid:latest ninjadroid /apks/package.apk -ae /output
### Flatpak (실험적)
NinjaDroid를 Flatpak으로 실행하려면 `Flatpak`과 `flatpak-builder`가 설치되어 있어야 합니다.
다음 명령어를 실행하기만 하면 필요한 모든 Flatpak 종속성이 설치됩니다:```shell
$ make build-flatpak
$ flatpak-builder --run flatpak/build flatpak/com.github.rovellipaolo.NinjaDroid.yaml ninjadroid --help
참고: 현재 -e/--extract 옵션이 올바르게 작동하지 않습니다 (참조: https://github.com/rovellipaolo/NinjaDroid/issues/21).
Snap으로 NinjaDroid를 실행하려면 Snap과 snapcraft가 설치되어 있어야 합니다.
다음 명령어를 실행하면 필요한 모든 Snap 종속성이 설치됩니다:```shell
$ make build-snap
$ make install-snap
$ ninjadroid --help
**참고:** snap이 `--devmode` 옵션 없이 설치된 경우 `-e`/`--extract` 옵션이 제대로 작동하지 않습니다 (참조: https://github.com/rovellipaolo/NinjaDroid/issues/20).
## 테스트
구성한 후에는 ("_설치_" 섹션 참조), 다음과 같이 테스트와 checkstyle을 실행할 수도 있습니다.
### 네이티브
로컬 머신에서 실행하려면 다음 명령을 실행하세요:```shell
$ make test
$ make regression
$ make checkstyle
또한 다음 명령어를 실행하여 커버리지와 함께 테스트를 실행할 수 있습니다:```shell $ make test-coverage
그리고/또는 다음 명령어를 실행하여 모든 git 커밋 시 checkstyle이 자동으로 실행되도록 설정하십시오:```
$ make install-githooks
Docker에서 실행하려면 다음 명령을 실행하십시오:```shell $ make test-docker $ make regression-docker $ make checkstyle-docker
### Flatpak
Flatpak에서 회귀 테스트를 실행하려면 다음 명령을 실행하십시오:```shell
$ make regression-flatpak
Snap에서 회귀 테스트를 실행하려면 다음 명령을 실행하십시오:```shell $ make regression-snap
## 사용법
다음은 샘플 APK 패키지에 대해 NinjaDroid를 실행하는 예제입니다.