如何使 GCC 将 .text 部分编译为 ELF 二进制文件中的可写部分?

2024-02-24

我希望能够动态更改我正在使用的库中的可执行代码。本质上,我想动态地 NOP 掉某些不需要的函数。

但是,我正在使用的库的 .text 部分是不可写的(大多数程序都是如此)。我有该库的源代码,因此想使用 GCC 将其编译为可写。

有没有办法做到这一点?


从一般意义上来说,mprotect是首选(在符合 POSIX 的系统上)sys/mman.h (check http://linux.die.net/man/2/mprotect http://linux.die.net/man/2/mprotect)。只需获取进程可执行部分的地址和系统页数并调用mprotect请求许可权限;写信给它;然后,打电话mprotect再次释放写权限。

然而,如果这意味着速度是绝对重要的低级例程(或mprotect不可用)那么你需要用它的编译库.text调用时可写的部分mprotect最有可能的问题是转换后备缓冲区 (TLB) 刷新(特别是在多处理器环境中)可能并且将会导致瓶颈。如果特定系统通过分页使用硬件保护(现在几乎都是这样),那么更改保护的唯一方法是执行 TLB 刷新,该刷新必须在每个引用的页、引用的页表(页组)、引用的页上执行。页目录(页表组)和每个处理器。最重要的是,这必须在环 0 中执行,这需要一个系统调用,该系统调用只是将樱桃放在顶部以增加开销。

在后一种情况下,最简单的解决方案是正常编译库,然后objcopy它与--writable-text(正如 ggiroux 所提到的)。

另一种解决方案是定义链接器映射文件linker.ld你自己。然后您可以明确指定任何部分的权限。它不太复杂;如果依赖于系统。请参阅文档:http://www.math.utah.edu/docs/info/ld_3.html http://www.math.utah.edu/docs/info/ld_3.html。您还可以查看您提供的系统linker.ld文件并从那里修改它。通过-Wl,--verboseto gcc 将指示链接器吐出所有相关文件(包括其默认的 linker.ld),然后您可以在其中修改 .text 部分的权限并使用新的重新编译库(永远)linker.ld file.

总而言之,我的建议是按照最后一段所述进行操作,并使用稍作修改的链接器脚本来编译您的库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 GCC 将 .text 部分编译为 ELF 二进制文件中的可写部分? 的相关文章

  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用

随机推荐

  • 使用 jQuery,如何选择元素 id 以某个字符串结尾的所有元素?

    使用jQuery 如何选择其中的所有元素id属性以某个字符串结尾 有一个属性结尾为选择器 attr value http api jquery com attribute ends with selector 像这样 id somethin
  • 当重叠很少时找到重叠间隔

    我有一个巨大的数据库表n整数区间 例如 1 5 4 16 6434 114343 并且需要找出哪些间隔相互重叠 有丰富的SO的类似问题 https stackoverflow com questions 4542892 possible i
  • 为什么单字母 UDF 名称不能使用 C 或 R?

    我可以编写以下有效的 VBA 函数 Public Function C As Long C 5 End Function Public Function R As Long R 6 End Function 但如果不使用 VBA 项目或模块
  • 为什么将列表作为参数传递比传递生成器性能更好?

    我正在回答这个问题 https stackoverflow com questions 59925390 how to count different elements in list of lists 59925564 noredirec
  • 将点平面分成相等的两半[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 给定一个二维平面 其中有 n 个点 我需要生成一条线的方程 该线将平面分开 使得一侧有 n 2 个点 另一侧有 n 2 个点 我假设这些点
  • Rails - params[:commit] 的目的是什么

    我注意到 每次将 Rails 表单发送到服务器时 提交按钮的名称 通常是按钮上显示的字符串 都会包含在params散列为 提交 例如 最后一个条目 utf8 gt authenticity token gt eZABpBuW7afziDMU
  • 字符串函数如何计算字符串行中的分隔符

    我有一个如下所示的字符串行 A B C D E F G H I J K L M 这意味着分隔符 计数为 12 这条线是有效的 现在假设您有以下行 A B C D E F G H 该行也是有效的 因为它包含 12 个分隔符 其中存在 8 个值
  • Grails 和 SQLite

    尝试让 SQLite 与 grails 一起工作 我在网上找到的东西似乎有点过时 对 ivy 和插件等的引用 但基于这些 http stackoverflow com questions 1199512 grails sqlite http
  • 为什么js字符串中的标签会被验证

    我有以下页面 在我的对象的 someHTML 属性中字符串中的标签 但浏览器将其读取为实际的关闭标记并关闭脚本元素 我在
  • 比较 jQuery 对象

    我正在使用选择器来获取一组对象 0 个或更多 var openMenus Triggers filter trigger hover 然后我有一个事件附加到一个项目 该项目可能位于也可能不位于上面的对象中 在该事件中 我想将触发事件的项目与
  • Rails 3 禁用会话 cookie

    我在 RoR 3 上编写了 RESTful API 我必须使我的应用程序不发送 Set Cookie header 客户端使用 auth token 参数进行授权 我尝试过使用session off and reset session但这没
  • 在应用程序中插入“在 iTunes 上下载”按钮

    我的应用程序显示某首歌曲的标题 我想插入一个 在 iTunes 上下载 按钮 该按钮可以在我的 iPhone 上打开 iTunes 并指向我的歌曲 我已经使用以下命令检索了正确的 iTunes 网址iTunes 链接制作工具 http it
  • ipdb、多线程和自动重新加载程序导致ProgrammingError

    我正在使用 ipdb 调试器在本地调试多线程 Web 应用程序 Django Plone 通常 ipdb 似乎会因为我在调试提示符下时发生的自动重新加载而感到困惑 结果堆栈跟踪出现 Users mikko code xxxx venv li
  • 剧作家 + Django:如何等待事件

    在我的测试中 我必须等待事件触发才能继续测试断言 但我不知道如何让 Playwright 等待该事件 剧作家似乎看不到该事件 django 页面的简单示例 单击按钮会触发事件boop改变文档的背景颜色 模板event html
  • ajax在asp.net中的使用

    我对使用哪种方法有点困惑 1 使用Jquery调用实现订单的HttpHandler页面 2 使用 ICALLBACKEventHandler 阅读更多 http www ajaxmatters com 2006 05 using icall
  • Meteor如何在mongo中保存模板

    我想让我的用户能够创建文档模板 合同 电子邮件等 我想出的最好的选择是将这些文档模板存储在 mongo 中 也许我错了 我已经搜索了几个小时 但我不知道如何使用它们的数据上下文呈现这些文档模板 Example Template stored
  • Jupyter 编辑模式下是否有删除行的快捷方式?

    In Jupyter s edit mode is there a shortcut for deleting a line of text Something like Ctrl L in Visual Studio Shift Dele
  • 如何确保分页 REST API 中的数据完整性?

    我目前正在研究 REST API API返回的资源预计是来自数据库的海量数据 数据库中有数千万行 分页是必须的 以避免将数据写入 HTTP 响应时消耗大量内存 当客户端请求之间数据库中存在删除 添加行时 如何确保数据完整性 例如 page
  • Android 共享首选项的空指针异常

    我试图在共享首选项中保存一个整数值 并在应用程序重新启动时再次加载它 我在我的主要活动中创建了一个共享首选项 并尝试在单击菜单项时在另一个菜单侦听器类中保存整数值 菜单侦听器类位于不同的包中 并且菜单侦听器类扩展了主活动 但是当我尝试这样做
  • 如何使 GCC 将 .text 部分编译为 ELF 二进制文件中的可写部分?

    我希望能够动态更改我正在使用的库中的可执行代码 本质上 我想动态地 NOP 掉某些不需要的函数 但是 我正在使用的库的 text 部分是不可写的 大多数程序都是如此 我有该库的源代码 因此想使用 GCC 将其编译为可写 有没有办法做到这一点