PE - 区分数据和函数导出

2024-01-30

我正在尝试找到一种方法来确定 IDA 中哪些导出是数据导出,哪些是实际函数导出。

For example, let's have a look at Microsoft's msftedit.dll's export entries: enter image description here

While CreateTextServices is a real exported function: enter image description here

IID_IRichEditOle is a data export and IDA fails to realize that, interpeting data as code: enter image description here

有人知道区分两者的可靠方法吗?非常感谢您的帮助。

提前致谢。


没有一种完全可靠的方法可以为每一次导出做到这一点。

每个导出仅指定可执行文件内的偏移量 - 从逻辑上讲,它可以被引用它的任何其他代码视为代码或数据。

正如您所提到的,您可以提出启发式方法来检测几乎所有情况下的导出类型,但是很容易提出不适用于任何给定启发式的反例。以您提出的规则为例:

如果存在,导出的条目将被视为有效的导出函数ret函数中的指令,and有超过<min>有效的指示,andIDA 识别函数的调用约定。

漏报:您可能有一个使用的函数尾调用优化 https://en.wikipedia.org/wiki/Tail_call并以jmp指令而不是ret指示。任何短函数也会失败。 IDA 可能会通过多种方式混淆,导致不将代码视为函数。

误报:内存中可能有一个字符串,后面紧跟着一个C3 or C2 like db 'BACKGAMMON0',0,0C3h-- 这可以在逻辑上反汇编为有效的 11 条指令函数ret并且没有争论。

当您认为导出在逻辑上可以被视为两种代码时,这些界限就更加模糊了and数据:想象一下,导出时的字节序列被复制到动态分配的内存中(甚至可能在另一个进程中),稍后它会作为代码执行。

也许一个合理的建议是只信任 IDA,如果 IDA 认为导出是代码,则将其视为代码。 IDA 的很大一部分功能是自动猜测数据的逻辑类型,并且它通常非常擅长于此。正如你所表明的,有时它是错误的。但无论如何你都无法获得 100% 的准确度。您能做的最好的事情就是在误报和误报之间取得平衡。


该问题不可判定性的证明:

导出是否作为代码执行是不可确定的。导出是否会被读取为数据也是不确定的。由于我们无法保证其中任何一个都是真实的,因此区分看似模棱两可的情况是不可能的。

证明:假设我们有一个预言机A(P,I,E)如果程序返回 1P(包括其所有依赖项)执行(或读取)导出E(从过程中加载的任何DLLP的执行)与“输入”(外部状态)I。否则,返回 0。

让我们构建一个最小程序Z(P,I,E)执行(或读取)导出E(加载到地址空间的 DLL)当且仅当A(P,I,E)返回 0。

现在考虑结果Z(Z,I,E):

If Z(Z,I,E)执行(或读取)导出E, then A(Z,I,E)会返回 1。但是Z(Z,I,E)被定义为not访问导出E unless A(Z,I,E)返回0。这是一个矛盾。

If Z(Z,I,E)不执行(或读取)导出E, then A(Z,I,E)将返回 0。但是Z(Z,I,E)被定义为will访问导出E when A(Z,I,E)返回0。这是一个矛盾。

因此,我们最初的假设是甲骨文A(P,I,E)存在被证明是错误的。


但你可以通过仪器做得更好......

根据您尝试解决的具体问题,您也许能够确定哪些导出在运行时是有效的函数。

例如,您可以编写一个应用程序debugs https://msdn.microsoft.com/en-us/library/ms809754.aspx您要分析和放置的程序保护页 https://msdn.microsoft.com/en-us/library/aa366549(v=vs.85).aspx在包含您想要挂钩的导出的每个页面上。这意味着,每当访问(执行/读取/写入)页面时,都会引发异常,并且调试器程序获得控制权。

调试器可以检查程序上下文以查看进行了何种类型的访问以及它是否与导出有关。如果访问是尝试执行导出,则它可以在将控制权返回给程序之前执行一些挂钩功能。否则,它可能会将控制权返回给程序。

