Не подскажет ли кто нибудь нотации вызовов для _objc_msgSend. Я так понимаю что в R1 должен быть метод. В каких регистрах должно быть остальное? Был бы очень признателен если бы ткнули меня в более продвинутый инструмент для разбора ARM. вот пример : __text:00001AF8 LDR R5, =unk_E518 __text:00001AFC LDR R1, [PC,R5] ; "text" __text:00001B00 LDR R0, [R4,#0x5C] __text:00001B04 BL _objc_msgSend __text:00001B08 CMP R0, #0 __text:00001B0C BEQ loc_1B38 __text:00001B10 LDR R5, =unk_E500 __text:00001B14 LDR R1, [PC,R5] ; "text" __text:00001B18 LDR R0, [R4,#0x5C] __text:00001B1C BL _objc_msgSend __text:00001B20 LDR R5, =unk_E4F4 __text:00001B24 LDR R1, [PC,R5] ; "copy" __text:00001B28 BL _objc_msgSend __text:00001B2C STR R0, [R4,#0x58] __text:00001B30 MOV R5, #0 __text:00001B34 STR R5, [R4,#0x5C]
Прототип такой: id objc_msgSend(id self, SEL op, ...); В EABI (стандартный ABI для арма) первых четыре параметра - в R0-R3, остальное через стек. Почитай еще вот это http://xtin.activebb.net/forum-f2/tema-t49.htm Там про x86, но принцип тот же.
Большое спасибо. попутно еще вопрос __text:00002728 08 38 9F E5 LDR R3, =unk_D908 __text:0000272C 03 B0 9F E7 LDR R11, [PC,R3] ; "setBodyText:" __text:00002730 50 00 9D E5 LDR R0, [SP,#0x9C+var_4C] __text:00002734 CD 0D 00 EB BL _objc_msgSend D908 + 2730 = 10038 смотрим туда там LocalizedStringForKey:value:table: но IDA подставляет setBodyText: message_refs:00010038 B0 58 00 00 off_10038 DCD aLocalizedstrin ; DATA XREF: sub_1A2C+1B0o __message_refs:00010038 ; sub_1DF0+80o ... __message_refs:00010038 ; "localizedStringForKey:value:table:" __message_refs:0001003C 80 5A 00 00 off_1003C DCD aSetbodytext ; DATA XREF: sub_1A2C+21Co __message_refs:0001003C ; sub_218C+5A0o ... __message_refs:0001003C ; "setBodyText:" Глюки IDA или я торможу ?
http://www.keil.com/support/man/docs/armasm/armasm_cegibccg.htm#Babbdajb Таким образом, значение PC для инструкции по адресу 272C равняется 2734, а не 2730.
Хм. Очень странное поведение для процессора, что программный счетчик обгоняет на 8 байт текущую позицию. может связанно с упреждающими выборками. Но все равно спасибо . Приму к сведению.
Думаю, это связано с реализацией возврата из подпрограммы в "древних" версиях ARM, пока не ввели команду BLX. Например: ; вызов функции MOV LR,PC MOV PC,R12 ; продолжение .... ; возврат из функции MOV PC,LR