소켓으로 통신하는 앱의 경우, 어떻게 통신을 확인해야 할지 몰라서 이참에 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

+ Recent posts