无论哪种情况,PAGE_GUARD每次异常后修饰符都会被解除,因此您每次都需要将其放回原处。

不出所料,这将使您的程序执行非常慢,因为对包含导出的任何页面的任何 R/W/X 访问都会导致昂贵的上下文切换 http://www.linfo.org/context_switch.html-- 这可能包括执行属于导出函数一部分的大多数指令,以及其他一些与它们无关的指令。

您可以对其他仪器工具采取类似的方法,例如Pin https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool.

请注意,您可能无法通过检测获得有关每个导出的使用情况的信息。这是因为您可能需要确定需要什么输入/外部状态才能使程序访问每个导出,以便了解它是用作代码还是用作数据(如果有的话)。

另请注意,执行和读取(甚至写入)访问可能会发生在同一导出上。

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

PE - 区分数据和函数导出 的相关文章

  • 如何为我的 Android Market APK 创建证书?

    我想将我的第一个 APK 应用程序上传到 Android Market 但我收到了此错误 顺便说一下 在 stackoverflow 中搜索时并没有引导我找到正确的链接 市场不接受使用调试证书签名的 APK 创建有效期至少 50 年的新证书
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • 如何确保密钥是在 TPM 内部创建的?

    我需要 在客户端计算机上运行 exe 这将在 TPM 中创建密钥对 然后我将使用 TPM 生成的密钥对的公钥部分创建 CSR 我关心的是如何确保密钥是在 TPM 内部创建的 而不是由欺骗的 TPM 创建的 这将使私钥能够被迁移和复制 我听说
  • forrt1:严重(170):程序异常 - 堆栈溢出

    并提前感谢您的帮助 我已经编译了一个程序 不是我编写的 它在 Mac 上运行得很好 但是当我尝试在 Windows 上执行该程序时 在程序开始执行后不久 我收到以下错误消息 forrt1 严重 170 程序异常 堆栈溢出 我不是 ifort
  • 将调试器附加到 IIS 实例

    我在 XP 计算机上安装了 IIS 5 1 并且安装了 Visual Studio 2005 如何将调试器附加到 IIS 实例 顺便说一句 我没有在正在运行的进程中看到 IIS 进程 或者我可能不知道要查找什么 在视觉工作室中 单击菜单栏中
  • fopen_s 怎么会比 fopen 更安全呢?

    我正在处理遗留代码Windows平台 当我编译代码时VS2013 它给出以下警告 错误 C4996 fopen 该函数或变量可能不安全 考虑使用fopen s反而 要禁用弃用 请使用 CRT SECURE NO WARNINGS 详情请参见
  • 如何从 Qt 应用程序通过 ODBC 连接到 MySQL 数据库?

    我有一个新安装的 MySQL 服务器 它监听 localhost 3306 从 Qt 应用程序连接到它的正确方法是什么 原来我需要将MySQL添加到ODBC数据源 我在遵循这个视频教程后做到了这一点 https youtu be K3GZi
  • 如何告诉 IntelliJ 使用 Java 1.6 JDK 启动 gradle?

    一个简单的问题 即使经过几个小时的尝试和搜索 我也无法弄清楚 我安装了 Java 6 和 7 如何告诉 IntelliJ 使用 JDK 版本 1 6 启动 Gradle 构建 无论我做什么 IntelliJ 都会以以下方式开始我的 grad
  • perfmon 性能计数器是否基于与 xperf 使用的 ETW 事件“幕后”相同的东西?

    我最近开始熟悉 perfmon 和 xperf Perfmon 使用性能计数器 xperf 使用 ETW Windows 事件跟踪 Perfmon 具有提供数据的对象 而 xperf 使用 提供者 组 作为这个领域的新手 我想问是否有人可以
  • LLDB 在地址处中断

    我为这个可能微不足道的问题表示歉意 但我遇到了麻烦 因为谷歌一遍又一遍地给我相同的不适用的答案 我正在尝试在 LLDB 中设置断点 阅读文档后 我可以选择停止在源代码中的某一行或某个符号上 我想要做的是在某个内存位置设置断点 也不读取或写入
  • Windows 上的 Node-Webkit 在 3 个不同的进程中运行?

    如果这是重复的 我很抱歉 我尝试过了Google https www google com search q node webkit three different processes on windows答案 但不是很有帮助 如果我使用运
  • 使用 INF 文件 C++ 以编程方式安装驱动程序

    这里有人可以告诉我如何安装第 3 方设备驱动程序吗 如果提供了所有必需的文件 即 inf 文件 sys 等 则以编程方式进行 这 该解决方案应运行的最低操作系统是Windows2000 我尝试复制 inf文件放入Win文件夹 INF文件夹和
  • 加载配置文件时发生错误:访问路径 c:\Program Files (x86)\... 被拒绝

    我有一个在 Windows 7 上使用 Visual Studio 2010 中的安装程序部署的应用程序 该程序在 Windows 7 和 XP 上部署并运行良好 但当我在 Windows 8 系统上部署它时 出现有关访问配置文件的错误 该
  • 谷歌基准迭代的意义是什么?

    我正在使用 Google Benchmark 来测量某些代码的执行时间 例如 我编写了以下代码来测量其执行时间性能 include
  • 合法管理员如何获取 Active Directory 中的用户密码?

    如果密码以可逆加密方式存储在 Active Directory 中 管理员 开发人员如何提取和解密该密码 具体来说 我指的是this http technet microsoft com en us library cc784581 WS
  • Inno Setup 安装程序的文本编码错误

    对于某些 Windows 安装 我的安装程序 Inno Setup 的俄语文本编码很差 所有机器都安装了Windows XP SP3 英文版 但有些机器可以运行 有些机器则没有 Windows 上有什么设置可以解决这个问题吗 Thanks
  • 如何将 CString 传递给格式字符串 %s?

    class MyString public MyString const std wstring s2 s s2 operator LPCWSTR const return s c str private std wstring s int
  • 发送/捕获 SIGTERM 的 Win32 API 模拟

    在 POSIX OS 下 有信号 API 允许向进程发送信号以将其关闭 使用kill 您可以使用sigaction捕获它并执行您需要的操作 然而 Win32不是POSIX系统 所以 如何处理可能出现的关闭事件 例如来自 任务管理器 中的 结
  • .NET 发布模式构建中是否提供堆栈跟踪信息?

    如果我选择发布模式来构建 dll 堆栈跟踪信息仍然可用吗 如果是的话 那么什么信息is发布模式下不可用 您始终拥有堆栈跟踪信息 这是与构建模式无关的运行时功能 但行号和源文件名通常在发布构建堆栈跟踪中不可用 您可以通过更改构建配置来创建完整

