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
복사