上一篇《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 <+>: pushq %rbp
0x10ce28459 <+>: movq %rsp, %rbp
0x10ce2845c <+>: pushq %r15
0x10ce2845e <+>: pushq %r14
0x10ce28460 <+>: pushq %r13
0x10ce28462 <+>: pushq %r12
0x10ce28464 <+>: pushq %rbx
0x10ce28465 <+>: pushq %rax
0x10ce28466 <+>: movq %rdi, %rbx
0x10ce28469 <+>: xorl %eax, %eax
0x10ce2846b <+>: testq %rbx, %rbx
0x10ce2846e <+>: je 0x10ce28534 ; <+220>
0x10ce28474 <+>: leaq 0x8(%rbx), %rcx
0x10ce28478 <+>: testl $0x1000000, 0x8(%rbx)
0x10ce2847f <+>: jne 0x10ce284db ; <+131>
0x10ce28481 <+>: testl $0x8000000, (%rcx)
0x10ce28487 <+>: jne 0x10ce284f8 ; <+160>
0x10ce28489 <+>: testl $0x10000000, (%rcx)
0x10ce2848f <+>: jne 0x10ce28531 ; <+217>
0x10ce28495 <+>: movb 0xbad(%rip), %al ; isGC
0x10ce2849b <+>: testb %al, %al
0x10ce2849d <+>: je 0x10ce28543 ; <+235>
0x10ce284a3 <+>: movl 0x8(%rbx), %r13d
0x10ce284a7 <+>: movl %r13d, %r12d
0x10ce284aa <+>: andl $0x4000000, %r12d
0x10ce284b1 <+>: movq 0xb48(%rip), %r8 ; _Block_allocator
0x10ce284b8 <+>: movq 0x18(%rbx), %rax
0x10ce284bc <+>: movq 0x8(%rax), %rdi
0x10ce284c0 <+>: movb $0x1, %dl
0x10ce284c2 <+>: jne 0x10ce285b8 ; <+352>
0x10ce284c8 <+>: testl $0x40000000, (%rcx)
0x10ce284ce <+>: jne 0x10ce285a2 ; <+330>
0x10ce284d4 <+>: xorl %edx, %edx
0x10ce284d6 <+>: jmp 0x10ce285b8 ; <+352>
0x10ce284db <+>: movl (%rcx), %eax
0x10ce284dd <+>: movl %eax, %edx
0x10ce284df <+>: andl $0xfffe, %edx
0x10ce284e5 <+>: cmpl $0xfffe, %edx
0x10ce284eb <+>: je 0x10ce28531 ; <+217>
0x10ce284ed <+>: leal 0x2(%rax), %edx
0x10ce284f0 <+>: lock
0x10ce284f1 <+>: cmpxchgl %edx, (%rcx)
0x10ce284f4 <+>: jne 0x10ce284db ; <+131>
0x10ce284f6 <+>: jmp 0x10ce28531 ; <+217>
0x10ce284f8 <+>: testb %sil, %sil
0x10ce284fb <+>: je 0x10ce28531 ; <+217>
0x10ce284fd <+>: movl (%rcx), %eax
0x10ce284ff <+>: movl %eax, %edx
0x10ce28501 <+>: andl $0xfffe, %edx
0x10ce28507 <+>: cmpl $0xfffe, %edx
0x10ce2850d <+>: je 0x10ce28531 ; <+217>
0x10ce2850f <+>: leal 0x2(%rax), %edx
0x10ce28512 <+>: lock
0x10ce28513 <+>: cmpxchgl %edx, (%rcx)
0x10ce28516 <+>: jne 0x10ce284fd ; <+165>
0x10ce28518 <+>: andl $0xfffe, %edx
0x10ce2851e <+>: cmpl $0x2, %edx
0x10ce28521 <+>: jne 0x10ce28531 ; <+217>
0x10ce28523 <+>: movl $0x1, %esi
0x10ce28528 <+>: movq %rbx, %rdi
0x10ce2852b <+>: callq *0xae7(%rip) ; _Block_setHasRefcount
0x10ce28531 <+>: movq %rbx, %rax
0x10ce28534 <+>: addq $0x8, %rsp
0x10ce28538 <+>: popq %rbx
0x10ce28539 <+>: popq %r12
0x10ce2853b <+>: popq %r13
0x10ce2853d <+>: popq %r14
0x10ce2853f <+>: popq %r15
0x10ce28541 <+>: popq %rbp
0x10ce28542 <+>: retq
0x10ce28543 <+>: movq 0x18(%rbx), %r15
0x10ce28547 <+>: movq 0x8(%r15), %rdi
0x10ce2854b <+>: callq 0x10ce28b34 ; symbol stub for: malloc
0x10ce28550 <+>: movq %rax, %r14
0x10ce28553 <+>: xorl %eax, %eax
0x10ce28555 <+>: testq %r14, %r14
0x10ce28558 <+>: je 0x10ce28534 ; <+220>
0x10ce2855a <+>: movq 0x8(%r15), %rdx
0x10ce2855e <+>: movq %r14, %rdi
0x10ce28561 <+>: movq %rbx, %rsi
0x10ce28564 <+>: callq 0x10ce28b52 ; symbol stub for: memmove
0x10ce28569 <+>: andl $0xffff0000, 0x8(%r14)
0x10ce28571 <+>: orl $0x1000002, 0x8(%r14)
0x10ce28579 <+>: leaq 0xbd0(%rip), %rax ; _NSConcreteMallocBlock
0x10ce28580 <+>: movq %rax, (%r14)
0x10ce28583 <+>: testl $0x2000000, 0x8(%rbx)
0x10ce2858a <+>: je 0x10ce28629 ; <+465>
0x10ce28590 <+>: movq 0x18(%rbx), %rax
0x10ce28594 <+>: movq %r14, %rdi
0x10ce28597 <+>: movq %rbx, %rsi
0x10ce2859a <+>: callq *0x10(%rax)
0x10ce2859d <+>: jmp 0x10ce28629 ; <+465>
0x10ce285a2 <+>: leaq 0x10(%rax), %rdx
0x10ce285a6 <+>: testl $0x2000000, (%rcx)
0x10ce285ac <+>: cmoveq %rax, %rdx
0x10ce285b0 <+>: cmpq $0x0, 0x18(%rdx)
0x10ce285b5 <+>: setne %dl
0x10ce285b8 <+>: movzbl %sil, %r15d
0x10ce285bc <+>: movzbl %dl, %edx
0x10ce285bf <+>: movl %r15d, %esi
0x10ce285c2 <+>: callq *%r8
0x10ce285c5 <+>: movq %rax, %r14
0x10ce285c8 <+>: xorl %eax, %eax
0x10ce285ca <+>: testq %r14, %r14
0x10ce285cd <+>: je 0x10ce28534 ; <+220>
0x10ce285d3 <+>: movq 0x18(%rbx), %rax
0x10ce285d7 <+>: movq 0x8(%rax), %rdx
0x10ce285db <+>: movq %r14, %rdi
0x10ce285de <+>: movq %rbx, %rsi
0x10ce285e1 <+>: callq 0x10ce28b52 ; symbol stub for: memmove
0x10ce285e6 <+>: andl $0xf6ff0000, %r13d
0x10ce285ed <+>: addl %r15d, %r15d
0x10ce285f0 <+>: orl %r13d, %r15d
0x10ce285f3 <+>: orl $0x8000000, %r15d
0x10ce285fa <+>: movl %r15d, 0x8(%r14)
0x10ce285fe <+>: testl $0x2000000, 0x8(%rbx)
0x10ce28605 <+>: je 0x10ce28614 ; <+444>
0x10ce28607 <+>: movq 0x18(%rbx), %rax
0x10ce2860b <+>: movq %r14, %rdi
0x10ce2860e <+>: movq %rbx, %rsi
0x10ce28611 <+>: callq *0x10(%rax)
0x10ce28614 <+>: testl %r12d, %r12d
0x10ce28617 <+>: leaq 0xc32(%rip), %rax ; _NSConcreteAutoBlock
0x10ce2861e <+>: cmovneq 0x19ea(%rip), %rax ; (void *)0x000000010ce29350: _NSConcreteFinalizingBlock
0x10ce28626 <+>: movq %rax, (%r14)
0x10ce28629 <+>: movq %r14, %rax
0x10ce2862c <+>: jmp 0x10ce28534 ; <+220>

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

