簡體   English   中英

在C#中搜索字符串中的部分子字符串

[英]Searching for partial substring within string in C#

好的,所以我試圖在C#中制作一個基本的惡意軟件掃描程序,我的問題就是說我有一個特殊位代碼的Hex簽名

例如

        {
            System.IO.File.Delete(@"C:\Users\Public\DeleteTest\test.txt");
        }

        //Which will have a hex of 53797374656d2e494f2e46696c652e44656c657465284022433a5c55736572735c5075626c69635c44656c657465546573745c746573742e74787422293b

變為 -

        {
            System.IO.File.Delete(@"C:\Users\Public\DeleteTest\notatest.txt");
        }
//Which will have a hex of 53797374656d2e494f2e46696c652e44656c657465284022433a5c55736572735c5075626c69635c44656c657465546573745c6e6f7461746573742e74787422293b

請記住,這些位將在程序的整個十六進制內 - 我怎樣才能獲取我的基本簽名並尋找具有90%匹配的部分匹配因此被標記。

我會做一個通配符,但這對於稍微復雜的東西不起作用,它可能編碼略有不同,但大部分都是相同的。 那么有沒有辦法可以為子字符串進行百分比匹配? 我正在研究Levenshtein距離,但我不知道如何將它應用到這個給定的場景中。

提前感謝任何輸入

使用編輯距離就可以了。 您可以使用兩個字符串並計算編輯距離,該距離將是一個整數值,表示將一個字符串帶到另一個字符串所需的操作數。 您可以根據該數字設置自己的閾值。

例如,您可以靜態設置如果距離小於五次編輯,則更改是相關的。

您還可以使用您正在比較的字符串的長度並取一定百分比。 你的例子是36個字符長,所以(int)(input.Length * 0.88m)將是一個有效的threashold。

首先,您的程序位應完全匹配,否則它已被修改或已損壞。 通常,您將在原始二進制文件上存儲MD5哈希,並根據新版本檢查MD5以查看它們是否“足夠相同”(MD5不能保證100%匹配)。

除此之外,為了檢測隨機二進制文件中的惡意軟件,您必須知道要查找的模式類型。 例如,如果我知道一件惡意軟件使用一些二進制XYZ注入代碼,我將在可執行文件的位中查找XYZ。 當然,模式比這更復雜,因為惡意軟件位可以在chuncks中展開。 更有趣的是,一些病毒是自我變形的。 這意味着每次運行時,它都會自行修改,這意味着掃描儀不知道要找到的確切模式。 在這些情況下,掃描儀必須知道可以生成衍生物的類型並查找所有衍生物。

在查找%匹配方面,除非您有約束,否則此操作非常耗時。 通過比較2個字符串,您無法分辨哪些部分被刪除,添加或替換。 例如,如果我有一個起始字符串'ABCD',那么'AABCDD'是100%匹配還是更少,因為添加了內容? 怎么樣'ABCDABCD'; 這里匹配兩次。 'AXBXCXD'怎么樣? 那么'CDAB'呢?

現有許多DIFF工具可以告訴您文件的哪些部分已被更改(可能導致%)。 不幸的是,由於我上面描述的問題,它們都不是完美的。 你會發現你有假陰性,誤報等等。這對你來說可能“足夠好”。

在您確定適合您的特定算法之前,您必須確定搜索的限制。 否則,您的掃描將是NP難的,這會導致不合理的運行時間(您的掃描儀可能會整天運行以檢查一個文件)。

我建議你看看Levenshtein距離Damerau-Levenshtein距離

前者告訴您將一個字符串轉換為另一個字符串需要多少個添加/刪除操作; 后者告訴你需要多少次添加/刪除/替換操作才能將一個字符串轉換成另一個字符串。

在編寫用戶可以搜索內容的程序時,我會使用這些,但他們可能不知道確切的拼寫。

兩篇文章都有代碼示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM