文章目录

  • 起因
  • 方案
  • 过程
    • 添加命名空间
    • 在静态库上直接修改
      • objcopy
      • objconv
      • LIEF
      • nm + 源码修改

起因

有个项目有使用加密数据库的需求,便想到了SQLCipher,移动端关系型数据库加密的解决方案,似乎是唯一的开源可用的解决方案。SQLCipher是用C语言开发的,悲剧开始了

  • C语言没有命名空间的概念
  • SQLCipher的对外接口(API)和SQLite对外接口(API)命名完全一致,这便要求SQLCipherSQLite只能链接一个
  • 项目方要求不能移除对SQLite的链接(别问理由)

于是折腾便开始了。

方案

要解决这个问题,无非就两条路

  • 替换SQLCipher,改用其他加密数据库解决方案
  • 修改SQLCipher的对外接口命名,以使和SQLite不产生链接冲突

SQLCipher的替换方案,没找到开源的,遂放弃;于是开始了SQLCipher接口命名修改的工作

过程

添加命名空间

首先想到的使,用C++改写SQLCipher,函数和变量名不改,只增加一个命名空间。
于是动手:
1、将.c文件全部重命名为.cpp文件
2、在源码文件中添加namespace xxxxx {}
3、修复编译错误

其中,第2步骤,很是费眼,因为SQLCipher源码中有大量的宏分支,会导致namespace xxxxx {}的插入位置很容易错落;第3步骤,更是一个体力活。
我吭哧吭哧忙活了一周,编译倒是通过了,链接总是报奇奇怪怪的错误,遂放弃;
其实,放弃的理由是:我不能保证添加命名空间后,SQLCipher的原始业务逻辑不变。
当然,这条路是通的,只是很容易出错。

在静态库上直接修改

原理是很清楚的,直接修改静态库的符号表,保证SQLCipherSQLite不重复就行。
一番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)
只要保证SQLCipherSQLite可导出符号不重复就行。
怎么判断是否可导出呢?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静态库的符号表相关推荐

  1. 【符号修改-X264系列】之根据静态库强符号修改代码工具

    目录描述 序 方法 1.config.txt 2.shell脚本 附录A A1.linux find中的-print0和xargs中-0的奥妙 A2.通过shell执行perl语句 A3.shell中 ...

  2. 深入iOS系统底层之静态库介绍

    少长咸集,群贤毕至.--<王羲之・兰亭集序> 目标文件 目标文件结构 程序员编写的是源代码,而计算机运行的则是CPU能识别的机器指令,因此必须要有一系列工具或程序来将源代码转化为机器指令, ...

  3. oc 协议 回调 静态成员_深入iOS系统底层之静态库

    少长咸集,群贤毕至.--<王羲之・兰亭集序> 目标文件 目标文件结构 程序员编写的是源代码,而计算机运行的则是CPU能识别的机器指令,因此必须要有一系列工具或程序来将源代码转化为机器指令, ...

  4. 与符号表分离程序或动态库, 如何用GDB调试

    1       Debugging Information in Separate Files GDB支持用户将程序调试信息放在一个独立的文件里,而不是和可执行程序在一个文件中,GDB可以某种方式来查 ...

  5. Linux 动态库和静态库

    From:http://blog.csdn.net/u010977122/article/details/52958330 From:http://blog.163.com/xychenbaihu@y ...

  6. ar nm ldd 静态库 动态库

    一.ar的基本用法 ar命令可以用来创建.修改库,也可以从库中提出单个模块.库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member).原始文件的内容.模式.时间 ...

  7. linux下静态库、动态库总结

    一.基本概念 1.1.什么是库        在 windows 平台和 linux 平台下都大量存在着库. 本质上来说库是一种可执行的二进制代码(但不可以独立执行),可以被操作系统载入内存执行. 由 ...

  8. 【C C++】静态库和动态库

    在嵌入式开发中,"库"是我们非常熟悉的一个词,在针对Linux这边目标平台进行开发时,静态库和动态库都会涉及到.而对目标平台为RTOS这类小系统时,常用到的静态库的方式 基本概念, ...

  9. 关于linux下制作静态库

    本小测试程序是从<<linux程序设计第4版>>摘录: 直接入正正题: 我们要创建一个表态库,libfoo.a 所用文件: fred.c bill.c 其中fred.c代码如下 ...

最新文章

  1. linux install goolepinyin_Linux截图工具推荐(Ubuntu 18.04亲测)
  2. ARKit如何将太阳系装进iPhone(二)
  3. java 如何计算数据库_java – 如何在我的数据库中计算这些变量?
  4. WebStorm 2018版本破解方法
  5. 数据库自增主键可能产生的问题
  6. linux oracle目录权限不够,Linux 目录权限不足导致ORA-39070错误 | 信春哥,系统稳,闭眼上线不回滚!...
  7. RuntimeError: Failed to register operator torchvision::_new_empty_tensor_op. +torchtorchversion版本匹配
  8. AppScan 下载地址
  9. 数学建模入门篇(新手必看)
  10. python切片详解_python切片及sys.argv[]用法详解
  11. 色彩设计原理(里面有配色方案,也有配色网站)
  12. KODI(XBMC)-基于树莓派的媒体中心使用-Libreelec
  13. 太难了 | 2019年互联网寒冬,如何防止自己被裁员失业?
  14. 论文Robust Range Estimation with a Monocular Camera for Vision-Based FCW System解读
  15. 使用uniapp做海报的坑
  16. OPPO A96 参数配置
  17. ARGB_8888(ARGB32)色彩格式
  18. 【解决问题】The bean ‘admin-service.FeignClientSpecification‘ could not be registered.
  19. 清华刘知远亲授「自然语言处理」
  20. Chromium 基础库使用说明(入门必看)

热门文章

  1. 北京小学 计算机派位,北京小升初东西海朝4区电脑派位规则汇总 2021家长必看...
  2. 【七夕活动精选】致你的七夕礼物——3D Heart,跳动的 3D 爱心
  3. 向上的路,从来都不好走(好文力荐)
  4. 提示计算机未安装flash,win10系统提示未安装Flash的解决方法
  5. RFX2401C 2.4GHz功放PA前端模块
  6. 淘宝关注的主播查询教程(2021)
  7. plt_iris Matplotlib画图参数 Numpy 莺尾花演示
  8. [redis]Redis ZSet排序问题(排名实现按时间顺序排布)
  9. 虚幻4地形怎么增加层_腾讯首款虚幻4沙盘战略手游上线:全面3D化
  10. 玩传奇的伙计们,很久没发朋友圈了吧,今天给大家找到一些朋友圈高逼格文案。