iphone - How can I get SEL (@selector()) from object file (Mach-o)? how SEL stored in Mach-o? -
from objc sources can see sel defined typedef struct objc_selector *sel;
i have disassembly dylib idaq, , did finde call of _mshookmessageex function, linked libsubstrate.dylib
_mshookmessageex has following signature
void mshookmessageex(class class, sel selector, imp replacement, imp *result); so can assume in source code there @selector(somemethod:) second parameter
in data section of object file can see cfstrings used in source code

but there not selector string here, can see @selector() not converted static cfstring
i interested find string representations of selector , class passed _mshookmessageex function.
how can sel (@selector()) object file (mach-o)? how sel stored in mach-o?
thank you!
update:
i did finde there strings in ida method representation before calling methods

i guess there selectors passed in functions. right?
selector names stored in __objc_methname section of __text segment:
:; otool -v -s __text __objc_methname /system/library/frameworks/appkit.framework/appkit | head /system/library/frameworks/appkit.framework/appkit: contents of (__text,__objc_methname) section 0x000000000097cbd8 count 0x000000000097cbde countbyenumeratingwithstate:objects:count: 0x000000000097cc09 alloc 0x000000000097cc0f initwithobjects:count: 0x000000000097cc26 release 0x000000000097cc2e autorelease 0x000000000097cc3a copy 0x000000000097cc3f timeintervalsincenow pointers selectors stored in __objc_selrefs section of __data segment:
:; otool -v -s __data __objc_selrefs /system/library/frameworks/appkit.framework/appkit | head /system/library/frameworks/appkit.framework/appkit: contents of (__data,__objc_selrefs) section 0x0000000000d77d80 __text:__objc_methname:initwithobjects:count: 0x0000000000d77d88 __text:__objc_methname:copy 0x0000000000d77d90 __text:__objc_methname:timeintervalsincenow 0x0000000000d77d98 __text:__objc_methname:sharedappleeventmanager 0x0000000000d77da0 __text:__objc_methname:_preparefordispatch 0x0000000000d77da8 __text:__objc_methname:_setlaunchtaskmaskbits: 0x0000000000d77db0 __text:__objc_methname:_disablesuddentermination 0x0000000000d77db8 __text:__objc_methname:_appleeventactivationinprogress a sel in source code (currently) pointer c string name of selector. if write this:
sel s = @selector(initwithobjects:count:); then s char const *, , points string initwithobjects:count:. until recently, print selector name doing this:
nslog(@"selector %s", (char *)s); however, apple changed compiler (as of xcode 4.6 believe) disallow casting sel char *, may change selector implementation in future.
anyway, tricky part machine code loads pointer __objc_selrefs section using pc-relative addressing. pc “program counter”, address of currently-executing instruction. on x86 architectures it's called ip (instruction pointer) or eip (extended ip).
that's what's going on in relevant instructions of disassembly:
1444 ldr r1, =(off_2038 - 0x145c) ... 1454 ldr r1, (pc,r1) the pointer selector loaded word @ address 0x2038. constant 0x2038 doesn't appear in machine code. disassembler has helpfully computed you, analyzing data flow of program. constant stored in first ldr instruction 0xbdc, because 0xbdc + 0x145c = 0x2038.
you might wonder why it's using 0x145c when second ldr instruction @ address 0x1454. when arm processor computes address using pc-relative addressing, value of pc address of executing instruction plus 4 or plus 8 (depending on processor mode). this documented here (and other places).
Comments
Post a Comment