PmsHook 해봅시다
안드로이드 게임 모드앱 까보면 pmshook(PackageManagerService Hook) 을 많이들 사용하고 있더군요.(간단한 서명값 변조 탐지 우회 용도)
모드앱 실행하고 로그 살펴보면 "PmsHook success" 라는 로그를 심심치 않게 볼 수 있습니다.
그 출처가 ApkSignatureKiller(https://github.com/L-JINBIN/ApkSignatureKiller/tree/master) 라는 곳인데, 무려 6년전 소스코드입니다.
깃헙에 쓰여 있는데로, pmshook 하고 싶은 원본 apk 파일을 해당 프로젝트의 루트 디렉터리에 src.apk 라는 이름으로 옮겨놓고, "NKillSignatureTool.java"를 Run 하면은 열에 아홉은 에러를 뿜어냅니다.
작동하게 하려면 꽤나 많은 부분에서 수정이 필요합니다. 어찌저찌 뜯어고쳐서 작동하게 하고 살펴봤더니, 수동으로도 작업이 가능한 변조과정이었습니다. 단지 귀찮을뿐...
안드로이드 스튜디오에서 아무 프로젝트 하나 만들어주고, "ApkSignatureKiller/hook/cc/binmt/signature/PmsHookApplication.java" 소스코드를 복붙합니다.
pmshook을 하고 싶은 원본 apk의 base64 서명값을 알아내야 합니다.
직접 제작한 서명값 추출하는 jar 파일 첨부합니다.(jdk 14 버전 이하에서 사용)
사용법: java -jar GetApkSignature.jar [-b] <apk-path>
얻어낸 base64 서명값을 "### Signatures Data ###" 에 붙여넣습니다. 그리고 apk 빌드해줍니다.
원본앱 디컴파일 해주고, 빌드한 pmshook 도 디컴파일 해줍니다.
그리고 원본앱의 AndroidManifest.xml 파일 수정이 필요합니다.
<application> 태그의 "android:name" 속성을 우리가 제작한 PmsHook 클래스로 변경해줍니다. 단, 원래 속성도 기억해놔야 합니다.
바꾸기 전 원래 android:name 이 "com.original.test" 라고 해봅시다.
PmsHook.smali 파일로 들어가서 모든 "android/app/Application" 을 "com/original/test" 로 변경해줍니다.
이제 PmsHook.smali가 포함된 디렉터리를 디컴파일한 원본앱의 적당한 위치로 옮겨줍니다.
리패키징, 사이닝, 설치하고 로그에 "PmsHook success" 가 찍히면 성공입니다.
That's it!
과정이 길었는데요, pmshook 에서 눈여겨볼만한 부분은 원본앱의 smali 파일을 건드리지 않고, AndroidManifest.xml 파일에서 최초 인스턴스화 되는 클래스 이름(application 태그의 android:name 속성값) 을 변경해서 변조했다는 점입니다.
보통의 방법인 원본앱 smali 파일의 onCreate 메서드에 다른 클래스를 호출하는 코드를 삽입해서 변조하는 것과 대비됩니다.
음...응용 가능성이 많아 보이네요.