[AOS] How to turn a split APK into a normal non-split APK

koo00·2022년 11월 28일
0

I. Intro

요즘 나오는 앱들은 AAB(Android App Bundle) 형태로 배포된다.
구글 정책 때문이긴 한데 AAB 형태로 배포할 경우 앱 크기를 줄일 수 있는 장점이 있다.

기존 APK 형태로 배포된 앱은 base.apk 안에 라이브러리 파일이나 설정 파일들이 전부 짬뽕으로 들어가 있지만 AAB 형태로 배포된 앱은 base.apk 과 더불어 splits, lib 폴더 안에 나뉘어져있다.

이러한 앱은 adb install-multiple base.apk split_config.arm64_v8a.apk 와 같은 명령어로 설치가 가능한데, 보통 MOD는 하나의 설치 파일로 존재한다. (핵쟁이들의 앱 변조 및 배포의 편의성 때문이 아닐까..??)

실제 핵툴 사이트에서 분할된 APK를 다시 하나의 APK로 합치는 방법을 알려주고 있는데 이번 포스팅에서 따라해볼 예정이다.


우선 분할된 APK 파일은 두 가지 형태로 존재한다.

  • base APK + config.architecture APK
  • base APK + config.architecture APK + config.mdpi APK + config.random APK

그럼 합치기 쉬운 것부터 레스기릿 해보자.


II. 2 split APK (base APK + config.architecture APK)


1. 먼저 base.apk 파일을 디컴파일한다.

> java -jar apktool.jar d base.apk -o base

2. lib 폴더가 있는 split_config.arm64_v8a.apk 파일을 가져와서 압축을 풀고 base 폴더에 lib 폴더를 넣어준다.

3. base 폴더에 있는 AndroidManifest.xml 파일에서 android:isSplitRequired="true" 부분을 찾아 해당 옵션을 삭제해준다.

<application ... android:isSplitRequired="true" ...>    

4. 다시 리패키징 해준다.

> java -jar apktool.jar b base -o non_split.apk

5. 기호에 맞게 재서명하고 설치하면 된다.

> zipalign -p -f -v 4 non_split.apk non_split_aligned.apk
> apksigner sign --ks KEYSTORE --ks-pass pass:PASSWORD non_split_aligned.apk
> apk install non_split_aligned.apk


III. 4 or more split APK (base APK + config.arch APK + config.mdpi APK + config.random APK)


1. 분할된 APK 파일을 모두 디컴파일한다.

> java -jar apktool.jar d base.apk
> java -jar apktool.jar d split_config.arm64_v8a.apk
> java -jar apktool.jar d split_config.ko.apk
> java -jar apktool.jar d split_config.xxhdpi.apk

2. split_config 폴더에 있는 lib 또는 res 폴더를 base 폴더에 넣어준다. 이때 기존에 존재하는 파일이 있을 경우 덮어쓰기하지 않는다.

3. base 폴더에 있는 AndroidManifest.xml 파일에서 android:isSplitRequired="true" 부분을 찾아 해당 옵션을 삭제해준다.

<application ... android:isSplitRequired="true" ...>    

4. base 폴더에 있는 apktool.yml 파일에서 doNotCompress 태그를 찾아 아까 넣은 폴더 이름을 모두 추가해준다. 일부 게임에서는 해당 과정을 생략해도 된다고 한다.

doNotCompress:
...
- res/values
- res/values-ko
- drawable-anydpi
- drawable-hdpi
- drawable-ldrtl-xxhdpi
- drawable-sw600dp-xhdpi
- drawable-xhdpi
- drawable-xxhdpi
- values-hdpi

5. 리패키징 해준다.

> java -jar apktool.jar b base -o non_split.apk

5-1. 이때 apktool 에러가 발생한다면 먼저 AndroidManifest.xml 파일에서 android:localeConfig="@xml/locales_config" 부분을 찾아 해당 옵션을 삭제해준다.

<application ... android:localeConfig="@xml/locales_config" ...>

5-2. 다음 res/xml/locales_config.xml 파일을 삭제한다.

5-3. 마지막으로 res/values/public.xml 파일에서 <public type="xml" name="locales_config" id="0xXXXXXXXX" /> 부분을 찾아 해당 부분을 삭제해준다.

<resouces>
	...
	<public type="xml" name="locales_config" id="0x7f170010" />
	...
</resouces>

6. 리패키징이 정상적으로 되었다면 재서명 후 설치하면 된다.

> apksigner sign --ks KEYSTORE --ks-pass pass:PASSWORD non_split_aligned.apk
> apk install non_split_aligned.apk

IV. Conclusion

물론 설치는 되겠지만 실행되지 않을 가능성이 굉장히 높다. 보통 앱에서 위변조 검증을 하는데 리패키징 하면서 무결성이 깨지기 때문이다.

위 방법으로 리패키징 빌드 하나 만들어서 안티 디버깅과 무결성 검증 로직을 분석하고 우회하고 있는데 상당히 빡빡하다...

그래도 좋은 날 오겠지? 열심히 하자..


Reference

https://platinmods.com/threads/how-to-turn-a-split-apk-into-a-normal-non-split-apk.76683/
https://lightrun.com/answers/ibotpeaches-apktool-bug-androidlocaleconfig-in-manifest

profile
JFDI !

0개의 댓글