ÍÆ¼öÐò
±¾ÎĽéÉÜÁ˻ָ´·ûºÅ±íµÄ¼¼ÇÉ£¬²¢ÇÒÀûÓøü¼ÇÉʵÏÖÁËÔÚ Xcode ÖжÔÄ¿±ê³ÌÐòÏ·ûºÅ¶Ïµãµ÷ÊÔ£¬¸Ã¼¼ÇÉ¿ÉÒÔÏÔÖøµØ¼õÉÙÄæÏò·ÖÎöʱ¼ä¡£ÔÚÎÄÕµÄ×îºó£¬×÷ÕßÒÔÖ§¸¶±¦ÎªÀý£¬Õ¹Ê¾³öͨ¹ýÔÚ
UIAlertView µÄ show ·½·¨´¦Ï¶ϵ㣬´Ó¶ø»ñµÃÖ§¸¶±¦µÄµ÷ÓÃÕ»µÄ¹ý³Ì¡£
±¾ÎÄÉæ¼°µÄ´úÂëÒ²¿ªÔ´ÔÚ£ºhttps://github.com/tobefuturer/restore-symbol£¬»¶Ó
Star ºÍÌá Issue¡£¸Ðл×÷ÕßÊÚȨ·¢±í¡£
×÷Õß½éÉÜ£ºÑî¾ý£¬ÖÐɽ´óѧ¼ÆËã»úϵÑо¿Éú£¬iOS ¿ª·¢Õߣ¬Éó¤ÁìÓò iOS °²È«ºÍÄæÏò¹¤³Ì£¬¸öÈ˲©¿Í£ºhttp://blog.imjun.net
¡£
ǰÑÔ
·ûºÅ±íÀúÀ´ÊÇÄæÏò¹¤³ÌÖÐµÄ ¡°±ØÕùÖ®µØ¡±£¬¶ø iOS Ó¦ÓÃÔÚÉÏÏßǰ¶¼»á²ÃÈ¥·ûºÅ±í£¬ÒÔ±ÜÃâ±»ÄæÏò·ÖÎö¡£
±¾ÎÄ»á½éÉÜÒ»¸ö×Ô¼ºÐ´µÄ¹¤¾ß£¬ÓÃÓÚ»Ö¸´ iOS Ó¦ÓõķûºÅ±í¡£
Ö±½Ó¿´Ð§¹û , Ö§¸¶±¦»Ö¸´·ûºÅ±íºóµÄÑù×Ó:

ÎÄÕÂÓе㳤£¬ÇëÄÍÐÄ¿´µ½×îºó£¬ÁÁµãÔÚ×îºó¡£
ΪʲôҪ»Ö¸´·ûºÅ±í
ÄæÏò¹¤³ÌÖУ¬µ÷ÊÔÆ÷µÄ¶¯Ì¬·ÖÎöÊDZز»¿ÉÉٵ쬶ø Xcode + lldb ȷʵÊǷdz£ºÃµÄµ÷ÊÔÀûÆ÷ , ±ÈÈçÎÒÃÇÔÚ
Xcode Àï¿ÉÒԺܷ½±ãµÄ²é¿´µ÷ÓöÑÕ»£¬ÈçÉÏÃæÄÇÕÅͼ¿ÉÒÔºÜÇåÎúµÄ¿´µ½Ö§¸¶±¦µÇ¼µÄ RPC µ÷Óùý³Ì¡£
ʵ¼ÊÉÏ£¬Èç¹ûÎÒÃDz»»Ö¸´·ûºÅ±íµÄ»°£¬Äã¿´µ½µÄµ÷ÊÔÒ³ÃæÓ¦¸ÃÊÇÏÂÃæÕâ¸öÑù×Ó£º

