草庐IT

windows - PE-从功能导出中区分数据

coder 2023-11-10 原文

我试图在IDA中找出一种方法,哪些导出是数据导出,哪些是实函数导出。

例如,让我们看一下Microsoft的msftedit.dll的导出条目:


虽然CreateTextServices是真正的导出函数:

IID_IRichEditOle是数据导出,而IDA未能意识到这一点,将数据作为代码插入:


有人知道区分这两者的可靠方法吗?帮助将不胜感激。

提前致谢。

最佳答案

对于每种导出,都没有完全可靠的方法来执行此操作。

每次导出仅在可执行文件中指定一个偏移量-从逻辑上讲,任何引用该可执行文件的其他代码都可以将其视为代码或数据。

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

The exported entry will be considered a valid exported function if there is a ret instruction in the function, and there are more than <min> valid instructions, and IDA recognizes the function's calling convention.



假阴性:您可能具有使用tail call optimization并以jmp指令而不是ret指令结尾的函数。任何短函数也将失败。可以将IDA混淆为不将代码视为函数的几种方式。

误报:内存中可能有一个字符串,紧接着是C3C2,例如db 'BACKGAMMON0',0,0C3h-从逻辑上讲,它可以作为带ret但不带参数的有效11指令函数分解。

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

如果IDA认为是代码,则可能合理的建议是仅信任IDA并将导出视为代码。 IDA的很大一部分功能是自动猜测数据的逻辑类型,通常它非常擅长。如您所显示,有时是错误的。但是无论如何您都无法获得100%的准确性。您能做的最好的事情就是在假阴性和假阳性之间取得平衡。

该问题的不确定性证明:

导出是否将作为代码执行尚不确定。导出是否将被读取为数据也是不确定的。由于我们不能保证两者都是正确的,因此不可能区分看似模棱两可的情况。

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

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

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

如果Z(Z,I,E)执行(或从中读取)export E,则A(Z,I,E)将返回1。但是Z(Z,I,E)定义为不访问导出E,除非A(Z,I,E)返回0。这是矛盾的。

如果Z(Z,I,E)不执行(或不读取)export E,则A(Z,I,E)将返回0。但是Z(Z,I,E)定义为当E返回0时将访问导出A(Z,I,E)。这是一个矛盾。

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

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

根据您要解决的确切问题,您可以在运行时确定哪些导出是有效函数。

例如,您可以编写一个应用程序,将应用程序debugs进行分析,并将guard pages放置在每个包含您要 Hook 的导出的页面上。这意味着,每当页面被访问(执行/读取/写入)时,都会引发异常,调试器程序将获得控制权。

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

在任何一种情况下,PAGE_GUARD修饰符在每次异常后都会被取消,因此您需要每次都将其放回原处。

毫不奇怪,这会使您的程序的执行非常慢,因为对包含导出的任何页面的任何R/W/X访问都会导致昂贵的context switch -这很可能包括大多数指令的执行,而这些指令是您导出的函数,以及与它们无关的其他几个函数。

您可以对其他检测工具采用类似的方法,例如Pin

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

还要注意,执行和读取(甚至是写入)访问都可能在同一导出上发生。

关于windows - PE-从功能导出中区分数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40338682/

有关windows - PE-从功能导出中区分数据的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  3. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  4. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  5. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  6. ruby-on-rails - rails 功能测试 - 2

    在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建

  7. ruby - 如何在 Ruby 中执行 Windows CLI 命令? - 2

    我在目录“C:\DocumentsandSettings\test.exe”中有一个文件,但是当我用单引号编写命令时`C:\DocumentsandSettings\test.exe(我无法在此框中显示),用于在Ruby中执行命令,我无法这样做,我收到的错误是找不到文件或目录。我尝试用“//”和“\”替换“\”,但似乎没有任何效果。我也使用过系统、IO.popen和exec命令,但所有的努力都是徒劳的。exec命令还使程序退出,这是我不想发生的。提前致谢。 最佳答案 反引号环境就像双引号,所以反斜杠用于转义。此外,Ruby会将空格解

  8. ruby-on-rails - 功能测试 Authlogic? - 2

    在我的一些Controller中,我有一个before_filter检查用户是否登录?用于CRUD操作。application.rbdeflogged_in?unlesscurrent_userredirect_toroot_pathendendprivatedefcurrent_user_sessionreturn@current_user_sessionifdefined?(@current_user_session)@current_user_session=UserSession.findenddefcurrent_userreturn@current_userifdefine

  9. ruby - Ruby 中允许 "p *1..10"打印出数字 1-10 的功能是什么? - 2

    require'pp'p*1..10这会打印出1-10。为什么这么简洁?您还可以用它做什么? 最佳答案 它是“splat”运算符。它可用于分解数组和范围并在赋值期间收集值。这里收集赋值中的值:a,*b=1,2,3,4=>a=1b=[2,3,4]在此示例中,内部数组([3,4])中的值被分解并收集到包含数组中:a=[1,2,*[3,4]]=>a=[1,2,3,4]您可以定义将参数收集到数组中的函数:deffoo(*args)pargsendfoo(1,2,"three",4)=>[1,2,"three",4]

  10. ruby - 错误 : Failed to build gem native extension on Windows - 2

    我在安装“redcarpet”gem时遇到以下错误。它在我friend的机器上安装没有问题。(我想安装它来运行yard)ruby版本:1.9.3命令输出:D:\Learning\Common_POM_FW\SampleProjects>yard[error]:Missing'redcarpet'gemforMarkdownformatting.Installitwith`geminstallredcarpet`D:\Learning\Common_POM_FW\SampleProjects>geminstallredcarpetTemporarilyenhancingPATHtoinc

随机推荐