분석 대상 앱 설치
•
SmartAppL02.apk
사용한 툴
•
jadx-1.4.2
1) 어플 실행
•
어플을 NOX에 설치하여 실행해본다
바로 실패..
jadx를 사용하여 분석해본다
APK signature에서 서명 검증이 실패하고 있는 것을 확인
이전 실습에서 진행했던 방법으로 서명을 진행해준다
2) 타켓 어플 서명
java -jar uber-apk-signer-1.3.0.jar --apks SmartAppL02.apk
Shell
복사
•
서명 완료된 apk 파일을 설치하면 설치가 완료되며 어플을 열어볼 수 있다
•
어플 내용을 확인하니 FIndKey 라는 메세지를 확인할 수 있었다
3) 분석 시작
•
FindKey 라고 했으니 키를 찾아보자
•
jadx를 이용하여 디컴파일 후 원본 소스코드를 확인하여 어디서 키를 설정하고 있는지 확인한다
•
소스코드 확인 결과
◦
makeDate()와 Volume() 함수를 사용하여 키를 생성하고 있다
◦
onCreate()에서 makeDate()의 결과 값과 Volume()의 결과 값이 <span style="color: red">특정 조건을 만족할 때</span> this.aView.setText(keyString())가 실행됨을 확인할 수 있다
•
필요한 조건
◦
makeDate : "2013-11-02-12:35:03"
◦
Volum : 53
4) smali 코드와 비교 확인
•
Split view를 사용하여 해당 비교문에서 어떤 smali 코드를 사용하고 있는지 확인한다
•
line 29, line 30 부분에서 java 코드가 smali로 번역되어 있는 것을 확인할 수 있다
해당 부분을 자세히 보면
if-ne v0, v1 구문으로 비교문이 구현 되어있다
•
if-ne는 레지스터 v0과 v1에 저장된 값이 같지 않을 경우 (ne : not equal) :cond_2d 라벨로 분기하는 명령어이다
cond_2d 라벨 확인
•
해당 라벨을 확인해보니 return-void가 되고 있음을 알 수 있다
•
즉, 해당 라벨로 점프하면 아무것도 실행되지 않는다 (조건을 만족해야한다) 는 것
5) smali 코드 수정
•
vs 코드로 jadx로 찾은 부분의 폴더를 여러 수정을 진행한다
•
점프를 해버리면 return-void가 되버리기 때문에 점프를 하면 안 된다.
v0과 v1를 비교하지 않고 v1과 v1를 비교해버리면 항상 참으로 점프를 하지 않게 될 것이다
6) 결과 확인
•
위와 같이 수정 후 저장
•
리빌딩, 서명을 진행 한 후 NOX에 어플을 다시 설치하여 실행해본다
•
새 파일은 SmartAppL03.apk 으로 만들 예정
apktool.bat b SmartAppL02 -o SmartAppL03.apk
java -jar uber-apk-signer-1.3.0.jar --apks SmartAppL03.apk
Shell
복사
•
최종 키 값을 확인할 수 있었다!