上一篇《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. xss姿势利用

    1.定位页面可以出现xss的位置 可能会出现联合点利用 一个页面多个存储位置或者一个页面多个参数联合利用 例如输入xss 查看页面源码页面里有多个xss 或者多个参数显示 可以利用 需要注意的是有的是 ...

  2. python编程系列---多线程共享全局变量出现了安全问题的解决方法

    多线程共享全局变量出现了安全问题的解决方法 当多线程共享全局变量时,可能出现安全问题,解决机制----互斥锁:即在在一段与全局变量修改相关的代码中,假设一个时间片不足以完成全局变量的修改,就在这段代码 ...

  3. 百万年薪python之路 -- 基本数据类型练习

    1.代码敲一遍,然后整理笔记 2.有变量name = "aleX leNb" 完成如下操作: 移除 name 变量对应的值两边的空格,并输出处理结果 name = "al ...

  4. Redis(十三)Python客户端redis-py

    一.安装redis-py的方法 使用pip install安装redis-py C:\Users\BigJun>pip3 install redis Collecting redis Downl ...

  5. 数据库(一)--通过django创建数据库表并填充数据

    django是不能创建数据库的,只能够创建数据库表,因此,我们在连接数据库的时候要先建立一个数据库. 在models.py中 from django.db import models class Pu ...

  6. video3

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. leetcode算法小题(2)

    题目描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. package Simple;import java.util.Scanner;public class Prac ...

  8. jvm虚拟机栈的作用

    jvm虚拟机栈的作用 jvm虚拟机栈栈帧的组成 jvm虚拟机栈,也叫java栈,它由一个个的栈帧组成,而栈帖由以下几个部分组成 局部变量表-存储方法参数,内部使用的变量 操作数栈-在变量进行存储时,需 ...

  9. yum安装PHP升级到7.1版本

    yum安装PHP升级到7.2版本卸载原来低版本的PHP rpm -qa |grep php|xargs rpm -e 更新yum源 //CentOS/RHEL 7.xrpm -Uvh https:// ...

  10. mysql多种备份与恢复方式一

    基于mysql社区版5.7,严重声明:本文中图方便直接写入了-p数据库密码,在生产环境中如果指定了一定要使用history -C清空历史命令记录哦,所有博客作者原创纯手打,转载一定要注明本博客链接,感 ...