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

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翻译中去寻找它的语言,结果是一种东欧的国家的语言,为了得到它对应的英语,我得找这方面的翻译资料。如何将这种语言,翻译成英语,结果只有专门做翻译的公司才可以做,而且报价不便宜,按字数来收费。这一条路似乎走不通……

意识到自己走错方向之后,马上把自己的想法,翻译成英语,用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,用来批量的解决反混淆。

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

可细DotNetStringSearch的作者并没有公布这个软件的细节,源代码也没有开放,唯一提到的Rainst.net这个网站中的一篇文章,现在已经打不开,无从得知它应用的技术。这一条路似乎也走不下去……

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

思路一下就打开了,原来不是反射,是直接对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();
}
}
 

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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

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

  1. 字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串

    关于字符串的研究,目前已经有两篇. 原理篇:字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串  实践篇:字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略 今天来 ...

  2. 字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略

    因为手头需要使用一个第三方类库,网络上又找不到它的可用的版本,于是只好自己动手.这个类库使用了Dotfuscator 加密,用.NET Reflector加载程序集, 看到的字符串是乱码,如下面的代码 ...

  3. C#中字符串驻留技术

    转自:http://www.cnblogs.com/Charles2008/archive/2009/04/12/1434115.html MSDN概念:公共语言运行库通过维护一个表来存放字符串,该表 ...

  4. Android安全攻防战,反编译与混淆技术完全解析(下)

    在上一篇文章当中,我们学习了Android程序反编译方面的知识,包括反编译代码.反编译资源.以及重新打包等内容.通过这些内容我们也能看出来,其实我们的程序并没有那么的安全.可能资源被反编译影响还不是很 ...

  5. Android安全攻防战,反编译与混淆技术完全解析(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/49738023 之前一直有犹豫过要不要写这篇文章,毕竟去反编译人家的程序并不是什么值 ...

  6. Android安全攻防战,反编译与混淆技术全然解析(下)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/50451259 在上一篇文章其中,我们学习了Android程序反编译方面的知识,包括 ...

  7. 如何在Visual Studio 2012中发布Web应用程序时自动混淆Javascript

    同Java..NET实现的应用程序类似,Javascript编写的应用程序也面临一个同样的问题:源代码的保护.尽管对大多数Javascript应用公开源代码不算是很严重的问题,但是对于某些开发者来说, ...

  8. ProGuard代码混淆技术详解

    前言     受<APP研发录>启发,里面讲到一名Android程序员,在工作一段时间后,会感觉到迷茫,想进阶的话接下去是看Android系统源码呢,还是每天继续做应用,毕竟每天都是画UI ...

  9. 【ASP.NET 系列】浅谈缓存技术在ASP.NET中的运用

    本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过涉及架构部分的内容 你只需关心Cache即 ...

随机推荐

  1. android创建桌面快捷方式(启动目标非项目的启动页)

    1.布局文件中,目标Activity加入以下filter <intent-filter>                  <action android:name="an ...

  2. 有1,2,3一直到n的无序数组,排序

    题目:有1,2,3,..n 的无序整数数组,求排序算法.要求时间复杂度 O(n), 空间复杂度O(1). 分析:对于一般数组的排序显然 O(n) 是无法完成的. 既然题目这样要求,肯定原先的数组有一定 ...

  3. Ubuntu 16 安装odoo10 实录

    安装Ubuntu 16,省略 安装时,默认用户名为 odoo ubuntu 16开始 使用 systemd 管理服务,但是systemd 兼容 sysv init 脚本 下载 odoo源码 从 htt ...

  4. labview学习_入门篇(一)

    写在前面的话: 在上大学的时候,实验室的老师推荐用labview工具编写上位机软件,当时不想用labview,感觉不写代码心里不踏实,后来用vb和matalb开发了上位机软件.但现在由于部门的几款工具 ...

  5. C# 如何给sql数据库的日期字段插入空值

    在C#中声明日期变量时用SqlDateTime类型,引用:using System.Data.SqlTypes; 例子:user.AbortDate = SqlDateTime.Null;

  6. 利用chrome的profiler查找js的memory leak

    1. 首先要固定一个测试环境.具体来说,选择某一个可以重复的操作,作为标准的测试动作. 2. 刷新浏览器后用profiler抓下heap snapshot. 3. 进行操作,再一次抓下snapshot ...

  7. 大前端学习笔记整理【七】HTTP协议以及http与https的区别

    前言 还是老样子,新博客开始前总是想先啰嗦几句...HTTP协议其实在当初学习java时老师就有提过...但是...反正就那么过去了... 这段时间公司的项目正好要求做https的转换和迁移,然后自己 ...

  8. javascript总结

    javascript:它是一种script脚本语言           脚本语言:就是可以和HTML混合在一起使用的语言,可以用来在IE的客                    户端进行程序编制,从 ...

  9. UIScrollView的三个属性

    contentSize.contentOffset.contentInset   UIScrollView的frame的size 指的是可视范围   contentSize  内容大小,滚动的范围 创 ...

  10. css高度自适应

    何为高度自适应? 高度自适应就是高度能跟随浏览器窗口的大小改变而改变,典型的运用在一些后台界面中上面一栏高度固定用作菜单栏或导航栏,下面一栏高度自适应用于显示内容.高度自适应不像宽度自适应那样简单,在 ...