運行時加密字符串

今天我們將介紹運行時加密字符串的基礎知識,為什麼我們需要加密我們的字符串並學習如何創建自己的字符串。

在本文中,您將了解和學習:

  • 什麼是運行時加解密
  • 為什麼你需要加密你的字符串
  • 查看任何人如何查看您的敏感數據
  • 創建您自己的自定義加密

什麼是運行時加解密

這是指在程序(軟件、應用程序)運行期間加密和/或解密的數據。數據可以是來自內存塊、網絡流量、字符串等的任何類型。

用於此目的的最常用方法之一是混淆(基本)。其他(高級)機制涉及編譯代碼的突變/虛擬化。

今天我們將重點介紹一種使用 [XOR 混淆] (https://en.wikipedia.org/wiki/XOR_cipher ) 的機制。

為什麼要加密字符串?

在您運行軟件的那一刻,一切都在內存中可見。這也適用於您的最終用戶,這意味著他們可以看到所有內容。

攻擊者要做的第一件事就是在您的軟件中查找字符串。這將使他能夠以最小的努力了解有關您的軟件的一切。

如果您要存儲敏感數據(如密碼或許可證),請務必不要以純文本形式保存它們。以純文本形式保存它們將使攻擊者的生活變得輕鬆。

人們可以使用多種方法來分析您的軟件。最知名和最常用的方法是靜態和運行時分析。

讓我們看一個使用控制台應用程序的簡單示例:

Sample non-encrypted 1

我們在發布模式下編譯它(以避免留下任何調試信息)。讓我們繼續測試靜態和運行時分析。

靜態分析測試

在靜態分析中,軟件不需要執行。話雖如此,讓我們在 Ghidra 中打開示例。

從下面的屏幕截圖中,您可以看到示例在編譯時沒有任何調試信息:

Sample non-encrypted 1-1

如果我們搜索字符串,您可以看到我們所有的敏感信息都是可見的:

Sample non-encrypted 1-2

突出顯示字符串後,您可以打開反編譯器視圖並查看所有相關代碼:

Sample non-encrypted 1-3

很傷心吧? 😕想像一下,您花了幾個月的時間來開發您的出色軟件,並且準備出售它。

我認為其餘的都是不言自明的,但我相信你明白這一點。

更可悲的是,這很簡單,即使是 12 歲的孩子也能做到。 (有些人確實做到了)

運行時分析測試

在運行時分析中,軟件需要運行(執行)。這意味著我們需要使用軟件打開進程並讀取它。 (通常是調試器)

但是,為此目的並不需要調試器。我們可以簡單地下載一個免費的工具,如 Process Hacker 並打開進程:

Sample non-encrypted 2

那很簡單吧?請記住,我們甚至還沒有附加調試器。熟練且有決心的人會使用調試器。

當您附加一個調試器時,您會看到更多,但該討論是另一天。

創建運行時加密字符串

有很多方法可以實現這一點:

  • 使用第三方軟件,如 VMProtectThemida
  • 編譯時間字符串加密,如 xorstr
  • 使用自定義方法

前 2 個選項可能不適合您的需求。他們每個人都有很多起起落落,我們在這一點上不會討論。

您需要了解的一件事是,受歡迎意味著風險。當你使用在谷歌上隨機找到的東西時,有人已經知道了。

大多數人針對您的工具開發了一種工具。事情就是這樣。他們這樣做是為了挑戰,或者是為了竊取你的工作,但他們這樣做了。

考慮到這一點,你必須去定制。您可以創建自己的從基本到高級的字符串加密。

計劃

  • 創建一個易於使用的解決方案
  • 始終保持字符串加密
  • 僅在需要時解密
  • 將字符串放置在隨機位置(可選 - 未涵蓋)
  • 使用後銷毀字符串(可選 - 未涵蓋)

解決方案

首先將我們的字符串一一定義為數組:

Step 1

該數組可以容納無限數量的字符串,長度限制為 256。

我知道這是一項艱鉅的任務,尤其是如果您的字符串很長。這只是為了演示,稍後我們將創建一個更實用的解決方案。

這個想法是加密字符串中的每個字符。我將為此使用一個簡單的 XOR 加密。

您可以在下面看到一個如何工作的示例:

Step 2

以上沒有什麼複雜的事情,它簡單明了但功能強大。您可以在控制台應用程序中使用它。

編譯並運行後,結果是人眼無法讀取的字節:

Step 3

你有它,你自己的小軟件來創建運行時加密字符串。 😏

結果

我是時候將我們的解決方案付諸實踐了。讓我們為此目的創建另一個示例並添加我們的代碼:

Step 4

注意2個重要的事情:

  • 我在純文本中留下了一些字符串,所以你可以看到區別
  • 解密函數需要長度(稍後會詳細介紹)

我們在 Release 模式下編譯上面的代碼並運行它。新樣本工作正常:

Step 5

如果我們在 IDA(或 Ghidra)中打開新的示例軟件,我們加密的字符串是不可見的:

Step 6

我已經提到,在這個示例中故意留下了一些字符串。原因是,所以我們可以跟著他們看代碼:

Step 7

我必須向下滾動才能到達上圖中的文字。您可以看到編譯後的代碼有多麼不同。

我們解決了靜態分析問題,讓我們繼續運行運行時。

在 Process Hacker 中打開它:

Step 8

瞧!我們也解決了運行時分析問題 😎

更多關於加密字符串

上面的例子不是很實用。手動定義每個字符串是一項艱鉅的任務,並且每次都指定字符串的長度。

理想情況下,我們需要以下內容:

  • 讀取字符串的文本文件
  • 將結果字符串寫入文本文件
  • 轉義序列 添加到字符串以避免每次都指定長度。
  • 添加更複雜的 XOR 或任何其他方法(可選)
  • 將字符串放在隨機位置(可選)

我為你準備了一個很好的解決方案。您可以測試本文中編寫的所有內容,也可以使用自己的現成工具來製作運行時加密字符串。

它包括4個項目:

  • RuntimeStringEcryptor 從文本文件中讀取字符串,對其進行加密,然後將它們寫入另一個文本文件。
  • Sample 是用於演示 IDA 的簡單控制台。
  • SampleEncryptedStrings 是帶有加密字符串的簡單控制台,可用於 IDA 演示。
  • SimpleRuntimeStringEncryption 是您可以測試此方法的初始遊樂場。

筆記:

  • 如果不添加轉義序列,解密將不知道何時“停止”。結果是亂碼/空數據,直到它達到定義的數組大小。
  • 確保更改我在示例中使用的 XOR 鍵。
  • 避免多次使用相同的詞。它們將生成相同的字節,並且存在被檢測到的風險。

下載

要下載即用型解決方案,請考慮支持此博客 😘

成為贊助人