• objc反汇编分析,手工逆向libsystem_blocks.dylib


    上一篇《block函数块为何物?》介绍了在函数中定义的block函数块的反汇编实现,我在文中再三指出__block变量和block函数块自始还都是stack-based的,还不完全适合在离开定义它们的范围之外使用,包括异步回调。本篇贴上我手工逆向的函数

    libsystem_blocks.dylib`_Block_copy_internal。从名字可以看出blocks编程由系统提供的编程框架,_Block_copy_internal也就是block函数块的copy方法,是令block函数块适合用于异步回调必要的操作。

    NSStackBlock的逆向定义请参考上一篇《block函数块为何物?》,下面是函数的逆向C++代码:

    附上逆向时参照的反汇编片段快照:

    libsystem_blocks.dylib`_Block_copy_internal:
        0x10ce28458 <+0>:   pushq  %rbp
        0x10ce28459 <+1>:   movq   %rsp, %rbp
        0x10ce2845c <+4>:   pushq  %r15
        0x10ce2845e <+6>:   pushq  %r14
        0x10ce28460 <+8>:   pushq  %r13
        0x10ce28462 <+10>:  pushq  %r12
        0x10ce28464 <+12>:  pushq  %rbx
        0x10ce28465 <+13>:  pushq  %rax
        0x10ce28466 <+14>:  movq   %rdi, %rbx
        0x10ce28469 <+17>:  xorl   %eax, %eax
        0x10ce2846b <+19>:  testq  %rbx, %rbx
        0x10ce2846e <+22>:  je     0x10ce28534               ; <+220>
        0x10ce28474 <+28>:  leaq   0x8(%rbx), %rcx
        0x10ce28478 <+32>:  testl  $0x1000000, 0x8(%rbx)
        0x10ce2847f <+39>:  jne    0x10ce284db               ; <+131>
        0x10ce28481 <+41>:  testl  $0x8000000, (%rcx)
        0x10ce28487 <+47>:  jne    0x10ce284f8               ; <+160>
        0x10ce28489 <+49>:  testl  $0x10000000, (%rcx)
        0x10ce2848f <+55>:  jne    0x10ce28531               ; <+217>
        0x10ce28495 <+61>:  movb   0xbad(%rip), %al          ; isGC
        0x10ce2849b <+67>:  testb  %al, %al
        0x10ce2849d <+69>:  je     0x10ce28543               ; <+235>
        0x10ce284a3 <+75>:  movl   0x8(%rbx), %r13d
        0x10ce284a7 <+79>:  movl   %r13d, %r12d
        0x10ce284aa <+82>:  andl   $0x4000000, %r12d
        0x10ce284b1 <+89>:  movq   0xb48(%rip), %r8          ; _Block_allocator
        0x10ce284b8 <+96>:  movq   0x18(%rbx), %rax
        0x10ce284bc <+100>: movq   0x8(%rax), %rdi
        0x10ce284c0 <+104>: movb   $0x1, %dl
        0x10ce284c2 <+106>: jne    0x10ce285b8               ; <+352>
        0x10ce284c8 <+112>: testl  $0x40000000, (%rcx)
        0x10ce284ce <+118>: jne    0x10ce285a2               ; <+330>
        0x10ce284d4 <+124>: xorl   %edx, %edx
        0x10ce284d6 <+126>: jmp    0x10ce285b8               ; <+352>
        0x10ce284db <+131>: movl   (%rcx), %eax
        0x10ce284dd <+133>: movl   %eax, %edx
        0x10ce284df <+135>: andl   $0xfffe, %edx
        0x10ce284e5 <+141>: cmpl   $0xfffe, %edx
        0x10ce284eb <+147>: je     0x10ce28531               ; <+217>
        0x10ce284ed <+149>: leal   0x2(%rax), %edx
        0x10ce284f0 <+152>: lock   
        0x10ce284f1 <+153>: cmpxchgl %edx, (%rcx)
        0x10ce284f4 <+156>: jne    0x10ce284db               ; <+131>
        0x10ce284f6 <+158>: jmp    0x10ce28531               ; <+217>
        0x10ce284f8 <+160>: testb  %sil, %sil
        0x10ce284fb <+163>: je     0x10ce28531               ; <+217>
        0x10ce284fd <+165>: movl   (%rcx), %eax
        0x10ce284ff <+167>: movl   %eax, %edx
        0x10ce28501 <+169>: andl   $0xfffe, %edx
        0x10ce28507 <+175>: cmpl   $0xfffe, %edx
        0x10ce2850d <+181>: je     0x10ce28531               ; <+217>
        0x10ce2850f <+183>: leal   0x2(%rax), %edx
        0x10ce28512 <+186>: lock   
        0x10ce28513 <+187>: cmpxchgl %edx, (%rcx)
        0x10ce28516 <+190>: jne    0x10ce284fd               ; <+165>
        0x10ce28518 <+192>: andl   $0xfffe, %edx
        0x10ce2851e <+198>: cmpl   $0x2, %edx
        0x10ce28521 <+201>: jne    0x10ce28531               ; <+217>
        0x10ce28523 <+203>: movl   $0x1, %esi
        0x10ce28528 <+208>: movq   %rbx, %rdi
        0x10ce2852b <+211>: callq  *0xae7(%rip)              ; _Block_setHasRefcount
        0x10ce28531 <+217>: movq   %rbx, %rax
        0x10ce28534 <+220>: addq   $0x8, %rsp
        0x10ce28538 <+224>: popq   %rbx
        0x10ce28539 <+225>: popq   %r12
        0x10ce2853b <+227>: popq   %r13
        0x10ce2853d <+229>: popq   %r14
        0x10ce2853f <+231>: popq   %r15
        0x10ce28541 <+233>: popq   %rbp
        0x10ce28542 <+234>: retq   
        0x10ce28543 <+235>: movq   0x18(%rbx), %r15
        0x10ce28547 <+239>: movq   0x8(%r15), %rdi
        0x10ce2854b <+243>: callq  0x10ce28b34               ; symbol stub for: malloc
        0x10ce28550 <+248>: movq   %rax, %r14
        0x10ce28553 <+251>: xorl   %eax, %eax
        0x10ce28555 <+253>: testq  %r14, %r14
        0x10ce28558 <+256>: je     0x10ce28534               ; <+220>
        0x10ce2855a <+258>: movq   0x8(%r15), %rdx
        0x10ce2855e <+262>: movq   %r14, %rdi
        0x10ce28561 <+265>: movq   %rbx, %rsi
        0x10ce28564 <+268>: callq  0x10ce28b52               ; symbol stub for: memmove
        0x10ce28569 <+273>: andl   $0xffff0000, 0x8(%r14)
        0x10ce28571 <+281>: orl    $0x1000002, 0x8(%r14)
        0x10ce28579 <+289>: leaq   0xbd0(%rip), %rax         ; _NSConcreteMallocBlock
        0x10ce28580 <+296>: movq   %rax, (%r14)
        0x10ce28583 <+299>: testl  $0x2000000, 0x8(%rbx)
        0x10ce2858a <+306>: je     0x10ce28629               ; <+465>
        0x10ce28590 <+312>: movq   0x18(%rbx), %rax
        0x10ce28594 <+316>: movq   %r14, %rdi
        0x10ce28597 <+319>: movq   %rbx, %rsi
        0x10ce2859a <+322>: callq  *0x10(%rax)
        0x10ce2859d <+325>: jmp    0x10ce28629               ; <+465>
        0x10ce285a2 <+330>: leaq   0x10(%rax), %rdx
        0x10ce285a6 <+334>: testl  $0x2000000, (%rcx)
        0x10ce285ac <+340>: cmoveq %rax, %rdx
        0x10ce285b0 <+344>: cmpq   $0x0, 0x18(%rdx)
        0x10ce285b5 <+349>: setne  %dl
        0x10ce285b8 <+352>: movzbl %sil, %r15d
        0x10ce285bc <+356>: movzbl %dl, %edx
        0x10ce285bf <+359>: movl   %r15d, %esi
        0x10ce285c2 <+362>: callq  *%r8
        0x10ce285c5 <+365>: movq   %rax, %r14
        0x10ce285c8 <+368>: xorl   %eax, %eax
        0x10ce285ca <+370>: testq  %r14, %r14
        0x10ce285cd <+373>: je     0x10ce28534               ; <+220>
        0x10ce285d3 <+379>: movq   0x18(%rbx), %rax
        0x10ce285d7 <+383>: movq   0x8(%rax), %rdx
        0x10ce285db <+387>: movq   %r14, %rdi
        0x10ce285de <+390>: movq   %rbx, %rsi
        0x10ce285e1 <+393>: callq  0x10ce28b52               ; symbol stub for: memmove
        0x10ce285e6 <+398>: andl   $0xf6ff0000, %r13d
        0x10ce285ed <+405>: addl   %r15d, %r15d
        0x10ce285f0 <+408>: orl    %r13d, %r15d
        0x10ce285f3 <+411>: orl    $0x8000000, %r15d
        0x10ce285fa <+418>: movl   %r15d, 0x8(%r14)
        0x10ce285fe <+422>: testl  $0x2000000, 0x8(%rbx)
        0x10ce28605 <+429>: je     0x10ce28614               ; <+444>
        0x10ce28607 <+431>: movq   0x18(%rbx), %rax
        0x10ce2860b <+435>: movq   %r14, %rdi
        0x10ce2860e <+438>: movq   %rbx, %rsi
        0x10ce28611 <+441>: callq  *0x10(%rax)
        0x10ce28614 <+444>: testl  %r12d, %r12d
        0x10ce28617 <+447>: leaq   0xc32(%rip), %rax         ; _NSConcreteAutoBlock
        0x10ce2861e <+454>: cmovneq 0x19ea(%rip), %rax        ; (void *)0x000000010ce29350: _NSConcreteFinalizingBlock
        0x10ce28626 <+462>: movq   %rax, (%r14)
        0x10ce28629 <+465>: movq   %r14, %rax
        0x10ce2862c <+468>: jmp    0x10ce28534               ; <+220>

    PS:博客园图片服务器不正常工作,数据上传后服务器返回http500,园方怡慢,迟迟还没解决。在此先占个placehoder。待园方解决问题后再上图。

  • 相关阅读:
    只会写“Hello World”的菜鸟心声
    新的旅程
    生成[1,2,,3,4,5,6,7,8,9]的随机数组?
    计算java集合中自定义对象出现的次数
    iOS https 证书信任漏洞解决办法
    自定义 URL Scheme 完全指南
    Apple移动设备处理器指令集 armv6、armv7、armv7s及arm64
    url schemes格式错误
    给UITapGestureRecognizer添加tag
    iOS GIF 格式动画 图片显示
  • 原文地址:https://www.cnblogs.com/bbqzsl/p/5139775.html
Copyright © 2020-2023  润新知