2016-11-23 53 views
0

我需要混淆的一些輕形式,「混淆」,在C#字符串使用繁瑣的大多數方法,我能想到的最簡單的事情是做如下:'params'串是否足夠防止偶爾的讀者讀取它?

public string GetString(params char[] chars) 
{ 
    return new string(chars); 
} 

但我擔心的是,編譯優化後的代碼將導致無論如何都易於閱讀的內容。

用法示例:

GetString('t','r','i','a','l','','v','e','r','s','i','o','n'); 

難道沒有任何選擇obufscate常量字符串在Visual Studio?

我只需要避免有人用文本編輯器可以使用「查找並替換」從可執行文件中刪除字符串。我不需要更多的保護(只是停止偶爾的用戶)。當然,大多數obfusctaion方法都很難使用,以至於我們只想知道如果使用params char[]是否具有足夠的保護,或者在某些情況下編譯器可能會將二進制優化爲與

相同的
new string("trial version"); 
+2

如何對其進行編碼爲Base64? – piotrwest

+0

我認爲輸入字符串在可執行文件中仍然可見嗎?我只想避免用戶找到「試用版」字符串並用其他字符替換字符。 (我可以在2秒內用記事本++自己做) – GameDeveloper

+0

我在想這樣的事情:return System.Text.Encoding.UTF8.GetString(System.Convert。FromBase64String( 「VHJpYWwgdmVyc2lvbg ==」)); – piotrwest

回答

3

最簡單的方法,正如您指出的「僅停止偶爾用戶」一樣,是使用Base64編碼。在你的代碼中,你應該有:

public string GetProgramLicenseName() 
{ 
    return System.Text.Encoding.UTF8.GetString(
     System.Convert.FromBase6‌4String("VHJpYWwgdmV‌​yc2lvbg==")); 
} 

這不會被編譯器簡化。解碼將在運行時完成。

但請注意,這是一種非常微弱的混淆方式。你可以嘗試一些更復雜:

  • 加密/解密
  • 使用專業的混淆
  • 標誌具有很強的名稱裝配,以避免它
  • 調用外部服務器的改變檢查許可/下載重要組成部分的程序
0

容易檢查。我編譯下面的代碼,並檢查所得到的二進制:

private static string regularString = "Test"; 
private static string ickyString = "T" + "r" + "i" + "a" + "l"; 
private static string ickyString2 = new string(new [] {'V', 'e', 'r', 's', 'i', 'o', 'n'}); 

在所有情況下(正常字符串,字符串連接和焦炭陣列),字符可以在可執行發現,通過null S離開。三種表述沒有區別。由於評論和其他答案的狀態,擊敗偶然查找/替換黑客最簡單的方法是使用簡單的ROT-13或Base64編碼。

0

您可以在二進制編碼字符串:

public string GetString(Byte[] myString) 
{ 
    return System.Text.Encoding.ASCII.GetString(myString); 
} 

GetString(new byte[] { 0x74, 0x72, 0x69, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e });