处理mach-o和pe二进制文件的工具

machomachomangler的Python项目详细描述


Macho-O功能

一些相当专业(和复杂)的机械加工工具 要支持Pynativelib提案,请执行 允许本机库作为独立的控制盘文件分发。具体包括:

  • 对于pynativelib库:一个使用dylib和mangling的工具 规则,并将损坏规则应用于所有导出的 符号。例如,它可以转换导出ssl new的库 将 pynativelib_openssl_u ssl_new导出到其中。它也 在库id处更改它,例如从 ssl.dylib ->; pynativelib_openssl_u ssl.dylib (类似于安装名称工具 -id

    另外:创建"占位符"库的工具 导入上述损坏的库,然后重新导出 原始名称下的符号。

  • 对于希望使用pynativelib库的代码:一个 获取一个dylib/bundle/executable,一个"原始"dylibs的列表,以及 对于每个"原始"dylib,该dylib的新名称,以及 破坏规则。然后(a)替换原始 具有从 不存在的目录,(b)将其标记为"弱"导入,(c) 将损坏规则应用于从该dylib导入的所有符号, (d)标记这些符号,以便在平面名称空间中查找。

事实证明,事物的精确组合是唯一的方法 由MacOS链接器/加载器提供,以链接dylib/bundle 相对于dylib b,其中a和b在磁盘上的相对位置不是 在可执行文件启动之前已知,同时保留通常的 避免符号冲突的两级命名空间规则。我保证 一旦我有机会把它写好,一切都会有意义的…

mach-o损坏代码的一些已知限制:

  • 不出所料,这种修补程序在代码中并不适用。 签署。代码不带签名的特殊情况; 他们可能会搞砸的。如果你想签你的 二进制文件,然后在签署之前先进行损坏。
  • 我们目前只重写了新样式的dyld_info符号表 (在10.5中引入),而不是(几乎?)完全多余 符号表。(有趣的事实:所有的mach-o二进制文件 包括两种完全不同的符号表示 T易物。新的比较紧凑,节省空间,但是 保留旧的以保持兼容性,所以…无论如何。)尽可能 我知道,现代MacOS中唯一还在使用 symtab/dysymtab是dladdr,我认为没有人依赖它 关于dladdr的输出,嗯……有什么事吗?我认为最坏的情况是,你 可能会在调试器中看到原始符号名,或者 剖析器?但如果它变成一个 问题。
  • 它对dyld_info弱绑定表没有任何特殊处理, 或者出口疲软。(注意,这些与 \u属性(弱的)) \u属性(弱的导入)) 或任何 在手册页"i 认为它们是为了实现模糊的链接(这可能是 而不是 灾难性的选择,但我不能百分之百确定 正确–这是mach-o格式中一个令人难以置信的模糊部分,并且 mach-o一开始就很模糊。幸运的是,这个特性 只使用C++库,所以不用它就可以开始。
  • 当管理导入时,我们转换任何惰性导入(需要 (挤进)急切的进口。这是必需的,因为懒人 将导入表的内存布局硬编码到 存根程序集本身中的直接常量,而我没有 感觉像是在尝试自动重写x86-64操作码。相反, 我们把lazy import表单独留下(所以所有未组合的lazy 导入可以继续使用它),并急切地绑定所有损坏的 导入,这样就不会调用未组合的存根。
  • 我注意到MacOS 10.12中的一些新代码dyld强制 烦人的任意限制 dyld_信息出现在文件中。这只会影响 是以10.12作为最低要求的版本构建的,所以对于人们来说 试着为总发行量做些事情这不重要 一段时间。这也不难解决,只是意味着我们会 可能得开始做一些毫无意义的 我们 没有更改的文件位,只是第二个 拷贝可以放在我们更改的文件位之后, 太累了,我还没来得及做。
  • 当管理进口时,我们不检查再出口,这也是 一种进口货。可能应该解决这个问题…

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java 安卓谷歌地图API密钥错误   java现在取代了springhibernate3。罐子   java为什么无法检查当前线程是否持有ReentrantReadWriteLock的读锁?   如何从jruby调用java类的主方法?   Java中的无平方字数组   java文件存在,无法以标准方式读取给定路径,相同的字符串与Groovy不匹配   java首先计算文件的帐户,每分钟发送一个不同的文件   java Ehcache NullPointerException by getEhcache()   安全Java插件7u40不能在将页面留给另一个小程序后加载小程序   Java命令行Mp3简单错误   java如何使用RMQ和spring cloud stream创建基于分区的生产者?   java SAP CF XSUAA服务错误消息:无效重定向<redirect_uri>/login/callback与注册值不匹配   如何在Java中比较两个2D数组?   java ListView为空,为什么?   java从classpath/classloader中重新修订所有用户定义的类   mysql我应该如何管理使用Javaservlet、JSP和Tomcat连接到数据库   java JTextField,不更新来自文件/串行端口的解析数据   java在R.string上迭代。名称   javai如何在项目文件所在的同一文件夹中重新引用Sqlite数据库?