天天看點

.net 代碼加密混淆

目前C# .net語言的應用範圍越來越廣泛,IIS 的伺服器架構背景代碼、桌面應用程式的 winform 、Unity3d 的邏輯腳本都在使用。C# .net 具備強大的便捷特性,使得開發成本極低。而作為一款.net 語言,也有它讓開發者頭疼的弊病——非常容易被反編譯。市面上的 Dnspy, ILspy,de4dot等工具可以非常容易反編譯出被混淆保護的C# .net 程式。

未經深思加殼保護的 ILspy 反編譯效果如下:

public int add(int a, int b)

{

    return a + b;

}

public int div(int a, int b)

{

    return a / b;

}

public int mul(int a, int b)

{

    return a * b;

}

public int sub(int a, int b)

{

    return a - b;

}      

解決方案:

深思自主研發了為 C# .net 語言做保護的外殼(Virbox Protector)。将C# .net 編譯成的執行程式(.exe),動态庫(.dll)直接拖入加殼工具即可完成保護操作,十分友善。并且在效果上已經完全看不到源碼中的邏輯。

.net 代碼加密混淆

加密技術:代碼加密/代碼混淆/碎片代碼執行

代碼加密:針對dotNet程式,保護IL代碼:一種動态運作方法解密被保護代碼。把目前代碼加密存儲為密文,存儲起來,當程式運作到被保護函數時候自動解密并且執行,執行之後再擦除代碼,執行之後再擦除代碼,運作到哪裡才解密哪裡的代碼,黑客無法獲得原始的中間語言的指令和記憶體完整性的代碼,由于是純記憶體操作是以運作速度快, 性價高的保護手段,建議全加

代碼混淆:将代碼中的各種元素,如變量,函數,類的名字改寫成無意義的名字。比如改寫成單個字母,或是簡短的無意義字母組合,甚至改寫成“__”這樣的符号,使得閱讀的人無法根據名字猜測其用途。

· 重寫代碼中的部分邏輯,将其變成功能上等價,但是更難了解的形式。比如将for循環改寫成while循環,将循環改寫成遞歸,精簡中間變量,等等。

· 打亂代碼的格式。比如删除空格,将多行代碼擠到一行中,或者将一行代碼斷成多行等等。

· 添加花指令,通過特殊構造的指令來使得反彙編器出錯,進而幹擾反編譯工作的進行。

代碼混淆器也會帶來一些問題。

主要的問題包括:

· 被混淆的代碼難于了解,是以調試除錯也變得困難起來。開發人員通常需要保留原始的未混淆的代碼用于調試。

· 對于支援反射的語言,代碼混淆有可能與反射發生沖突。

· 代碼混淆并不能真正阻止反向工程,隻能增大其難度。是以,對于對安全性要求很高的場合,僅僅使用代碼混淆并不能保證源代碼的安全。

碎片代碼執行:深思自主知識産權的最新技術:基于 LLVM 和 ARM 虛拟機技術,自動抽取海量代碼移入 SS 核心态子產品,極大的降低了使用門檻, 不再需要手動移植算法,可移植的算法從有限的幾個增長到幾乎無限多,支援的語言也不再限于 C, 這是加密技術的一次綜合應用,效果上類似于将軟體打散執行,讓破解者無從下手。

加密後的效果

public int add(int a, int b)
{
    return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16416u, 21, 16384u, 32u, 31516u, 5).Invoke(this, new object[]
    {
        this,
        a,
        b
    });
}

public int div(int a, int b)
{
    return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16956u, 21, 16924u, 32u, 31516u, 2).Invoke(this, new object[]
    {
        this,
        a,
        b
    });
}

public int mul(int a, int b)
{
    return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16776u, 21, 16744u, 32u, 31516u, 3).Invoke(this, new object[]
    {
        this,
        a,
        b
    });
}

public int sub(int a, int b)
{
    return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16596u, 21, 16564u, 32u, 31516u, 4).Invoke(this, new object[]
    {
        this,
        a,
        b
    });
}      

架構支援#

IIS 服務架構的背景邏輯 DLL 檔案

windows PC 應用程式 EXE 檔案

windows PC 應用程式動态庫 DLL 檔案

繼續閱讀