0) 실습준비
•
SmartAppL03.apk 설치
•
Hooking을 활용하여 키 값을 콘솔에 띄울 예정이다
1) 정적분석 시작 (jasx-gui)
•
4개의 class 중에 메인으로 보이는 class 를 분석한다
addListenerOnButton() 메소드에서 "남은계단" 과 "현재위치" 의 value를 설정해주는 듯 한 코드를 발견
•
aView : 남은계단 (랜덤 값 생성 수 setText() 메소드로 value 설정)
•
bView : 현재위치 (setText() 메소드dml 인자로 "0"을 사용해 초기 value(0) 설정)
그 이후 stairs, myStairs 변수를 선언하여 각각 a.View, b.View의 값으로 초기화 해주는 것을 볼 수 있다 <br>
변수의 이름과 코드의 구성을 보았을 때, 각각의 변수가 "남은계단"과 "현재위치"를
의미한다는 것이 거의 확실하다
해당 메소드 아래에 비교문을 발견
남은계단 -1 != 현재위치 일 경우 현재위치 값을 +1 해주는 것을 확인할 수 있다<br>
그 아래에 복호화 코드도 확인했지만 해당 코드가 실행되기 위해선 <span style="color: red">if 문 조건을 만족하지 않아야 한다</span>
그러나 if 문 조건을 만족하지 않기 위해서 랜덤으로 설정된 "남은계단" value 만큼 클릭을 할 수는 없다
onClick() 메소드가 실행될 때 복호화 코드가 바로 실행될 수 있도록 해당 부분을 Hooking 한다
2) Hooking 용 .py 파일 작성
•
onClick() 메소드가 실행되었을 때, 복호화 코드가 실행될 수 있도록 파이썬 파일 작성
import frida, sys
jscode = """
setImmediate(function() {
Java.perform(function() {
console.log("[*] Hooking start()");
var onclick_hooking = Java.use("com.namdaehyeon.findkey3.MainActivity$1");
onclick_hooking.onClick.implementation = function() {
var security_hooking = Java.use("com.namdaehyeon.findkey3.Security");
var decrypt = security_hooking.$new()
console.log(decrypt.DecryptStr("2736f6055dbad2d42f6d5b0135395cb29e0d0
86b67e1fa266a0a0d277f151e5b00000000000000000000"));
}
})
});
"""
process = frida.get_usb_device(1).attach("FindKey3")
print(process)
script = process.create_script(jscode)
script.load()
sys.stdin.read()
Python
복사
•
Security 클래스의 DecryptStr() 메소드를 실행할 수 있도록 객체를 생성해주었다
◦
security_hooking 에 Security 클래스 사용 선언
◦
security_hooking.$new() 을 사용하여 객체생성
•
console.log()를 사용하여 키 값을 콘솔에 출력할 예정이다
3) Hooking 실행
•
Findkey3 실행 후 Hooking 용 파이썬 파일 실행
키 값이 콘솔에 정상적으로 출력되는 것을 확인할 수 있었다