恢复二进制文件中的block符号表
前篇博客中,使用 杨君的小黑屋 提供的工具恢复二进制文件的符号表,只恢复了函数的符号表,本篇讲述如何恢复block符号表,杨君的博客中使用IDA分析二进制文件,本篇则使用MacOS系统上体验也不错的Hopper来作分析。
使用工具:
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函数地址与名字的对应关系,再将此关系恢复到二进制文件中。
原理:
全局的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) +
附件:
参考 & 感谢
杨君的小黑屋 http://blog.imjun.net/posts/restore-symbol-of-iOS-app/
本文地址:http://www.cnblogs.com/ciml/p/7698271.html
恢复二进制文件中的block符号表的更多相关文章
- 如何恢复oracle中已删除的表
在9i中Oracle引入了flashback的概念,可以将数据返回到某个时间点,但对于诸如drop/truncate等DDL语句却尚不支持.进入Oracle10g,这一缺陷得到了弥补.可以将丢失掉的表 ...
- iOS 符号表恢复 & 逆向支付宝
推荐序 本文介绍了恢复符号表的技巧,并且利用该技巧实现了在 Xcode 中对目标程序下符号断点调试,该技巧可以显著地减少逆向分析时间.在文章的最后,作者以支付宝为例,展示出通过在 UIAlertVie ...
- windbg加载符号表
0x00 前言 在使用windbg调试windows中的程序时会经常碰到一些系统的dll里面的一些函数调用,有些函数是没有具体函数名的,这对于调试非常不利,基于此,微软针对windows也发布了很多系 ...
- 恢复oracle中误删除drop掉的表
查看回收站中表 select object_name,original_name,partition_name,type,ts_name,createtime,droptime from recycl ...
- 从MySQL全库备份中恢复某个库和某张表【转】
从MySQL全库备份中恢复某个库和某张表 一.全库备份-A [root@mha2 backup]#mysqldump -uroot -p123456 --default-character-set=u ...
- C++编译连接过程中关于符号表的报错分析
是这样的,在学习郑莉老师的多文件结构和编译预处理命令章节时候,看到书里有这么一张图描述如下:#include指令作用是将指定的文件嵌入到当前源文件中#include指令所在的位置. 然后我就想5_10 ...
- 恢复oracle中误删除drop掉的表 闪回的方法
恢复oracle中误删除drop掉的表 查看回收站中表 --需要在其所在用户下查询 回收站对象 select object_name,original_name,partition_name,ty ...
- 从MySQL全库备份中恢复某个库和某张表
在Mysqldump官方工具中,如何只恢复某个库呢? 全库备份 [root@HE1 ~]# mysqldump -uroot -p --single-transaction -A --master-d ...
- Mysql误删表中数据与误删表的恢复方法
由于头两天面试时被问了这样一个问题,如果某同事误删了某个表,你该怎么恢复? 当时想了一下,因为博主没有遇到过这个问题,但是也多少了解一些,所以就回答通过mysql的binlog日志进行恢复. 面试官当 ...
随机推荐
- 数据库——mysql如何获取当前时间
1.1 获得当前日期+时间(date + time)函数:now() 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数: current_timestamp() curren ...
- Ubuntu下使用Nginx+uWSGI+Flask(初体验)
Ubuntu 18.04,Nginx 1.14.0, uWSGI 2.0.17.1,Flask, 前言 Windows不支持uWSGI!为了上线自己的项目,只能选择Linux. 自己前面开发了一个Fl ...
- js自定义鼠标右键菜单
document.oncontextmenu = function(e) { return false; } document.onmousedown = function(e) { switch(e ...
- java基础39 增强for循环(也叫foreach循环)
增强for循环是jdk1.5出现的新功能 1.增强for循环的作用 简化了迭代器的书写格式(注意:增强for循环底层还是使用了迭代器遍历) 2.增强for循环的格式 for(数据类型 变量名:遍历的目 ...
- mac系统安装redis
1.下载 打开官网:https://redis.io/ Download---Stable---Download3.2.8,下载最新稳定版,这里是3.2.8 2.安装 下载完成后,打开命令行工具,执行 ...
- WinScp几个极大提高开发效率的小功能
WinSCP 是一个 Windows 环境下使用 SSH 的开源图形化 SFTP 客户端.同时支持 SCP 协议.它的主要功能就是在本地与远程计算机间安全的复制文件. 最近研究了一下winscp的一些 ...
- java容器---Comparable & Comparator
1.接口Comparable<T> API 参数类型:T ---可以与此对象进行比较的那些对象的类型 此接口强行对实现它的每个类的对象进行整体排序.这种排序被称为类的自然排序,类的c ...
- SQL Server和Access数据读写
1.查询Access中数据的方法: select * from OpenRowSet('microsoft.jet.oledb.4.0',';database=c:/db2.mdb','select ...
- 【TensorFlow】一文弄懂CNN中的padding参数
在深度学习的图像识别领域中,我们经常使用卷积神经网络CNN来对图像进行特征提取,当我们使用TensorFlow搭建自己的CNN时,一般会使用TensorFlow中的卷积函数和池化函数来对图像进行卷积和 ...
- 12 打印1到最大的n位数
输入数字 n,按顺序打印出从 1 最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数即 999.由于 n 可能会非常大,因此不能直接用 int 表示数字,而是用 cha ...