ͬһ¸öº¯Êýµ÷Óùý³Ì£¬Xcode µÄÏÔʾ¼òÖ±Ìì²îµØ±ð¡£
ÔÒòÊÇ£¬Xcode ÏÔʾµ÷ÓöÑÕ»ÖзûºÅʱ£¬Ö»»áÏÔʾ·ûºÅ±íÖÐÓеķûºÅ¡£ÎªÁËÎÒÃǵ÷ÊÔ¹ý³ÌµÄ˳Àû£¬ÎÒÃÇÓбØÒª°Ñ¿ÉÖ´ÐÐÎļþÖеķûºÅ±í»Ö¸´»ØÀ´¡£
·ûºÅ±íÊÇʲô
ÎÒÃÇÒª»Ö¸´·ûºÅ±í£¬Ê×ÏÈÒªÖªµÀ·ûºÅ±íÊÇʲô£¬ËûÊÇÔõô´æÔÚÓÚ Mach-O ÎļþÖеġ£
·ûºÅ±í´¢´æÔÚ Mach-O ÎļþµÄ __LINKEDIT ¶ÎÖУ¬Éæ¼°ÆäÖеķûºÅ±í(Symbol Table)ºÍ×Ö·û´®±í(String
Table)¡£
ÕâÀïÎÒÃÇÓà MachOView ´ò¿ªÖ§¸¶±¦µÄ¿ÉÖ´ÐÐÎļþ£¬ÕÒµ½ÆäÖÐµÄ Symbol Table Ïî¡£

·ûºÅ±íµÄ½á¹¹ÊÇÒ»¸öÁ¬ÐøµÄÁÐ±í£¬ÆäÖеÄÿһÏî¶¼ÊÇÒ»¸ö struct nlist¡£
// λÓÚϵͳ¿â <macho-o/nlist.h> Í·ÎļþÖÐ struct nlist { union { // ·ûºÅÃûÔÚ×Ö·û´®±íÖÐµÄÆ«ÒÆÁ¿ uint32_t n_strx; } n_un; uint8_t n_type; uint8_t n_sect; int16_t n_desc; // ·ûºÅÔÚÄÚ´æÖеĵØÖ·£¬ÀàËÆÓÚº¯ÊýÖ¸Õë uint32_t n_value; }; |
ÕâÀïÖØµã¹Ø×¢µÚÒ»ÏîºÍ×îºóÒ»ÏµÚÒ»ÏîÊÇ·ûºÅÃûÔÚ×Ö·û´®±íÖÐµÄÆ«ÒÆÁ¿£¬ÓÃÓÚ±íʾº¯ÊýÃû£¬×îºóÒ»ÏîÊÇ·ûºÅÔÚÄÚ´æÖеĵØÖ·£¬ÀàËÆÓÚº¯ÊýÖ¸Õë(ÕâÀïֻ˵Ã÷´ó¸ÅµÄ½á¹¹£¬ÏêϸµÄÐÅÏ¢Çë²Î¿¼¹Ù·½
Mach O Îļþ¸ñʽµÄÎĵµ)¡£
Ò²¾ÍÊÇ˵Èç¹ûÎÒÃÇÖªµÀÁË·ûºÅÃûºÍÄÚ´æµØÖ·µÄ¶ÔÓ¦¹ØÏµ£¬ÎÒÃÇÊÇ¿ÉÒÔ¸ù¾ÝÕâ¸ö½á¹¹À´ÄæÏò¹¹Ôì³ö·ûºÅ±íÊý¾ÝµÄ¡£
ÖªµÀÁËÈçºÎ¹¹Ôì·ûºÅ±í£¬ÏÂÒ»²½¾ÍÊÇÊÕ¼¯·ûºÅÃûºÍÄÚ´æµØÖ·µÄ¶ÔÓ¦¹ØÏµÁË¡£
»ñÈ¡ OC ·½·¨µÄ·ûºÅ±í
ÒòΪ OC ÓïÑÔµÄÌØÐÔ£¬±àÒëÆ÷»á½«ÀàÃû¡¢º¯ÊýÃûµÈ±àÒë½ø×îºóµÄ¿ÉÖ´ÐÐÎļþÖУ¬ËùÒÔÎÒÃÇ¿ÉÒÔ¸ù¾Ý Mach-O
ÎļþµÄ½á¹¹ÄæÏò»¹Ô³ö¹¤³ÌÀïµÄËùÓÐÀ࣬ÕâÒ²¾ÍÊÇ´óÃû¶¦¶¦µÄÄæÏò¹¤¾ß class-dump ÁË¡£class-dump
³öÀ´µÄÍ·ÎļþÀïÊÇÓк¯ÊýµØÖ·µÄ£º

