前篇博客中,使用 杨君的小黑屋 提供的工具恢复二进制文件的符号表,只恢复了函数的符号表,本篇讲述如何恢复block符号表,杨君的博客中使用IDA分析二进制文件,本篇则使用MacOS系统上体验也不错的Hopper来作分析。

使用工具:

  Hopper 4.0.8

block的类型有3种:

  • _NSConcreteGlobalBlock(全局)
  • _NSConcreteStackBlock(栈)
  • _NSConcreteMallocBlock(堆)--> 不会出现在二进制文件中

block编译后在二进制文件中的布局,查看 Block_private.h 文件

struct Block_layout {
  /* 指向所属类型 __NSConcreteGlobalBlock,__NSConcreteStackBlock */
void *isa;
int flags;
int reserved;
  
  /* 函数指针,指向block的实现地址 */
void (*invoke)(void *, ...);
struct Block_descriptor *descriptor;
/* Imported variables. */
};

使用Hopper查看二进制文件(CrashTest)

  • __NSConcreteGlobalBlock 存在于全局静态区 Segment __DATA 的 Section __const , 使用Hopper查看GlobalBlock如图:

__NSConcreteGlobalBlock位置即为 isa指针地址0x10000c2f0,后跟2个int型的值,接着是函数指针地址0x10000c300, 它指向地址 0x1000081b0 即为block的实现函数地址。

  • _NSConcreteStackBlock则与代码指令在一起,如图

恢复Block符号表

根据以上特性,以及Hopper提供的脚本接口,写一段python脚本收集block函数地址与名字的对应关系,再将此关系恢复到二进制文件中。

脚本已上传github

原理:

全局的Block比较容易找到函数入口,isa指针向后偏移固定字节即可找到,栈区Block相对复杂,笔者是通过扩大搜索地址区域到 ±24字节的范围内搜索函数指针 

在Hopper中运行脚本,会得到一个block_sym.json文件,此json文件将用于恢复block的符号。使用符号表恢复工具的的 -j 选项

./restore-symbol -o CrashTest-sym -j block_sym.json CrashTest-arm64

得到恢复符号的二进制文件 CrashTest-sym,于是就可以用atos命令解析block中的崩溃了

atos -arch arm64 -o CrashTest-sym -l 0x1000d0000 0x1000d84ac 0x1000d83a4 0x1000d8108

// 输出
-[PersonInfo haveChilren:]_block_invoke (in CrashTest-sym) +
-[PersonInfo haveChilren:] (in CrashTest-sym) +
-[ViewController printStaff] (in CrashTest-sym) +

附件:

本篇使用的DEMO

参考 & 感谢

  杨君的小黑屋 http://blog.imjun.net/posts/restore-symbol-of-iOS-app/

本文地址:http://www.cnblogs.com/ciml/p/7698271.html

恢复二进制文件中的block符号表的更多相关文章

  1. 如何恢复oracle中已删除的表

    在9i中Oracle引入了flashback的概念,可以将数据返回到某个时间点,但对于诸如drop/truncate等DDL语句却尚不支持.进入Oracle10g,这一缺陷得到了弥补.可以将丢失掉的表 ...

  2. iOS 符号表恢复 & 逆向支付宝

    推荐序 本文介绍了恢复符号表的技巧,并且利用该技巧实现了在 Xcode 中对目标程序下符号断点调试,该技巧可以显著地减少逆向分析时间.在文章的最后,作者以支付宝为例,展示出通过在 UIAlertVie ...

  3. windbg加载符号表

    0x00 前言 在使用windbg调试windows中的程序时会经常碰到一些系统的dll里面的一些函数调用,有些函数是没有具体函数名的,这对于调试非常不利,基于此,微软针对windows也发布了很多系 ...

  4. 恢复oracle中误删除drop掉的表

    查看回收站中表 select object_name,original_name,partition_name,type,ts_name,createtime,droptime from recycl ...

  5. 从MySQL全库备份中恢复某个库和某张表【转】

    从MySQL全库备份中恢复某个库和某张表 一.全库备份-A [root@mha2 backup]#mysqldump -uroot -p123456 --default-character-set=u ...

  6. C++编译连接过程中关于符号表的报错分析

    是这样的,在学习郑莉老师的多文件结构和编译预处理命令章节时候,看到书里有这么一张图描述如下:#include指令作用是将指定的文件嵌入到当前源文件中#include指令所在的位置. 然后我就想5_10 ...

  7. 恢复oracle中误删除drop掉的表 闪回的方法

    恢复oracle中误删除drop掉的表   查看回收站中表 --需要在其所在用户下查询 回收站对象 select object_name,original_name,partition_name,ty ...

  8. 从MySQL全库备份中恢复某个库和某张表

    在Mysqldump官方工具中,如何只恢复某个库呢? 全库备份 [root@HE1 ~]# mysqldump -uroot -p --single-transaction -A --master-d ...

  9. Mysql误删表中数据与误删表的恢复方法

    由于头两天面试时被问了这样一个问题,如果某同事误删了某个表,你该怎么恢复? 当时想了一下,因为博主没有遇到过这个问题,但是也多少了解一些,所以就回答通过mysql的binlog日志进行恢复. 面试官当 ...

随机推荐

  1. bzoj 1083 繁忙的都市

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1083 题解: 在bzoj里能遇到如此如此水的题真是不容易…… 乍一看好像有点吓人,其实是一 ...

  2. Vue项目实现excel导出

    1.package.json里面安装三个插件 npm install  xlsx  --save npm install  script-loader  –save-dev npm install   ...

  3. java基础18 String字符串和Object类(以及“equals” 和 “==”的解析)

    一.String字符串 问:笔试题:new String("abc")创建了几个对象?答:两个对象,一个对象是 位于堆内存,一个对象位于字符串常量池 class Demo17 { ...

  4. matlab随笔

    主要是记录一些函数.(博客园的一些操作实在是太不方便了) cat函数:http://blog.sina.com.cn/s/blog_6b7dfd9d0100mnz7.html 联结两个数组 magic ...

  5. Oracle学习笔记:11g服务介绍及哪些服务必须开启?

    由于工作环境中oracle版本为10g,不支持行转列函数pivot,特在自己电脑上安装了oracle 11g,但因为不经常使用,便把服务自动启动给关闭了,只在需要使用时手动启动,因此记录一下需要启动的 ...

  6. switch case语句

    五.switch case语句 1.格式 Switch(表达式) { case 表达式:语句块 break: … default break: } 2.例题 输入年份.月份.日期,判断是否是闰年,并且 ...

  7. spring-boot分环境打包为war包

    1.启动类修改 @EnableSwagger2 @SpringBootApplication public class CustWebAcApplication extends SpringBootS ...

  8. Spark(三)RDD与广播变量、累加器

    一.RDD的概述 1.1 什么是RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可 ...

  9. GMM与EM算法

    用EM算法估计GMM模型参数 参考  西瓜书 再看下算法流程

  10. HTTP Status 500 - Request processing failed; nested exception is org.apache.ibatis.binding.BindingException

    在使用Maven工程管理工具整合SSM框架时,Mybatis使用逆向工程生成的pojo,mapper接口及映射文件,把mapper接口和映射文件放在DAO工程的同一级src/main/java目录下. ...