소켓으로 통신하는 앱의 경우, 어떻게 통신을 확인해야 할지 몰라서 이참에 Frida 코드를 작성해봤습니다.
일단 소켓의 경우 통신하는 IP/PORT를 확인해야 하므로 frida-trace를 이용해서 해당 어떤 함수를 후킹해야 하는지 확인해 보도록 하겠습니다.
frida-trace -U -i socket "[APP_NAME]"을 통해 생성되는 js파일에 이전 호출한 클래스 및 메소드를 확인하는 코드를 작성하여 어떤 클래스를 호출하는지 확인합니다.
※코드는 다음 포스트에 있는 코드를 사용했습니다.
https://taesun1114.tistory.com/entry/Android에서-호출한-ClassMethod-확인하기-with-Frida?category=729990
확인결과, java.net.Socket를 후킹하여 IP/PORT를 확인하면 될듯 합니다.
https://developer.android.com/reference/java/net/Socket에서 확인한 socket함수입니다.
예시로 사용한 앱은 다음과 같습니다. 별거 없이 버튼클릭하면 소켓을 발송하는 코드입니다.
후킹할 Frida code는 다음과 같습니다.
import sys
import frida
def on_message(message,data):
print "[%s] -> %s" % (message, data)
PACKAGE_NAME = sys.argv[1]
jscode = """
Java.perform(function(){
var sock = Java.use('java.net.Socket');
console.log("Try to Hooking socket...");
sock.$init.overload('java.lang.String','int').implementation = function(a,b){
console.log(a.toString()+ " : " +b);
};
});
"""
try:
device = frida.get_usb_device()
pid = device.spawn([PACKAGE_NAME])
print("App is starting ... pid : {}".format(pid))
process = device.attach(pid)
device.resume(pid)
script = process.create_script(jscode)
script.on('message',on_message)
print('[*] Running Frida')
script.load()
sys.stdin.read()
except Exception as e:
print(e)
후킹 시, IP / PORT를 정상적으로 출력하는 것을 확인할 수 있습니다.
확인하기까지 상당히 어려웠는데.. 포스팅하다보니 별거 없네요...
$init을 써주는 부분에서 삽질을 많이 했네요
추가로, send 및 recv함수에 frida-trace를 이용해서 hexdump함수를 이용해서 통신내용을 확인할 수 있습니다.
'Mobile' 카테고리의 다른 글
Cydia 에러(Could not connect to the server) (0) | 2019.02.25 |
---|---|
Android Method Trace(With.Frida) (2) | 2019.01.29 |
apktool first type is not attr (0) | 2018.10.04 |
Android Proxy Burp 인증서 설치 (2) | 2018.09.15 |
Uncrackable3-1 (2) | 2018.06.14 |