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 <+>: 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的更多相关文章
- objc反汇编分析,block函数块为何物?
上一篇向大家介绍了__block变量的反汇编和它的伪代码,本篇函数块block,通常定义成原型(^){},它在反汇编中是什么东西. 我们先定义将要反汇编的例子,为减少篇幅例子采用non-arc环境. ...
- objc反汇编分析__strong和__weak
如题所说反汇编看__strong和__weak的真实样子,代码列举自然多,篇幅长不利于阅读,我就先搬出结论,后面是分析. 在NON-ARC环境,__strong和__weak不起作用.相反在ARC环境 ...
- 反汇编分析objc函数枢纽objc_msgSend
在分析objc_msgSend之前,先来搞清楚另一个问题. 函数是什么?可能会答 void foo(void) {} 像这样就是一个函数.或者函数包括函数原型和函数定义,是一段执行某样功能的机器代码. ...
- Linux下简单C语言小程序的反汇编分析
韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...
- hopper反汇编工具的逆向伪代码功能并不理想
hopper的逆向代码功能并不如想象中那么好,尤其是在逆向c++代码时.对于从ObjC进入iOS开发又不太清楚运行时的人员来说,hopper可以将反汇编码输出成[obj selector:what]这 ...
- 反汇编分析NSString,你印象中的NSString是这样吗
我们先来定义三个NSString -(void) testNSString { NSString* a = @"abc"; NSString* b = [NSString stri ...
- SG Input 软件安全分析之逆向分析
前言 通过本文介绍怎么对一个 windows 程序进行安全分析.分析的软件版本为 2018-10-9 , 所有相关文件的链接 链接:https://pan.baidu.com/s/1l6BuuL-HP ...
- mingw32 exception在sjlj与dwarf差别-反汇编分析
sjlj (setjump/longjump)与dwarf-2为mingw32两种异常处理模型的实现.sjlj有着开销,而随linux发行的mingw32开发库包都是用sjlj版编译的,而Qt却采用d ...
- 实验4 汇编应用编程和c语言程序反汇编分析
1. 实验任务1 教材「实验9 根据材料编程」(P187-189)编程:在屏幕中间分别显示绿色.绿底红色.白底蓝色的字符串'welcome to masm!'. 解题思路:根据学习的知识,我知道该页在 ...
随机推荐
- 【RabbitMQ 实战指南】一 死信队列
1.死信队列 DLX,全称为 Dead-Letter-Exchange,可以称之为死信交换器.当消息在一个队列中变成死信(dead message)之后,它能被发送到另一个交换器中,这个交换器就是DL ...
- 第九周课程总结&实验报告(七)
实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: (3)卖票过程延时1秒钟: (4)不能出现一票多卖或卖出负数号票的情况. 实验代码 pac ...
- 8.Linux用户管理(上)
1.什么是用户? 能正常登陆系统的都算用户 windows系统和linux系统的用户有什么区别? 本质上没有区别, linux支持多个用户同一时刻登陆系统, 互相之间不影响 而windows只允许同一 ...
- Redis学习四(运维指南).
一.上线规划 一般 redis 的参数配置都在 redis.conf 中,在上线前根据实际环境配置好合适参数,能有效提高 redis 的可用性. redis 的运行机器 CPU 不求核数多,但求主频高 ...
- 嗜血的硅谷与Hygge的欧洲
听到太多抱怨工作累,加班多,996的声音.我们是否从底层来理智的分析这一过程.那些抱怨加班多.996的人有多少离开了那个让他发声的工作,去找一份轻松悠闲的工作度日? 我们是一边抱怨着工作,一边担心着离 ...
- Node.js事件的正确使用方法
前言 事件驱动的编程变得流行之前,在程序内部进行通信的标准方法非常简单:如果一个组件想要向另外一个发送消息,只是显式地调用了那个组件上的方法.但是在 react 中用的却是事件驱动而不是调用. 事件的 ...
- 设计模式(八)Abstract Factory模式
抽象工厂的工作是将“抽象零件”组装为“抽象产品”.在抽象工厂模式中将会出现抽象工厂,它会将抽象零件组装为抽象产品.也就是说,我们并不关心零件的具体实现,而是只关心接口.我们仅适用该接口将零件组装起来成 ...
- java script三大组成部分
JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...
- 如何学好javascript
今天逛论坛时看到有朋友问,是否有专门教Javascript的学校,这里想想把自己的一点建议和自己3年来的前端Javascript开发的经验跟大家分享下,也给出几本个人认为不错的书来做为大家学习的参考资 ...
- git push 报src refspec xxx does not match any的错误
今天在向一个新的远程分支上推送项目的时候报错: 远程分支branch_new是其他人建的,我在自己本地修改后把自己分支的修改推送到这个远程分支上. 把修改提到本地仓库: git add ./ git ...