objc反汇编分析,手工逆向libsystem_blocks.dylib的更多相关文章

  1. objc反汇编分析,block函数块为何物?

    上一篇向大家介绍了__block变量的反汇编和它的伪代码,本篇函数块block,通常定义成原型(^){},它在反汇编中是什么东西. 我们先定义将要反汇编的例子,为减少篇幅例子采用non-arc环境. ...

  2. objc反汇编分析__strong和__weak

    如题所说反汇编看__strong和__weak的真实样子,代码列举自然多,篇幅长不利于阅读,我就先搬出结论,后面是分析. 在NON-ARC环境,__strong和__weak不起作用.相反在ARC环境 ...

  3. 反汇编分析objc函数枢纽objc_msgSend

    在分析objc_msgSend之前,先来搞清楚另一个问题. 函数是什么?可能会答 void foo(void) {} 像这样就是一个函数.或者函数包括函数原型和函数定义,是一段执行某样功能的机器代码. ...

  4. Linux下简单C语言小程序的反汇编分析

    韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...

  5. hopper反汇编工具的逆向伪代码功能并不理想

    hopper的逆向代码功能并不如想象中那么好,尤其是在逆向c++代码时.对于从ObjC进入iOS开发又不太清楚运行时的人员来说,hopper可以将反汇编码输出成[obj selector:what]这 ...

  6. 反汇编分析NSString,你印象中的NSString是这样吗

    我们先来定义三个NSString -(void) testNSString { NSString* a = @"abc"; NSString* b = [NSString stri ...

  7. SG Input 软件安全分析之逆向分析

    前言 通过本文介绍怎么对一个 windows 程序进行安全分析.分析的软件版本为 2018-10-9 , 所有相关文件的链接 链接:https://pan.baidu.com/s/1l6BuuL-HP ...

  8. mingw32 exception在sjlj与dwarf差别-反汇编分析

    sjlj (setjump/longjump)与dwarf-2为mingw32两种异常处理模型的实现.sjlj有着开销,而随linux发行的mingw32开发库包都是用sjlj版编译的,而Qt却采用d ...

  9. 实验4 汇编应用编程和c语言程序反汇编分析

    1. 实验任务1 教材「实验9 根据材料编程」(P187-189)编程:在屏幕中间分别显示绿色.绿底红色.白底蓝色的字符串'welcome to masm!'. 解题思路:根据学习的知识,我知道该页在 ...

随机推荐

  1. 推荐几个IT交流社区

    博客园,csdn,掘金,StackOverflow(境外),v2ex,开源中国,简书,头条

  2. H5 video踩坑实录

    前段时间公司APP做了一个APP论坛会议,嵌入了h5播放器.我以为很简单,没想到,这正是我踩进泥潭的开始... (想要吸取经验的小伙伴可以慢慢往下看,想要解决方案的直接看最后!) 一.一开始我以为直接 ...

  3. vscode自定义颜色主题插件并发布

    生成一个新的颜色主题 运行命令 npm install -g yo generator-code yo code 这时默认文件目录已经帮你创建好了 vscode中按下F5可以帮你打开调试,预览创建好的 ...

  4. 如何在sprintf函数中输出百分号(%)等特殊符号

    php中的sprinf可以格式化字符串的数据类型.今天遇到了想在其中输出%,可难倒我了. $query =  sprintf("select * from books where %s li ...

  5. ArcGIS Engine添加地图元素的实现

    在ArcGIS中,我们使用的制图控件除了MapControl之外,还有PageLayoutControl,用于页面布局和制图,生成一幅成品地图. PageLayoutControl 封装了PageLa ...

  6. HTML5+CSS:02用户注册表单

            新的学期已开始接近两个月了,还记得是在国庆节那几天申请的博客账号,可过了一个月都还没开始写博客,(>_<)有点小偷懒了,不过,学习还是不能落下的,今写一个有点实践运用的关于 ...

  7. Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required [ IDEA mybatis项目报错 ]

    今天笔者用Springboot框架整合Mybatis做一个小小的项目: 代码写完,在运行项目时,IDEA给我报了3处错误: org.springframework.beans.factory.Unsa ...

  8. Android H5混合开发(1):构建Cordova 项目

    Cordova是什么 Apache Cordova是一个开源的移动开发框架.允许你用标准的web技术-HTML5,CSS3和JavaScript做跨平台开发. 以移动平台为例,安卓.IOS平台设备的常 ...

  9. NOIP模拟 17

    这次.. 考场刚了T1T2两题的正解 然后T2A了,T1被毒瘤卡常 让skyh得了rank1,QMQ 话说这次考试体(r)验(p)极(yong)佳(jin) 也许是昨晚没玩狼人杀睡的比较好?(现场%苗 ...

  10. Spark安装与学习

    http://www.cnblogs.com/jerrylead/archive/2012/08/13/2636115.html