python - 行系列中不完全匹配的搜索算法

标签 python sql algorithm search search-engine

我正在努力演示恶意软件扫描的一些原理(我不知道这是否是一种“传统”方法,但我相信它会在某种程度上起作用,无论如何,我正在尝试实现它)。

在这个阶段,我试图在反汇编程序中映射特定的函数调用(即:网络调用),并检查我的 SQL 数据库以查看是否存在与已知恶意软件的任何匹配项。

这是我的“函数调用”表的样子:

malwareID           address           function           order

    1               8048000            socket              1
    1               8048010            bind                2
    1               8048020            listen              3
    1               8048030            bind                4
    1               8048040            recv                5

目前我只能检查直接匹配项。我反汇编目标程序,检索所有网络函数调用及其地址,并检查表中的直接匹配项(即:SELECT malwareID WHERE address = 'addr' AND function = 'func') .这可以检测恶意软件的某些变体,但大多数情况下不起作用,因为它取决于在同一地址调用相同函数的变体。

我想做的是按“顺序”在数据库中搜索函数调用。假设在反汇编和提取函数调用后,我最终得到一个如下列表:

8041000     socket
8041010     bind
8041020     listen
8041030     bind
8041040     send
8041050     recv

虽然地址与数据库中存储的已知变体不匹配,但调用顺序和调用之间的“距离”是相同/相似的,除了新的 send 调用是滑入这个新变体。

因为我从来没有做过任何软件工程或类(class),你可以在其中学习这些类型的“搜索”算法,所以我需要指出正确的方向。

我正在寻找一种算法,该算法可以在数据库中搜索与一系列行的匹配项,也许还考虑到调用之间的“距离”,并允许一定的容差(即:插入额外的调用,错过一个电话,一个电话被另一个电话取代)。

是否有任何算法可以或多或少地做到这一点,我可以继续阅读?

(注意:我正在使用 Python 和 sqlite,但我欢迎任何有关如何执行此操作的伪代码想法)

最佳答案

如果我理解正确,我认为您应该考虑存储成对的函数调用并存储这些调用之间的地址距离。像这样的东西:

malwareID       functionA  distance functionB       order

1               socket    10        bind            1
1               bind      10        listen          2
1               listen    10        bind            3
1               bind      10        recv            4

通过这种方式,您可以执行简单的 SQL 查询,其中可以执行计数 (*) 来检查是否有足够的匹配项来引发恶意软件安全问题。

关于python - 行系列中不完全匹配的搜索算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23566632/

相关文章:

string - 在字符串中交换字符的最低成本,因此没有 3 个相同的字符是连续的

python - 在 Cython 和 NumPy 中包装 C 函数

SQL生成从1到100的数字列表

c# - SqlDataReader 对象的内联空检查

regex - 平均正则表达式算法的时间复杂度是多少?

algorithm - 给定通过图形的路径列表,有效地找到使用每条边的路径

python - 如何基于数据帧中两个变量的组合创建散列算法?

python - 如何检查一个字符串是否只包含小写字母和数字?

Python:对全局变量和局部变量感到困惑

sql - 处理 PL-SQL 异常并继续循环