- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有二进制A,它是一个带有伴随符号的调试版本——多年前构建的。我还有二进制 B,这是一个 没有 伴随符号的发布版本,而且更新得多。我正在寻找将二进制 A 中的符号与二进制 B 中的潜在候选者进行匹配的最有效方法。
鉴于调试版本相当大(进行更多输入验证,将更多内容打印到 stderr
等)并且功能总是随时间变化,我认为尝试对各个功能进行指纹识别会浪费时间。
因此,我决定——完全是凭空而来,所以我可能找错了树——识别函数指纹的最佳方法是创建两个二进制文件的调用图并尝试匹配顶点(即函数)。
我已经做了一些预处理,所以我有以下数据结构:
# binary A
[[60, 60, 8734], # function 0 is called by functions 60 (twice) and 8734
[193, 441, 505], # function 1 is called by functions 193, 441 and 505
[193, 742],
[23],
[21],
[21],
[26],
[26, 1508, 1509, 1573],
[24],
[25],
...] # (~10k functions)
# binary B
[[8999], # function 0 is called by function 8999
[9016], # function 1 is called by function 9016
[1126],
[7904, 7904, 7913],
[182, 336, 396, 396],
[9010],
[407],
[182, 632],
[20],
[24],
...] # (~10k functions)
需要注意的重要一点是二进制 A 中的函数“0”与二进制 B 中的函数“0”之间没有对应关系强>.这些是我分配给每个二进制文件中每个函数的任意 ID。
下一步让我感到困惑。我的算法很弱,我想不出一个聪明的方法来进行。我(非常有限)的理解是,为了解决这个问题,我想使用某种形式的 inexact graph matching .换句话说,哪一组映射 Ai -> Bi 会最大化两个调用图的相似性?
鉴于二进制 A 中有额外的调试功能,而且程序会随着时间的推移而发展这一显而易见的事实,很可能没有完全匹配。理想情况下,我想要以下形式的输出:
[[(37, 0.998), (8432, 0.912), (442, 0.75)], # matching-ness of function "0" in binary A with function "37" in binary B is 0.998, second most likely candidate is function "8432" in binary B with score 0.912, etc.
[(42, 0.973), (7751, 0.788)], # matching-ness of function "1" in binary A with function "42" in binary B is 0.973, second most likely candidate is function "7751" in binary B with score 0.788, etc.
[(4579, 0.996), (123, 0.934)],
...] # around ~10k mappings
在现实中,如果我只能凑合一个候选人并且没有提供排名,我会很高兴,但人们可以做梦。
任何 SO-goers 都知道我应该从哪里开始?
最佳答案
这当然是一个有趣的问题,尽管我怀疑它很难解决。它似乎是有向图上近似图同构的一个实例。我没有找到太多关于这个的谷歌搜索,但是here's some software用于解决无向一般图,更一般的情况是 NP 困难。
我认为你能做的最实际的事情就是忘记运行时信息,简单地获取每个版本的可执行代码部分并使用全局对齐算法(例如 Needleman-Wunsch ,尽管确实存在更快但不太准确的算法)在他们身上:
CALL
指令的匹配项,以及可能的其他“可靠”指令序列。假设函数在可执行文件中出现的顺序没有改变太多(它不会有,除非优化版本使用了一些优化让链接器将相互调用的函数放置在彼此附近) ,这应该能让你得到一个很好的第一近似值。
或者,如果您能找到一种方法(我的直觉表明它需要一种迭代方法,就像 PageRank 如何决定网页的值(value)一样)来“评分”函数 的可能性调试版本中的 f
对应于优化版本中的函数 g
,那么是的,您可以使用图形匹配技术。在这种情况下,图形的顶点将是两个版本中的所有函数,并且调试版本中的每个函数和优化版本中的每个函数之间都会有一个加权边,权重由您的评分系统确定。
此图将是二分图,因为同一版本中的 2 个函数之间永远不会有边。这意味着它是 Assignment Problem 的一个实例,为此存在非常好的(并且不太复杂)算法。
但是,这里缺少的部分是确定每个配对的权重的方法。一种近似的方法是构建一个向量,计算每个函数的直系子女、孙子女、曾孙子女等的数量。然后,您可以使用您喜欢的任何距离度量来比较这些向量。但我预计在这里这样做不会很好,因为我们已经预计调试版本包含比优化版本更多的函数调用。
如果您可以访问两者的整个调用树,这将为您提供更多信息:函数内调用的顺序,以及调用的确切层次结构的知识。然后,您可以通过仅使用后者来为每个函数构建一个“签名”:
现在,Levenshtein distance可用于比较 2 个签名。为了以更多计算为代价获得更高的准确性,您可以使用一种变体,其中允许删除调试版本中最多 k 个不同的函数,对于一些小的 k(例如 k = 3),并且采用最佳 Levenshtein 距离在所有此类“精简”版本中,附加了与删除的功能数量成正比的小惩罚。
关于algorithm - 使用旧调试版本的符号来符号化剥离的二进制文件(不精确的图形匹配),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4373643/
今天我在一个 Java 应用程序中看到了几种不同的加载文件的方法。 文件:/ 文件:// 文件:/// 这三个 URL 开头有什么区别?使用它们的首选方式是什么? 非常感谢 斯特凡 最佳答案 file
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我有一个 javascript 文件,并且在该方法中有一个“测试”方法,我喜欢调用 C# 函数。 c# 函数与 javascript 文件不在同一文件中。 它位于 .cs 文件中。那么我该如何管理 j
需要检查我使用的文件/目录的权限 //filePath = path of file/directory access denied by user ( in windows ) File fil
我在一个目录中有很多 java 文件,我想在我的 Intellij 项目中使用它。但是我不想每次开始一个新项目时都将 java 文件复制到我的项目中。 我知道我可以在 Visual Studio 和
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我有 3 个组件的 Twig 文件: 文件 1: {# content-here #} 文件 2: {{ title-here }} {# content-here #}
我得到了 mod_ldap.c 和 mod_authnz_ldap.c 文件。我需要使用 Linux 命令的 mod_ldap.so 和 mod_authnz_ldap.so 文件。 最佳答案 从 c
我想使用PIE在我的项目中使用 IE7。 但是我不明白的是,我只能在网络服务器上使用 .htc 文件吗? 我可以在没有网络服务器的情况下通过浏览器加载的本地页面中使用它吗? 我在 PIE 的文档中看到
我在 CI 管道中考虑这一点,我应该首先构建和测试我的应用程序,结果应该是一个 docker 镜像。 我想知道使用构建环境在构建服务器上构建然后运行测试是否更常见。也许为此使用构建脚本。最后只需将 j
using namespace std; struct WebSites { string siteName; int rank; string getSiteName() {
我是 Linux 新手,目前正在尝试使用 ginkgo USB-CAN 接口(interface) 的 API 编程功能。为了使用 C++ 对 API 进行编程,他们提供了库文件,其中包含三个带有 .
我刚学C语言,在实现一个程序时遇到了问题将 test.txt 文件作为程序的输入。 test.txt 文件的内容是: 1 30 30 40 50 60 2 40 30 50 60 60 3 30 20
如何连接两个tcpdump文件,使一个流量在文件中出现一个接一个?具体来说,我想“乘以”一个 tcpdump 文件,这样所有的 session 将一个接一个地按顺序重复几次。 最佳答案 mergeca
我有一个名为 input.MP4 的文件,它已损坏。它来自闭路电视摄像机。我什么都试过了,ffmpeg , VLC 转换,没有运气。但是,我使用了 mediainfo和 exiftool并提取以下信息
我想做什么? 我想提取 ISO 文件并编辑其中的文件,然后将其重新打包回 ISO 文件。 (正如你已经读过的) 我为什么要这样做? 我想开始修改 PSP ISO,为此我必须使用游戏资源、 Assets
给定一个 gzip 文件 Z,如果我将其解压缩为 Z',有什么办法可以重新压缩它以恢复完全相同的 gzip 文件 Z?在粗略阅读了 DEFLATE 格式后,我猜不会,因为任何给定的文件都可能在 DEF
我必须从数据库向我的邮件 ID 发送一封带有附件的邮件。 EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Adventure Works Admin
我有一个大的 M4B 文件和一个 CUE 文件。我想将其拆分为多个 M4B 文件,或将其拆分为多个 MP3 文件(以前首选)。 我想在命令行中执行此操作(OS X,但如果需要可以使用 Linux),而
快速提问。我有一个没有实现文件的类的项目。 然后在 AppDelegate 我有: #import "AppDelegate.h" #import "SomeClass.h" @interface A
我是一名优秀的程序员,十分优秀!