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!'. 解题思路:根据学习的知识,我知道该页在 ...
随机推荐
- idea+springboot+mybatis逆向工程
前提:使用idea开发,基于springboot.用到了mybatis的逆向工程 因为之前用eclipse开发ssm比较多,现在转idea 使用springboot 踩了一些坑,在这记录一下~ 注意事 ...
- css的简单使用
css语法 id选择器: id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式. HTML元素以id属性来设置id选择器,CSS 中 id 选择器以 "#" 来定义. ...
- 学习笔记:flutter项目搭建(mac版)
什么是flutter Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面. Flutter可以与现有的代码一起工作.在全世界,Flutter正在被越来越多的 ...
- FastDFS集群-安装说明
一.简介 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的在线 ...
- Vue优化:常见会导致内存泄漏问题及优化
1. 监听在window/body等事件没有解绑2. 绑在EventBus的事件没有解绑3. 模块形成的闭包内部变量使用完后没有置成null4. 使用第三方库创建,没有调用正确的销毁函数5 . ech ...
- Python 依赖库管理哪家强?pipreqs、pigar、pip-tools、pipdeptree 任君挑选
在 Python 的项目中,如何管理所用的全部依赖库呢?最主流的做法是维护一份"requirements.txt",记录下依赖库的名字及其版本号. 那么,如何来生成这份文件呢?在上 ...
- 设计模式C++描述----12.享元(Flyweight)模式
一. 概述 在面向对象系统的设计何实现中,创建对象是最为常见的操作. 这里面就有一个问题:如果一个应用程序使用了太多的对象,就会造成很大的存储开销.特别是对于大量轻量级(细粒度)的对象,比如在文档编辑 ...
- [Java] 生成二维码源码,可以在二维码中间加logo,底部可以加文字介绍
链接:https://pan.baidu.com/s/1bc1h-ix-No-2o9Ysd4_B3Q提取码:0ad4
- 【XSY2495】余数
Input Output Input 3 4 Output 4 HINT 原式 =n*m-n除以i向下取整 用数论分块做就可以了 #include<bits/stdc++.h> #defi ...
- 我对C++开发人员有偏见
前言 我确实对C++开发人员有一些偏见,我也知道对一类人有偏见是不正确的行为:但,在我所处的三线城市的环境中,我对C++开发有偏见并非是一件不正确的事,因为C++开发都是变态这件事,根本就是客观事实. ...