字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串

原文: 字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串

Visual Studio提供的Dotfuscator保护程序,能够对用户代码中包含的字符串进行加密。好比下面的例子,为了找到这个程序的注册算法,用.NET Reflector加载程序集后,发现代码中的字符串,都变成这种形式的:css

Assembly executingAssembly = Assembly.GetExecutingAssembly();
ArrayList list = new ArrayList();
string str = Class64.smethod_0("ᓊᓜᓙᒷᓎᓝᒶᒱᒽ");
string fullName = executingAssembly.FullName;
Version version = new Version();
bool flag = false;
int index = fullName.ToLower().IndexOf(Class64.smethod_0("ᓟᓎᓛᓜᓒᓘᓗᒦ"));

注意到这几行代码中的方法调用的参数,已经彻底不是咱们熟悉的English,我把它放到Google翻译中去寻找它的语言,结果是一种东欧的国家的语言,为了获得它对应的英语,我得找这方面的翻译资料。如何将这种语言,翻译成英语,结果只有专门作翻译的公司才能够作,并且报价不便宜,按字数来收费。这一条路彷佛走不通……html

意识到本身走错方向以后,立刻把本身的想法,翻译成英语,用Google来搜索。Google翻译的质量,确实不错。算法

很快,我就获得这篇文章Decrypting strings in obfuscated assemblies,它告诉我,这个程序集应用了字符串混淆算法,一样的例子是这样的工具

int num = 19;
if (args.Length < 1)
{
        Console.WriteLine(a("昞传圢䐤弦न个弬崮帰䄲༴᜶稸吺似䴾⑀⁂ㅄ杆㩈㉊⍌㭎ぐ⭒畔㹖⩘筚♜潞ᱠ䍢奤ቦ᭨ݪ卬佮⩰ᱲtͶॸ๺ॼ᥾uda86", num), a("东瘞䰠匢䤤䈦洨䐪娬䄮崰尲吴匶尸䤺", num));
        Console.ReadKey();
}

老外一看到这些方块的文字,第一想到的就是Chinese,呵呵,中文语言在世界上还真有点名气。难怪Windows的安装程序中,专门有一项是Aisan Language是专门用来安装东方语言文字字符集的。网站

解决方案也比较简单,调用加密的办法,获取它的运行时的值:加密

string encryptedString = "东瘞䰠匢䤤䈦洨䐪娬䄮崰尲吴匶尸䤺";
int key = 19;

Assembly assembly = Assembly.LoadFile(assemblyPath);

// Okay, It’s sample code.. what do you expect! :)
MethodInfo secretMethod = assembly.GetModules()[0]
                  .GetMethods(BindingFlags.NonPublic| BindingFlags.Public| BindingFlags.Static)[0];
string decryptedString = secretMethod.Invoke(null, new object[] {encryptedString, key}) as string;
 

这样就解决了字符串的反混淆。若是须要对程序中的每一个字符串进行调用,须要写一个GUI,用来批量的解决反混淆。spa

作到这里,基本上能够理解被混淆的程序集中的字符串的含义,然而,网上的一篇文章介绍的工具DotNetStringSearch,引发了个人注意,我确实是在找这样的工具,也一直想作一个一劳永逸的工做,就是我须要一个工具程序,打开一个应用过字符串混淆的程序,点一个按钮,它立刻能够为我显示原文字符串和混淆后的字符串。.net

可细DotNetStringSearch的做者并无公布这个软件的细节,源代码也没有开放,惟一提到的Rainst.net这个网站中的一篇文章,如今已经打不开,无从得知它应用的技术。这一条路彷佛也走不下去……翻译

 

一个偶然的缘由,看到CodeProject上面的一篇文章,讲解如何应用Mono.Cecil实现.NET代码注入,这一会儿引发了个人注意。与咱们一般用的反射不一样,它实现的是直接修改程序集的代码,比起16进制工具修改EXE/DLL的二进制文件要高级得多,毕竟是原来的.NET代码,能够直接调试,观察实现过程。一下当心,找到SystemInternal上面的一个实用工具,Strings,这个程序能够提取PE文件中的字符串内容。调试

image 

思路一下就打开了,原来不是反射,是直接对PE文件格式进行读取,运行Strings程序,果真它顺利的读取了PE格式中的字符串资源,并且源代码是开放的,里面的例子程序是这样的

static void Main(string[] args)
{
            try
            {
                string exePath = args[0];

                List<string> allUserStrings = ReadAllUserStrings(exePath);

                File.WriteAllLines(exePath + ".txt", allUserStrings.Select(str => CSStringConverter.Convert(str)));

                Console.WriteLine("hotovo... ");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.ToString());
                Console.WriteLine("press a key...");
                Console.ReadKey();
            }
 }
 

经过上面的一段代码,你能够很容易的找到它的源代码文件,因而能够解决我说的目标:作一个通用的字符串反混淆程序,能够对当前流行的加密工具加密后的字符串进行反混淆。

相关文章
相关标签/搜索