x86 区分指令和数据的方法

2024-03-29

是否有一种或多或少可靠的方法来判断内存中某个位置的数据是处理器指令的开头还是其他数据?

例如,E8 3F BD 6A 00 may be call操作说明 (E8) 相对偏移量为0x6ABD3F,或者它可能是属于其他指令的三个字节的数据,后跟push 0 (6A 00).

我知道这个问题听起来很愚蠢,而且可能没有简单的方法,但也许指令集是在设计时考虑到这个问题的,也许一些简单的代码检查该位置周围的 +-100 字节可以给出很可能正确的答案。

我想知道这一点,因为我扫描程序的代码,并将对某些函数的所有调用替换为对我的替换函数的调用。到目前为止它正在工作,但在某些时候,当我增加要替换的函数数量时,一些数据看起来就像对该确切地址的函数调用一样,并且将被替换,这将导致程序以最意想不到的方式打破。我想降低这种可能性。


如果它是您的代码(或保留链接和调试信息的另一代码),最好的方法是扫描目标文件中的符号/重定位表。否则没有可靠的方法来确定某个字节是指令还是数据。

限定数据的最有效方法可能是递归反汇编。 IE。从入口点和找到的所有跳转目的地反汇编代码。但这并不完全可靠,因为它不会遍历跳转表(您可以尝试为此使用一些启发式方法,但这也不完全可靠)。

问题的解决方案是修补函数本身被替换:用函数的跳转指令覆盖其开头。

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

x86 区分指令和数据的方法 的相关文章

