已知有一个类方法,用hook OC方法的写法,能hook到,现在已经能正常断到这个新写的函数里边,下边是我的写法
void newFakeMethod2( id self , SEL _cmd ){
orgFakeMethod2( self , _cmd );
}
然后看下边ida下的汇编,这里原函数里边的汇编代码,x20最开始是self,
ADRP X8, #0x2DBB000
LDR X8, [X8,#0xF70]
LDR X20, [X20,X8]
这是swift源码,这里边的self.textInputNode应该算是这个类的全局变量了。上边汇编代码最后一行就是获取的这个值。
@objc func sendButtonPressed() {
if let textInputNode = self.textInputNode, let presentationInterfaceState = self.presentationInterfaceState, let editMessage = presentationInterfaceState.interfaceState.editMessage, let inputTextMaxLength = editMessage.inputTextMaxLength {
let textCount = Int32(textInputNode.textView.text.count)
let remainingCount = inputTextMaxLength - textCount
if remainingCount < 0 {
textInputNode.layer.addShakeAnimation()
self.hapticFeedback.error()
return
}
}
self.sendMessage()
}
提问:我hook的那段代码,怎么才能获取self.textInputNode的值,毕竟是swift类,结构我断下来看了,跟OC有些差别,用id tmp = [self valueForKey:@“textInputNode”]; 根本获取不到,提示未定义。
最终的解决方案可能采用地址运算的方式。在第二行汇编代码下了断点,最后x8里边存储的是0x480,用self的地址加到0x480就是我需要的类属性的地址了,可不知道地址能不能转成类去操作。