问题是这样的,我最近对计算器进行了逆向,发现:
CalcValueView - (void)setDisplayValue:(id) userEntered:(char)
这个函数是设置显示值的,以下是IDA对这个函数的反汇编代码:
; CalcValueView - (void)setDisplayValue:(id) userEntered:(char)
; Attributes: bp-based frame
; void __cdecl -[CalcValueView setDisplayValue:userEntered:](struct CalcValueView *self, SEL, id, char)
__CalcValueView_setDisplayValue_userEntered__
PUSH {R4,R5,R7,LR}
MOV R5, R0
MOV R0, #(selRef_copy - 0x10F82)
ADD R7, SP, #8
ADD R0, PC ; selRef_copy
MOV R4, R3
LDR R1, [R0] ; "copy"
MOV R0, R2
BLX _objc_msgSend
MOV R1, #(_OBJC_IVAR_$_CalcValueView._stringValue - 0x10F96) ; NSString *_stringValue;
ADD R1, PC ; NSString *_stringValue;
LDR R2, [R1] ; NSString *_stringValue;
LDR R1, [R5,R2]
STR R0, [R5,R2]
MOV R0, R1
BLX _objc_release
MOV R0, #(_OBJC_IVAR_$_CalcValueView._stringIsUserEntered - 0x10FB0) ; char _stringIsUserEntered;
MOVW R1, #(:lower16:(selRef__updateValue - 0x10FB6))
ADD R0, PC ; char _stringIsUserEntered;
MOVT.W R1, #(:upper16:(selRef__updateValue - 0x10FB6))
ADD R1, PC ; selRef__updateValue
LDR R0, [R0] ; char _stringIsUserEntered;
LDR R1, [R1] ; "_updateValue"
STRB R4, [R5,R0]
MOV R0, R5
POP.W {R4,R5,R7,LR}
B.W j__objc_msgSend
; End of function -[CalcValueView setDisplayValue:userEntered:]
同时发现,第一个参数实际上是一个NSString,在cycript中使用用这样的脚本:
cy# choose(CalcValueView)
[#"<CalcValueView: 0x1667ca80; frame = (15 20; 290 88); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1667cc80>>"]
cy# a = [[NSString alloc] initWithFormat:@"1"]
@"1"
cy# [#0x1667ca80 setDisplayValue: a userEntered: 0]
达到了预期改变显示值的效果,也就验证了之前的推测。后面我写了一段这样的Tweak:
%hook CalcValueView
- (void) setDisplayValue:(id) arg1 userEntered:(BOOL) arg2
{
// NSString *newString = [[NSString alloc] initWithFormat:@"12345"];
// %orig(newString, arg2);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Call me BOSS Z" message:nil delegate:self cancelButtonTitle:@"BOSS Z" otherButtonTitles:nil];
[alert show];
[alert release];
}
%end
却发现并没有吧程序挂住,没有任何效果。
这里arg2之所以是BOOL,是因为在class-dump中的头文件是这样写的。
- (void)setDisplayValue:(id)arg1 userEntered:(BOOL)arg2;
我觉得这个函数应该比较长了吧,不至于hook不上吧?所以不知道是怎么回事orz,拜托各位帮我找找问题,麻烦大家了,谢谢~