随机推荐

  • 关于在 Perl 中将混合编码文件转换为 UTF8 的问题

    我正在将我们大学中国研究系古老的基于 DOS 的图书馆程序生成的文件转换为更有用和更易于访问的文件 我正在处理的问题之一是导出的文本文件 大小约为 80MB 采用混合编码 我在 Windows 上 我认为德语元音变音和其他高级 ASCII
  • 如何为 SwiftUI 列表中的各个行设置动画?

    我想显示一个列表 其中每一行都显示不透明动画并且延迟逐渐增加 因此 第一行应在 0 1 秒后出现 第二行应在 0 3 秒后出现 第三行应在 0 5 秒后出现 依此类推 我尝试了以下方法 但它不起作用 因为所有行都会同时出现并且没有动画 任何
  • 分布式环境中会话ID的唯一性?

    我们正在使用 Spring Session 由关键的 Gemfire 备份 来运行在分布式环境中的 Spring Boot 应用程序 在这样的分布式环境中 Spring Session 是否确保新的会话使用唯一的会话 id 跨不同 JVM
  • 图表中的最小损坏成本

    给定一个图 G V E 其中有 N 个节点 编号从 0 到 N 1 并且恰好为 N 1 双向边缘 图中的每条边都有一个正成本 C u v 边缘权重 整个图是这样的任何一对节点之间都有唯一的路径 我认为改进的 Kruskal 是正确的选择 取
  • DateTimePicker 永远不会更新!

    我有一些DateTimePicker是一种永不更新的形式 我试过了Value and Text Invalidate 进而Update 并且Refresh 从当前日期开始 他们的价值观似乎没有任何改变 无论我设置什么 当前日期都是 相对 今
  • 自动登录其他网站的php脚本

    我想要一个脚本 通过它我可以登录其他网站而无需打开他们的登录页面 场景是这样的 我不想将登录 ID 和密码提供给他人 他们只需单击链接或按钮 脚本就会完成其工作 它将传递所需的登录 ID 和密码 并提交登录表单并登录 并且客户端拥有所有凭据
  • 如何使用单个bat文件传递动态参数来运行一个exe

    我需要运行一个 EXE 它将采用 7 个参数 其中一个参数是动态的 有人可以帮助我如何通过使用bat文件传递动态参数来运行EXE吗 谢谢 柴塔尼亚 如果您需要执行带有动态数量参数的命令 您可以使用 命令示例 foo exe options
  • C 变量名定义中使用下划线的原因是什么?

    我试图了解开发人员何时需要定义C前面带有 的变量 其原因何在 例如 uint32 t xyz 0 也许这有帮助 来自 C99 7 1 3 保留标识符 所有以下划线和大写字母或其他字母开头的标识符 下划线始终保留用于任何用途 所有以下划线开头
  • 如何解释 Google perf 工具 CPU 分析器中的地址

    我的 C 程序消耗大量 CPU 并且在运行时消耗更多 我使用 Google 性能工具来分析 CPU 使用情况 这就是我得到的结果 pprof top Total 1343 samples 1330 99 0 99 0 1330 99 0 0
  • 是否可以让ScrollView滚动到底部?

    对于一个类似聊天的应用程序 我想保留一个ScrollView组件滚动到底部 因为最新消息出现在旧消息下方 我们可以调整a的滚动位置吗ScrollView For React Native 0 41 及更高版本 您可以使用内置的scrollT
  • 如何获取 Spring Boot 应用程序建立的活动数据库连接数

    我已经使用 Oracle 数据源构建了一个 Spring Boot 应用程序 我需要在日志语句中打印总活动连接 如何获取活动连接 注意 不是最大活动连接数 它应该是 特定时间 实例的活动连接数 DataSource dataSource D
  • iOS 金属线宽

    我想设置我在金属中绘制的线条的宽度 我可以设置一个点的大小point size正如所解释的here https developer apple com library prerelease ios documentation Metal R
  • node js 从 URL 获取 Zip 并上传到 Google 云端硬盘

    我正在尝试从网址获取 zip 文件 以便在下一步中将其上传到 Google 云端硬盘 但我的代码不起作用 The method to get the zip File from the url function getFile var fi
  • python Tkinter() 如何隐藏 UI

    嗨 我正在使用 Tkinter 在 python 中开发单个登录 我只希望当用户正确登录时 登录 UI 将被隐藏 内容 UI 将显示 所以我认为 ui 可以隐藏或者可见性将被隐藏 例如我有这个代码 def httpGETCheck user
  • Magento - 重新索引过程存在问题 - 目录产品 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我刚刚重新索引了运行 v1 6 的 Magenot 安装上的数据 现在我收到一条消息 指出 There was a pr
  • 图像/视频序列中的模糊检测

    我在 photo stackexchange 上问过这个问题 但认为它也可能在这里相关 因为我想在我的实现中以编程方式实现这个问题 我正在尝试为我的成像 管道实现模糊检测算法 我想要检测的模糊是 1 相机抖动 当快门速度较低时 用手移动 抖
  • Oracle 12c - 删除表和所有关联的分区

    我在 Oracle 12c 中创建了表 t1 表有数据 它在列表分区上分区 并且还有子分区 现在我想删除整个表和所有关联的分区 和子分区 这是删除全部的正确命令吗 DROP TABLE t1 PURGE 语法是正确的 但不是优选的 只需删除
  • 将字符串标记为 HTML 安全

    我正在尝试构建我的第一个 Rails 应用程序 并且正在使用瑞恩 希思 Ryan Heath 的 navigation helper https github com rpheath navigation helper插件为我提供导航中的当
  • VSCode python 扩展:如何禁用插入导入语句的自动完成功能?

    在 VS Code 的 Python 扩展中 我有时发现自动完成功能可以包含尚未导入到我正在编辑的文件中的选项 当选择这些选项之一时 导入有时会在没有通知的情况下插入到模块的顶部 虽然我可以看到此功能中的实用程序 但我不太喜欢这种行为 因为
  • x86 区分指令和数据的方法

    是否有一种或多或少可靠的方法来判断内存中某个位置的数据是处理器指令的开头还是其他数据 例如 E8 3F BD 6A 00 may be call操作说明 E8 相对偏移量为0x6ABD3F 或者它可能是属于其他指令的三个字节的数据 后跟pu