折腾修改SQLCipher静态库的符号表
文章目录
- 起因
- 方案
- 过程
- 添加命名空间
- 在静态库上直接修改
- objcopy
- objconv
- LIEF
- nm + 源码修改
起因
有个项目有使用加密数据库的需求,便想到了SQLCipher
,移动端关系型数据库加密的解决方案,似乎是唯一的开源可用的解决方案。SQLCipher
是用C语言开发的,悲剧开始了
- C语言没有命名空间的概念
SQLCipher
的对外接口(API)和SQLite
对外接口(API)命名完全一致,这便要求SQLCipher
和SQLite
只能链接一个- 项目方要求不能移除对
SQLite
的链接(别问理由)
于是折腾便开始了。
方案
要解决这个问题,无非就两条路
- 替换
SQLCipher
,改用其他加密数据库解决方案 - 修改
SQLCipher
的对外接口命名,以使和SQLite
不产生链接冲突
SQLCipher
的替换方案,没找到开源的,遂放弃;于是开始了SQLCipher
接口命名修改的工作
过程
添加命名空间
首先想到的使,用C++
改写SQLCipher
,函数和变量名不改,只增加一个命名空间。
于是动手:
1、将.c
文件全部重命名为.cpp
文件
2、在源码文件中添加namespace xxxxx {}
3、修复编译错误
其中,第2步骤,很是费眼,因为SQLCipher
源码中有大量的宏分支,会导致namespace xxxxx {}
的插入位置很容易错落;第3步骤,更是一个体力活。
我吭哧吭哧忙活了一周,编译倒是通过了,链接总是报奇奇怪怪的错误,遂放弃;
其实,放弃的理由是:我不能保证添加命名空间后,SQLCipher
的原始业务逻辑不变。
当然,这条路是通的,只是很容易出错。
在静态库上直接修改
原理是很清楚的,直接修改静态库的符号表,保证SQLCipher
和SQLite
不重复就行。
一番google和baidu,结果如下
objcopy
当我看到这个命令的介绍时,感觉胜利在望
objcopy --prefix-symbols xxx libA libB
这是给libA的所有符号加前缀,生成libB。看到这里是不是很有希望?
当真证运行时,心情立马就不好了
objcopy:sqlcipher(i386): Unable to recognise the format of file: file format not recognized
......
......
......
objcopy:armv7.a(alter.o)[.text]: relocation count is negative: file in wrong format
我是在max os上运行的,而objcopy
主要用于ELF
格式的文件,尚不支持Mach-O
文件。
我窃窃的遐想如果用GCC生成ELF格式SQLCipher库呢?
,没有做验证。
objconv
也是感觉胜利在望
objconv
对Mach-O文件全面支持,可以在Mach-O,ELF,COFF和OMF格式之间转换目标文件和库/归档文件,更改对象文件中的符号名称… https://www.agner.org/optimize/objconv-instructions.pdf
但是只实现了x86 和x86-64,对ARM系列完全不支持。
LIEF
https://lief.quarkslab.com/doc/latest/Intro.html
看了介绍,这次感觉真是信心满满。这个库支持以编程的方式修改符号表(甚至更多)。
很可惜,我真实运行时,没有走通,解析Mach-O文件没有成功。
nm + 源码修改
这是多种尝试之后总结出来的。
最初添加命名空间
的大方向是没有问题的,问题在于我修改了所有的符号。
其实,静态库中的符号可以分为局部符号
和全局符号
,或者不可导出符号(unexported_symbol)
和可导出符号(exported_symbol)
。
只要保证SQLCipher
和SQLite
的可导出符号
不重复就行。
怎么判断是否可导出呢?nm命令帮忙。
nm lib库
看输出
截取一部分000000f4 t _sqlcipher_cc_random
00000210 t _sqlcipher_cc_set_cipher
00000000 T _sqlcipher_cc_setup
其中 小写字母(t), 代表该符号是 TEXT段的局部符号
;大写字母(T),代表该符号是 TEXT段的全局符号
以上面为例:
局部符号
_sqlcipher_cc_random、_sqlcipher_cc_set_cipher全局符号
_sqlcipher_cc_setup
下面在源代码中搜索对应符号;当然,直接搜索是搜索不到的,需要把前面的下划线去掉,如搜索,sqlcipher_cc_random、sqlcipher_cc_set_cipher、sqlcipher_cc_setup;去掉的原因是和C语言编译器的符号修饰有关。
搜索到之后呢?当然替换啦,例如加个前缀,或者后缀之类的。然后,重新编译。
要问批量搜素替换怎么办?写个脚本又不费事。
好了,至此结束。
折腾修改SQLCipher静态库的符号表相关推荐
- 【符号修改-X264系列】之根据静态库强符号修改代码工具
目录描述 序 方法 1.config.txt 2.shell脚本 附录A A1.linux find中的-print0和xargs中-0的奥妙 A2.通过shell执行perl语句 A3.shell中 ...
- 深入iOS系统底层之静态库介绍
少长咸集,群贤毕至.--<王羲之・兰亭集序> 目标文件 目标文件结构 程序员编写的是源代码,而计算机运行的则是CPU能识别的机器指令,因此必须要有一系列工具或程序来将源代码转化为机器指令, ...
- oc 协议 回调 静态成员_深入iOS系统底层之静态库
少长咸集,群贤毕至.--<王羲之・兰亭集序> 目标文件 目标文件结构 程序员编写的是源代码,而计算机运行的则是CPU能识别的机器指令,因此必须要有一系列工具或程序来将源代码转化为机器指令, ...
- 与符号表分离程序或动态库, 如何用GDB调试
1 Debugging Information in Separate Files GDB支持用户将程序调试信息放在一个独立的文件里,而不是和可执行程序在一个文件中,GDB可以某种方式来查 ...
- Linux 动态库和静态库
From:http://blog.csdn.net/u010977122/article/details/52958330 From:http://blog.163.com/xychenbaihu@y ...
- ar nm ldd 静态库 动态库
一.ar的基本用法 ar命令可以用来创建.修改库,也可以从库中提出单个模块.库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member).原始文件的内容.模式.时间 ...
- linux下静态库、动态库总结
一.基本概念 1.1.什么是库 在 windows 平台和 linux 平台下都大量存在着库. 本质上来说库是一种可执行的二进制代码(但不可以独立执行),可以被操作系统载入内存执行. 由 ...
- 【C C++】静态库和动态库
在嵌入式开发中,"库"是我们非常熟悉的一个词,在针对Linux这边目标平台进行开发时,静态库和动态库都会涉及到.而对目标平台为RTOS这类小系统时,常用到的静态库的方式 基本概念, ...
- 关于linux下制作静态库
本小测试程序是从<<linux程序设计第4版>>摘录: 直接入正正题: 我们要创建一个表态库,libfoo.a 所用文件: fred.c bill.c 其中fred.c代码如下 ...
最新文章
- linux install goolepinyin_Linux截图工具推荐(Ubuntu 18.04亲测)
- ARKit如何将太阳系装进iPhone(二)
- java 如何计算数据库_java – 如何在我的数据库中计算这些变量?
- WebStorm 2018版本破解方法
- 数据库自增主键可能产生的问题
- linux oracle目录权限不够,Linux 目录权限不足导致ORA-39070错误 | 信春哥,系统稳,闭眼上线不回滚!...
- RuntimeError: Failed to register operator torchvision::_new_empty_tensor_op. +torchtorchversion版本匹配
- AppScan 下载地址
- 数学建模入门篇(新手必看)
- python切片详解_python切片及sys.argv[]用法详解
- 色彩设计原理(里面有配色方案,也有配色网站)
- KODI(XBMC)-基于树莓派的媒体中心使用-Libreelec
- 太难了 | 2019年互联网寒冬,如何防止自己被裁员失业?
- 论文Robust Range Estimation with a Monocular Camera for Vision-Based FCW System解读
- 使用uniapp做海报的坑
- OPPO A96 参数配置
- ARGB_8888(ARGB32)色彩格式
- 【解决问题】The bean ‘admin-service.FeignClientSpecification‘ could not be registered.
- 清华刘知远亲授「自然语言处理」
- Chromium 基础库使用说明(入门必看)
热门文章
- 北京小学 计算机派位,北京小升初东西海朝4区电脑派位规则汇总 2021家长必看...
- 【七夕活动精选】致你的七夕礼物——3D Heart,跳动的 3D 爱心
- 向上的路,从来都不好走(好文力荐)
- 提示计算机未安装flash,win10系统提示未安装Flash的解决方法
- RFX2401C 2.4GHz功放PA前端模块
- 淘宝关注的主播查询教程(2021)
- plt_iris Matplotlib画图参数 Numpy 莺尾花演示
- [redis]Redis ZSet排序问题(排名实现按时间顺序排布)
- 虚幻4地形怎么增加层_腾讯首款虚幻4沙盘战略手游上线:全面3D化
- 玩传奇的伙计们,很久没发朋友圈了吧,今天给大家找到一些朋友圈高逼格文案。