frida-trace

함수 호출을 동적으로 추적하기 위한 툴이다.
#Safari 앱의 recv*와 send* API를 추적하고, 로깅에 라이브러리 이름을 추가한다. $ frida-trace --decorate -i "recv*" -i "sand*" Safari #Safari 앱의 ObjC method 호출 추적 $ frida-trace -m "-[NSView drawRect:]" Safari #iPhone에 SnapShat 열고 cypto API 호출 추적 frida-trace -U -f com.toyopagroup.picaboo -I "libcommonCrypto*" #"msvcrt.dll"에 있는 *open*을 제외한 모든 "*open*"과 매칭되는 함수를 추적 $ frida-trace -p 1372 -i "*open*" -x "msvcrt.dll!*open*" #libjpeg.so에 있는 unexported function 추적 $ frida-trace -p 1372 -a "libjpeg.so!0x4793c"
 

모든 옵션 리스트

--version show program's version number and exit -h, --help show this help message and exit -D ID, --device=ID connect to device with the given ID -U, --usb connect to USB device -R, --remote connect to remote frida-server -H HOST, --host=HOST connect to remote frida-server on HOST -f FILE, --file=FILE spawn FILE -F, --attach-frontmost attach to frontmost application -n NAME, --attach-name=NAME attach to NAME -p PID, --attach-pid=PID attach to PID --stdio=inherit|pipe stdio behavior when spawning (defaults to “inherit”) --runtime=duk|v8 script runtime to use --debug enable the Node.js compatible script debugger --squelch-crash if enabled, will not dump crash report to console -O FILE, --options-file=FILE text file containing additional command line options -I MODULE, --include-module=MODULE include MODULE -X MODULE, --exclude-module=MODULE exclude MODULE -i FUNCTION, --include=FUNCTION include FUNCTION -x FUNCTION, --exclude=FUNCTION exclude FUNCTION -a MODULE!OFFSET, --add=MODULE!OFFSET add MODULE!OFFSET -T, --include-imports include program's imports -t MODULE, --include-module-imports=MODULE include MODULE imports -m OBJC_METHOD, --include-objc-method=OBJC_METHOD include OBJC_METHOD -M OBJC_METHOD, --exclude-objc-method=OBJC_METHOD exclude OBJC_METHOD -j JAVA_METHOD, --include-java-method=JAVA_METHOD include JAVA_METHOD -J JAVA_METHOD, --exclude-java-method=JAVA_METHOD exclude JAVA_METHOD -s DEBUG_SYMBOL, --include-debug-symbol=DEBUG_SYMBOL include DEBUG_SYMBOL -q, --quiet do not format output messages -d, --decorate add module name to generated onEnter log statement -S PATH, --init-session=PATH path to JavaScript file used to initialize the session -P PARAMETERS_JSON, --parameters=PARAMETERS_JSON parameters as JSON, exposed as a global named 'parameters' -o OUTPUT, --output=OUTPUT dump messages to file
 

-U, -usb : connect to USB device

호스트 머신과 USB연결된 원격의 디바이스를 추적
주의 : 연결하고자 하는 원격 디바이스에 플랫폼에 맞는 frida-server binary를 설치하고 run 상태로 둬야함.
 

-I, -X : include/exclude module

특정 모듈의 모든 함수를 include, exclude 할 지 옵션 하나로 설정할 수 있다.
glob 하여 매칭되는 하나 이상의 모든 모듈에 적용된다.
frida-race는 -I 옵션과 일치하는 각 함수에 대해 JavaScript 핸들러 파일을 생성한다.
 

-i, -x : include/exclude function (glob-based)

이번에는 모듈이 아니라, 추적하고자 하는 특정 함수들을 명시할 때 사용하는 옵션이다.
frida-race는 -i 옵션과 일치하는 각 함수에 대해 JavaScript 핸들러 파일을 생성한다.
 
-i / -x 옵션은 다음 형식 중 하나를 수용한다는 점에서 대문자옵션(-I, -X)과 구문론적으로 다르다.
-i "msvcrt.dll!*cpy*" msvcrt.dll에 있는 것 중 cpy가 포함된 모든 함수 추적 -i "*free*" 모든 모듈에서 free를 포함하는 모든 함수를 추적 -i "!*free*" -i "*free*"와 동일하다 -i "gdi32.dll!" gdi32.dll의 모든 함수를 추적
 

-i,-x,-I,-X 옵션 시 주의점

  • 명령어 순서대로 처리된다는 점에 주의.
예를 들어 모든 "str*" 함수와 "mem*" 함수를 처리하되, msvcrt.dll 모듈에서의 함수들은 제외시키고 싶은 경우. (해당 함수들은 총 3개의 모듈에서 존재한다. ucrtbase.dll, ntdll.dll, msvcrt.cll) 1. -i "str*" -i "mem*" -X "msvcrt.dll" 모든 str 함수 포함 ==> 3개의 모듈에서 찾음 ==> 총 80개 모든 mem 함수 포함 ==> 3개의 모듈에서 찾음 ==> 총 18개 msvcrt.dll에서의 결과는 삭제함 ==> str은 28개, mem은 8개 제외됨 ==> 최종 엔트리 개수는 64개 2. -i "*str*" -X "msvcrt.dll" -i "mem*" 모든 str 함수 포함 ==> 3개의 모듈에서 찾음 ==> 총 80개 msvcrt.dll에서의 결과는 삭제함 ==> str은 28개 제외되어 총 52개 엔트리만 남은 상태 모든 mem 함수 포함 ==> 3개의 모듈에서 찾음 ==> 총 18개 ==> 최종 엔트리 개수는 70개 3. -X "msvcrt.dll" -i "str*" -i "mem*" msvcrt.dll에서의 결과를 삭제하려고 시도는 하지만, 현재 엔트리에 아무것도 없으므로 아무일도 안일어남. 모든 str 함수 포함 ==> 3개의 모듈에서 찾음 ==> 총 80개 모든 mem 함수 포함 ==> 3개의 모듈에서 찾음 ==> 총 18개 ==> 최종 엔트리 개수는 98개
 

-a : include function (offset-based)

모듈로부터 이름이 exported 되지 않은 함수 추적을 가능하게 하는 옵션이다. (static C/C++ 함수 등)
#<모듈이름>!<함수의 entrypoint 주소> $ frida-trace -a "libjpeg.so!0x4793c"
frida-trace는 -a옵션에 매칭되는 함수에 대한 JavaScript 핸들러를 생성한다.
 

-d, -decorate: add module name to log tracing

—decorate 옵션은 로깅 시 함수명 뒤에 어떤 모듈인지까지 적어주는 옵션이다.
 
—decorate 옵션을 적용하지 않으면 기본적으로는 아래와 같다.
onEnter: function (log, args, state) { log('memcpy()'); },
이런 경우, 여러 모듈에 동일한 기능명이 존재할 경우 기능 트레이스를 구분하기 어렵다는 단점이 있다.
이 때, --decorate 옵션은 frida-trrace에 기본 추적 명령의 모듈 이름까지 삽입하도록 지시한다.
 
onEnter: function (log, args, state) { log('memcpy() [msvcrt.dll]'); },