ËùÒÔÎÒÃÇÖ»Òª¶Ô class-dump µÄÔ´ÂëÉÔ×÷Ð޸쬼´¿É»ñÈ¡ÎÒÃÇÒªµÄÐÅÏ¢¡£
·ûºÅ±í»Ö¸´¹¤¾ß
ÕûÀíÍêÊý¾Ý¸ñʽ£¬ÓÖÀíÇåÁËÊý¾ÝÀ´Ô´£¬ÎÒÃǾͿÉÒÔд¹¤¾ßÁË¡£
ʵÏÖ¹ý³Ì¾Í²»Ïêϸ˵Ã÷ÁË£¬¹¤¾ß¿ªÔ´ÔÚÎÒµÄ Github ÉÏÁË£¬Á´½Ó£º
https://github.com/tobefuturer/restore-symbol
ÎÒÃÇÀ´¿´¿´ÔõôÓÃÕâ¸ö¹¤¾ß£º
1. ÏÂÔØÔ´Âë±àÒë
git clone --recursive https://github.com/tobefuturer/restore-symbol.git cd restore-symbol && make ./restore-symbol |
2. »Ö¸´ OC µÄ·ûºÅ±í£¬·Ç³£¼òµ¥
./restore-symbol ./origin_AlipayWallet -o ./AlipayWallet_with_symbol |
origin_AlipayWallet Ϊ Clutch ÔҿǺó£¬Ã»ÓзûºÅ±íµÄ Mach-O Îļþ
-o ºóÃæ¸úÊä³öÎļþλÖÃ
3. °Ñ Mach-O ÎļþÖØÇ©Ãû´ò°ü£¬¿´Ð§¹û
Îļþ»Ö¸´·ûºÅ±íºó£¬¶à³öÁË 20M µÄ·ûºÅ±íÐÅÏ¢

Xcode Àï²é¿´µ÷ÓÃÕ»

