//////
Search
✍️

iOS FRIDA SCRIPT 기본 작성법

ObjC.available
현재 프로세스에 Objective-C 런타임이 로드되었는지 확인한다.
리턴값 : Boolean
if(ObjC.available){ //CODE// }
JavaScript
복사
ObjC.classes
현재 등록된 클래스에 대한 오브젝트 맵핑 클래스 이름을 반환
리턴값 : 배열
for(var classname in ObjC.classes) { console.log(classname); }
JavaScript
복사
Interceptor.attach(target, callbacks[, data])
호출을 가로챌 함수를 target 으로 지정한다. target 은 호출을 가로채고자 하는 함수의 주소를 저장한다.
callbacks 인수는 다음값을 하나 이상 포함하는 오브젝트가 들어간다.
onEnter: function(args)
인수를 읽거나 쓰는데 사용할 수 있는 하나의 인수 args가 제공callback 함수
onLeave: function(retval)
기존 return 값을 담고있는 인수 retval이 제공된 callback 함수
기존 return 값을 retval.replace(ptr(0x123)) 처럼 replace 함수를 사용하여 변경이 가능하다.
Interceptor.attach(Jailbreak_address,{ onEnter:function(args){ console.log(JSON.stringify(this.context)); this.context.x0 = 0x0; console.log(JSON.stringify(this.context)); } }) Interceptor.attach(hook.implementation,{ onLeave:function(retval){ console.log("[*] Return value: " + retval); var new_retval = ptr("0x0"); retval.replace(new_retval); console.log("[*] NEW Return value: " + retval); } })
JavaScript
복사
Module.findBaseAddress(name) / Module.getBaseAddress(name)
name 모듈의 base 주소를 반환한다.
만약 모듈을 찾을 수 없을 경우에는 다음과 같이 처리한다.
find-prefixed 함수null 을 반환한다.
get-prefixed 함수예외 를 발생한다.
var realBase = Module.findBaseAddress('DVIA-v2'); console.log(realBase);
JavaScript
복사
ptr(s)
메모리 주소를 10진수 또는 접두사가 0x 인 16진수를 작성한 문자열 s 를 새로운 NativePointer로 생성한다.
var new_retval = ptr("0x0"); retval.replace(new_retval);
JavaScript
복사
객체 속성
$methods
주어진 객체의 클래스와 부모클래스에 의해 노출된 기본 메소드 이름을 포함하는 배열
간단히 말해, 설정된 클래스의 메소드와 부모클래스의 메소드까지 모두 출력
var classname = "JailbreakDetection"; var methods = ObjC.classes[classname].$methods; console.log(methods); --------------------------- + isJailbroken,+ SFSQLiteClassName,+ replacementObjectForPortCoder:,+ cancelPreviousPerformRequestsWithTarget:selector:object:, + cancelPreviousPerformRequestsWithTarget:,+ implementsSelector:,+ instancesImplementSelector:,+ load,+ setVersion:,+ version, + classForKeyedUnarchiver,+ classFallbacksForKeyedArchiver, ... - _isDeallocating,- allowsWeakReference,- forwardingTargetForSelector:,- forwardInvocation:,- _tryRetain, - retainWeakReference,- isFault,- finalize
JavaScript
복사
$ownMethods
부모 클래스를 포함하지 않고, 주어진 객체의 클래스에 의해 노출된 기본 메소드 이름을 포함하는 배열
간단히 말해, 설정된 클래스의 메소드만(부모클래스 X) 모두 출력
var classname = "JailbreakDetection"; var methods = ObjC.classes[classname].$methods; console.log(methods); --------------------------- + isJailbroken
JavaScript
복사
context
할당한 레지스터들의 값을 확인할 수 있다.
64비트 환경 - X0 ~ X30 으로 표현 32비트 환경 - W0 ~ W30 으로 표현 이름만 다를뿐 일반적인 경우에는 큰 차이는 없다.
Interceptor.attach(Jailbreak_address,{ onEnter:function(args){ // 현재 올라와있는 메모리(Jailbreak_address)에서 할당된 레지스터의 값을 확인 console.log(JSON.stringify(this.context)); // {"pc":"0x100a4fdd0","sp":"0x16f579660","x0":"0x1","x1":"0x102d8ead0","x2":"0x8","x3":"0x1818dc320","x4":"0x402","x5":"0x16f578720","x6":"0x1","x7":"0x2","x8":"0x1", // "x9":"0x100a4fdac","x10":"0x1","x11":"0x1","x12":"0x103096810","x13":"0x5a100cc8a5d","x14":"0x80b063de1e80e240","x15":"0x1b8","x16":"0x108310000", // "x17":"0x1083b82b0","x18":"0x0","x19":"0x1c410d0b0","x20":"0x100cd01c8","x21":"0x100bbe3a5","x22":"0x102d8ead0","x23":"0x102d8ead0","x24":"0x1c401dd80", // "x25":"0x0","x26":"0x18bf3aefe","x27":"0x1","x28":"0x1c0250890","fp":"0x16f5799d0","lr":"0x100a16c98"} // 레지스터 변조 this.context.x0 = 0x0; } })
JavaScript
복사