随机推荐

  • 升级到 AngularDart 0.13.0 并收到有关路由和 di 的错误

    我升级到 AngularDart 0 13 0 但收到以下错误 使用新的路由模块初始化 RoutingModule 的正确方法是什么di包2 0 1 In main dart I have class RoutingModule exten
  • 运行时异常 (Chromecast)

    我尝试配置 Chromecast 但收到 RuntimeException 并且不明白原因 Fabric 有日志 致命异常 java lang RuntimeException 无法启动活动 ComponentInfo activity T
  • 在 Google App Engine 上使用 Python 验证 Android 应用内购买消息的签名

    Android 开发人员网站上的示例应用程序使用 java 代码验证购买 json 有没有人有幸弄清楚如何用 python 验证购买 特别是在 GAE 中 以下是android应用内计费的相关摘录示例程序 http developer an
  • 模式浏览器不显示我在 Solr 中添加到 schema.xml 中的字段

    我在 solr v5 1 中创建的名为 Core3 的核心的 schema xml 中添加了一些字段 我不是指示例文件夹 而是使用 服务器 文件夹来运行 solr 服务器并创建 solr 核心 我使用 bin 文件夹中提供的 solr cr
  • MVVM Light WPF 打开新窗口

    我是 MVVM 新手 正在使用 MVVM Light 学习它 我在 wpf 中有一个带有登录窗口的应用程序 当用户输入正确的凭据时 登录窗口应关闭并应打开一个新的主窗口 登录部分已经可以工作 但是如何打开一个新窗口并关闭当前窗口 login
  • F# 中的命令式多态性

    OCaml 的 Hindley Milner 类型系统不允许命令式多态性 类似于 System F 除非通过最近对记录类型的扩展 这同样适用于 F 然而 有时需要将用命令式多态性 例如 Coq 编写的程序翻译成此类语言 Coq 的 OCam
  • Rails 5 多个清单文件的问题

    我的问题 在我的 Rails 5 应用程序中 我有 2 个布局 因此我需要设置多个清单文件 我做了什么 我做了以下事情 The two layouts have a user html erb and a main html erbhtml
  • Bootstrap 模态表单发布两次 Django

    我正在按照以下指示进行操作django bootstrap modal forms django bootstrap modal forms https pypi org project django bootstrap modal for
  • 使地图图钉从簇中分散开来

    我的地图有两个自定义注释类 一个用于与某个位置相关的单个帖子 另一个用于这些帖子的集群 该集群存储指向它包含的所有帖子的指针 以及中心纬度 经度位置 使用它包含的帖子的位置计算 我的行为是 当我单击集群注释时 它会删除该集群并将其帖子添加到
  • 如何使结构可调用?

    feature unboxed closures feature fn traits struct foo impl std ops Add for foo type Output foo fn add self x foo gt foo
  • 浏览器支持 stopImmediatePropagation?

    IE 支持stopPropagation 缺乏 并且需要解决方法 https stackoverflow com a 387750 165673 但我无法判断是否同样的情况也适用stopImmediatePropagation 它对所有浏览
  • Azure 函数 V2 中的延迟消息:提供的锁无效

    在我的天蓝色功能中 有时我想推迟我的消息 但如果我这样做 我会得到一个例外 7 30 2020 5 59 02 PM Message processing error Action Complete ClientId MessageRece
  • 记录器在某些文件中不起作用

    我有这个 pydev 项目 我做这个项目是为了学习如何正确使用记录器 project src core init py classHanger py scripts entrypoint py util py cli cliloggerte
  • H2-Console 未在浏览器中显示

    我正在研究 SpringBoot api 并使用具有以下属性设置的 H2 数据库 spring h2 console enabled true spring datasource name test spring datasource us
  • 如果构造函数抛出异常会发生什么?

    那我们会得到UB吗 我试过这个 include
  • iPython Notebook 中的默认笔记本目录 - iPython 3.0.0

    我升级到 iPython 3 0 0 Python 3 4 使用 Anaconda 环境 Mac OSX 10 9 5 打开新 iPython Notebook 会话的行为似乎发生了变化 我已经设置了c NotebookManager no
  • WCF 服务或 Web API [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我将从事一个涉及许多要素的项目 ASP NET MVC 网站 C 控制台应用程序 iPhone应用程序 为了让所有这些单独的应用程序与数据库进行
  • 如何在android中的自定义列表视图上设置点击侦听器

    我正在尝试在列表视图上设置单击侦听器 我使用了视图支架和基础适配器来扩展列表视图 我使用了以下代码 Myonclicklistneer myonclicklistneer new Myonclicklistneer listView set
  • Java中相交重叠区间

    我有一组可能重叠的输入日期范围 我不想组合这些重叠的日期范围 而是想创建具有调整日期的新日期范围 例如 应该最终在 Java 有没有有效的方法来解决这个问题 提前致谢 UPDATE 我在第一个问题中没有提到我自己的方法 所以这里是 我只需获
  • PE - 区分数据和函数导出

    我正在尝试找到一种方法来确定 IDA 中哪些导出是数据导出 哪些是实际函数导出 For example let s have a look at Microsoft s msftedit dll s export entries While