¿ÉÒÔ¿´µ½£¬OC º¯ÊýÕⲿ·ÖµÄ·ûºÅÒѾ»Ö¸´ÁË£¬º¯Êýµ÷ÓÃÕ»ÀïÒѾÄÜ¿´³ö´óÖµĵ÷Óùý³ÌÁË£¬µ«ÊÇÖ§¸¶±¦À²ÉÓÃÁË
block µÄ»Øµ÷ÐÎʽ£¬ËùÒÔ»¹ÓкܴóÒ»²¿·ÖµÄ·ûºÅûÄÜÕýÈ·ÏÔʾ¡£
ÏÂÃæÎÒÃǾÍÀ´¿´¿´ÔõôÑù»Ö¸´Õⲿ·Ö block µÄ·ûºÅ¡£
»ñÈ¡ block µÄ·ûºÅÐÅÏ¢
»¹ÊÇͬÑùµÄ˼·£¬Òª»Ö¸´ block µÄ·ûºÅÐÅÏ¢£¬ÎÒÃDZØÐëÖªµÀ block ÔÚÎļþÖеĴ¢´æÐÎʽ¡£
block ÔÚÄÚ´æÖеĽṹ
Ê×ÏÈ£¬ÎÒÃÇÏÈ·ÖÎöÏÂÔËÐÐʱ£¬block ÔÚÄÚ´æÖеĴæÔÚÐÎʽ¡£block ÔÚÄÚ´æÖÐÊÇÒÔÒ»¸ö½á¹¹ÌåµÄÐÎʽ´æÔڵ쬴óÖµĽṹÈçÏ£º
struct __block_impl { /** block ÔÚÄÚ´æÖÐÒ²ÊÇÀà NSObject µÄ½á¹¹Ì壬 ½á¹¹Ì忪ʼλÖÃÊÇÒ»¸ö isa Ö¸Õë */ Class isa; /** ÕâÁ½¸ö±äÁ¿ÔÝʱ²»¹ØÐÄ */ int flags; int reserved; /** ÕæÕýµÄº¯ÊýÖ¸Õ룡£¡ */ void (*invoke)(...); ... } |
˵Ã÷Ï block ÖÐµÄ isa Ö¸Õ룬¸ù¾Ýʵ¼ÊÇé¿ö»áÓÐÈýÖÖ²»Í¬µÄȡֵ£¬À´±íʾ²»Í¬ÀàÐ굀 block£º
_NSConcreteStackBlock
Õ»É쵀 block£¬Ò»°ã block ´´½¨Ê±ÊÇÔÚÕ»ÉÏ·ÖÅäÁËÒ»¸ö block ½á¹¹ÌåµÄ¿Õ¼ä£¬È»ºó¶ÔÆäÖеÄ
isa µÈ±äÁ¿¸³Öµ¡£
2._NSConcreteMallocBlock
¶ÑÉ쵀 block£¬µ± block ±»¼ÓÈëµ½ GCD »òÕß±»¶ÔÏó³ÖÓÐʱ£¬½«Õ»É쵀 block ¸´ÖƵ½¶ÑÉÏ£¬´Ëʱ¸´ÖƵõ½µÄ
block ÀàÐͱäΪÁË _NSConcreteMallocBlock¡£
3._NSConcreteGlobalBlock
È«¾Ö¾²Ì¬µÄ block£¬µ± block ²»ÒÀÀµÓÚÉÏÏÂÎÄ»·¾³£¬±ÈÈç²»³ÖÓÐ block ÍâµÄ±äÁ¿¡¢Ö»Ê¹Óà block
ÄÚ²¿µÄ±äÁ¿µÄʱºò£¬block µÄÄÚ´æ·ÖÅä¿ÉÒÔÔÚ±àÒëÆÚ¾ÍÍê³É£¬·ÖÅäÔÚÈ«¾ÖµÄ¾²Ì¬³£Á¿Çø¡£
µÚ 2 ÖÖ block ÔÚÔËÐÐʱ²Å»á³öÏÖ£¬ÎÒÃÇÖ»¹Ø×¢ 1¡¢3 Á½ÖÖ£¬ÏÂÃæ¾Í·ÖÎöÕâÁ½ÖÖ isa Ö¸ÕëºÍ block
·ûºÅµØÖ·Ö®¼äµÄ¹ØÁª¡£
block isa Ö¸ÕëºÍ·ûºÅµØÖ·Ö®¼äµÄ¹ØÁª
·ÖÎöÕⲿ·ÖÐèÒªÓõ½ IDA Õâ¸ö·´»ã±àÈí¼þ , ÕâÀï½áºÏÁ½¸öʵ¼ÊµÄСÀý×ÓÀ´ËµÃ÷£º
1._NSConcreteStackBlock
¼ÙÉèÎÒÃǵÄÔ´´úÂëÊÇÕâÑùºÜ¼òµ¥µÄÒ»¸ö block£º
@implementation ViewController - (void)viewDidLoad { int t = 2; void (^ foo)() = ^(){ NSLog(@"%d", t); //block ÒýÓÃÁËÍⲿµÄ±äÁ¿ t }; foo(); } @end |
±àÒëÍêºó£¬Êµ¼ÊµÄ»ã±à³¤Õâ¸öÑù×Ó£º

ʵ¼ÊÔËÐÐʱ£¬block µÄ¹¹Ôì¹ý³ÌÊÇÕâÑù£º
Ϊ block ¿ª±ÙÕ»¿Õ¼ä
Ϊ block µÄ isa Ö¸Õ븳ֵ(Ò»¶¨»áÒýÓÃÈ«¾Ö±äÁ¿£º_NSConcreteStackBlock)
»ñÈ¡º¯ÊýµØÖ·£¬¸³Öµ¸øº¯ÊýÖ¸Õë
ËùÒÔÎÒÃÇ¿ÉÒÔÕûÀí³öÕâÑùÒ»¸öÌØÕ÷£º
ÖØµãÀ´ÁË !!!
·²ÊÇ´úÂëÀïÓõ½ÁËÕ»É쵀 block£¬Ò»¶¨»á»ñÈ¡__NSConcreteStackBlock×÷Ϊ isa
Ö¸Õ룬ͬʱ»á½ô½Ó×Å»ñȡһ¸öº¯ÊýµØÖ·£¬ÄǸöº¯ÊýµØÖ·¾ÍÊÇ block µÄº¯ÊýµØÖ·¡£
½áºÏÏÂÃæÕâ¸öͼ£¬×ÐϸÀí½âÉÏÃæÕâ¾ä»°
(ÕâÕÅͼºÍÉÏÃæÄÇÕÅͼÊÇͬһ¸öÎļþ£¬²»¹ý²ÃµôÁË·ûºÅ±í)

ÀûÓÃÕâ¸öÌØÕ÷£¬ÄæÏò·ÖÎöʱÎÒÃÇ¿ÉÒÔ×öÈçÏÂÍÆ¶Ï£º
ÔÚÒ»¸ö OC ·½·¨Àï·¢ÏÖÒýÓÃÁË__NSConcreteStackBlockÕâ¸ö±äÁ¿£¬ÄÇôÔÚÕ⸽½ü£¬Ò»¶¨»á³öÏÖÒ»¸öº¯ÊýµØÖ·£¬Õâ¸öº¯ÊýµØÖ·¾ÍÊÇÕâ¸ö
OC ·½·¨ÀïµÄÒ»¸ö block¡£
±ÈÈçÉÏÃæÍ¼ÖУ¬ÎÒÃÇ·¢ÏÖ viewDidLoad ÀÒýÓÃÁË__NSConcreteStackBlock,
ͬʱ½ô½Ó׿ÓÔØÁË sub_100049D4 µÄº¯ÊýµØÖ·£¬ÄÇÎÒÃǾͿÉÒÔÈ϶¨ sub_100049D4 ÊÇ
viewDidLoad ÀïµÄÒ»¸ö block, sub_100049D4 º¯ÊýµÄ·ûºÅÃûÓ¦¸ÃÊÇ viewDidLoad_block.
2. _NSConcreteGlobalBlock
È«¾ÖµÄ¾²Ì¬ block£¬ÊÇÄÇÖÖ²»ÒýÓà block Íâ±äÁ¿µÄ block£¬ËûÒòΪ²»ÒýÓÃÍⲿ±äÁ¿£¬ËùÒÔËû¿ÉÒÔÔÚ±àÒëÆÚ¾Í½øÐÐÄÚ´æ·ÖÅä²Ù×÷£¬Ò²²»Óõ£ÐÄ
block µÄ¸´ÖƵȵȲÙ×÷£¬Ëû´æÔÚÓÚ¿ÉÖ´ÐÐÎļþµÄ³£Á¿ÇøÀï¡£
²»Ì«Àí½âµÄ»°£¬¿´¸öÀý×Ó£º
ÎÒÃǰÑÔ´´úÂë¸Ä³ÉÕâÑù£º
@implementation ViewController - (void)viewDidLoad { void (^ foo)() = ^(){ //block ²»ÒýÓÃÍⲿµÄ±äÁ¿ NSLog(@"%d", 123); }; foo(); } @end |
ÄÇôÔÚ±àÒëºó»á±ä³ÉÕâÑù£º

ÄÇô½è¼øÉÏÃæµÄ˼·£¬ÔÚÄæÏò·ÖÎöµÄʱºò£¬ÎÒÃÇ¿ÉÒÔÕâÃ´ÍÆ¶Ï
ÔÚ¾²Ì¬³£Á¿Çø·¢ÏÖÒ»¸ö _NSConcreteGlobalBlock µÄÒýÓÃ
Õâ¸öµØ·½±ØÈ»´æÔÚÒ»¸ö block µÄ½á¹¹ÌåÊý¾Ý
ÔÚÕâ¸ö½á¹¹ÌåµÚ 16 ¸ö×ֽڵĵط½»á³öÏÖÒ»¸öÖµ£¬Õâ¸öÖµÊÇÒ»¸ö block µÄº¯ÊýµØÖ·
3. block µÄǶÌ׽ṹ
ʵ¼ÊÔÚʹÓÃÖУ¬¿ÉÄÜ»á³öÏÖ block ÄÚǶ block µÄÇé¿ö£º
- (void)viewDidLoad { dispatch_async(background_queue ,^{ ... dispatch_async(main_queue, ^{ ... }); }); } |
ËùÒÔÕâÀï block ¾Í³öÏÖÁ˸¸×Ó¹ØÏµ£¬Èç¹ûÎÒÃǽ«ÕâЩ¸¸×Ó¹ØÏµÊÕ¼¯ÆðÀ´£¬¾Í¿ÉÒÔ·¢ÏÖ£¬ÕâЩ¹ØÏµ»á¹¹³ÉͼÂÛÀïµÄÉÁֽṹ£¬ÕâÀï¿ÉÒÔ¼òµ¥ÓõݹéµÄÉî¶ÈÓÅÏÈËÑË÷À´´¦Àí£¬Ïêϸ¹ý³Ì²»ÔÙÃèÊö¡£
block ·ûºÅ±íÌáÈ¡½Å±¾(IDA+python)
ÕûÀíÉÏÃæµÄ˼·£¬ÎÒÃÇ·¢ÏÖËÑË÷¹ý³ÌÒÀÀµÓÚ IDA Ìṩ¸÷ÖÖÒýÓÃÐÅÏ¢£¬¶ø IDA ÊÇÌṩÁ˱à³Ì½Ó¿ÚµÄ£¬¿ÉÒÔÀûÓÃÕâЩ½Ó¿ÚÀ´ÌáÈ¡ÒýÓÃÐÅÏ¢¡£
IDA ÌṩµÄÊÇ Python µÄ SDK£¬×îºóÍê³ÉµÄ½Å±¾Ò²·ÅÔÚ²Ö¿âÀï search_oc_block/ida_search_block.py
(https://github.com/tobefuturer/restore-symbol/blob/master/search_oc_block/ida_search_block.py¡£
ÌáÈ¡ block ·ûºÅ±í
ÕâÀï¼òµ¥½éÉÜÏÂÔõôʹÓÃÉÏÃæÕâ¸ö½Å±¾£º
1.Óà IDA ´ò¿ªÖ§¸¶±¦µÄ Mach-O Îļþ
2.µÈ´ý·ÖÎöÍê³É! ¿ÉÄÜÒªÒ»¸öСʱ
3.Alt + F7 »òÕß ²Ëµ¥À¸ File -> Script
file...

4.µÈ´ý½Å±¾ÔËÐÐÍê³É£¬Ô¤¼Æ 30s ÖÁ 60s£¬ÔËÐйý³ÌÖлáÓÐÕâÑùµÄµ¯´°

5.µ¯´°Ïûʧ¼´ block ·ûºÅ±íÌáÈ¡Íê³É
6.ÔÚ IDA ´ò¿ªÎļþµÄĿ¼Ï , »áÊä³öÒ»·ÝÃûΪblock_symbol.jsonµÄ json ¸ñʽ
block ·ûºÅ±í


»Ö¸´·ûºÅ±í & ʵ¼Ê·ÖÎö
ÓÃ֮ǰµÄ·ûºÅ±í»Ö¸´¹¤¾ß£¬½« block µÄ·ûºÅ±íµ¼Èë Mach-O Îļþ
./restore-symbol ./origin_AlipayWallet -o ./AlipayWallet_with_symbol -j block_symbol.json |
-j ºóÃæ¸úÉÏ֮ǰµÃµ½µÄ json ·ûºÅ±í
×îºóµÃµ½Ò»·Ýͬʱ¾ßÓÐ OC º¯Êý·ûºÅ±íºÍ block ·ûºÅ±íµÄ¿ÉÖ´ÐÐÎļþ
ÕâÀï¼òµ¥½éÉÜÒ»¸ö·ÖÎö°¸Àý , Äã¾ÍÄÜÌå»áµ½Õâ¸ö¹¤¾ßµÄÇ¿´óÖ®´¦ÁË¡£
1.ÔÚ Xcode Àï¶Ô -[UIAlertView show] ÉèÖöϵã

2.ÔËÐгÌÐò£¬²¢ÔÚÖ§¸¶±¦µÄµÇÂ¼Ò³ÃæÊäÈëÊÖ»úºÅºÍ ´íÎóµÄÃÜÂë £¬µã»÷µÇ¼
3.Xcode »áÔÚ ¡®ÃÜÂë´íÎó¡¯ µÄ¾¯¸æ¿òµ¯³öʱͣÏ£¬×ó²à»áÏÔʾ³öÕâÑùµÄµ÷ÓÃÕ»
Ò»ÕÅͼ¿´ÍêÖ§¸¶±¦µÄµÇ¼¹ý³Ì

|