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

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

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; }

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

时间: 2024-10-19 11:06:26

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

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

原文:字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串 关于字符串的研究,目前已经有两篇. 原理篇:字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串  实践篇:字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略 今天来讲第三篇,如何应用上面所学内容,设计一个字符串混淆程序. 先设计一个控制台程序,它是将要被我混淆的程序集文件: public static void Main() { try { RunSnippet(); } cat

php中的定界符EOF Perl风格的字符串输出技术

<<EOF EOF;//顶格写 Perl风格的字符串输出技术 定界符不唯一,只要首尾统一即可: 在<<<EOF 和 EOF; 之间的文本, 可以不用转义, 比如单引号和双引号一般用于输出长的html文本或者文本赋值,这样写sql语句, 可以不用对字符型字段两边的单引号进行转义 例1 $v=2;$a= <<<EOF"abc"$v"123"EOF;echo $a; //结果连同双引号一起输出:"abc"

御安全浅析安卓开发代码混淆技术

御安全浅析安卓开发代码混淆技术[关键词:代码混淆,Android应用加固,移动应用保护,APP保护,御安全] 提高native代码的安全性有什么好办法吗?答案是肯定的,今天我们就来介绍一种有效对抗native层代码分析的方法--代码混淆技术.随着移动互联网的快速发展,应用的安全问题不断涌现出来,于是越来越多的应用开发者将核心代码由java层转到native层,以对抗成熟的java逆向分析工具,然而如果native层的代码如果没有进行任何保护,还是比较容易被逆向分析工作者获取其运行逻辑,进而完成应

用javascript技术读取注册表中软件安装位置并启动本地软件

1.首先读取注册表中本地软件安装的位置,如果未安装则无就跳转到下载页面. 2.启动软件,关闭页面. 3.如报错提示. <SCRIPT language=javascript>  <!--   function killErrors(){  alert("请将您浏览器Internet选项中的“对没有标记为安全的ActiveX控件进行初始化和脚本运行”设置为“启用”!/n/n然后刷新本页登陆!");  return true;}   window.onerror = ki

Android代码混淆技术

Android混淆是Android开发者经常使用的一种用于防止被反编译的常见手法.Android开发基于java语言的,很容易被别人反编译出来,一下就相当于裸奔了,特别是用于商业用途的时候,防止反编译是必要的措施.而Android混淆的确可以保证Android源代码的一定安全. Android混淆技术 Java类名.方法名混淆 Dalvik字节码包含了大量的调试信息,如类名.方法名.字段名.参数名.变量名等,使用反编译工具可以还原这些信息.由于类名.方法名等通常都会遵循一定的命名规范,破解者很容

字符串 映射相应的 函数 字符串驱动技术—— MethodAddress , MethodName , ObjectInvoke

http://blog.csdn.net/qustdong/article/details/7267258 字符串驱动技术—— MethodAddress , MethodName , ObjectInvoke 标签: delphiintegerfunctionobjectsoapclass 2012-02-17 11:46 1139人阅读 评论(0) 收藏 举报  分类: Delphi(24)  首先看一段Delphi帮助中的介绍(After Delphi 6 ): Returns the a

Android技术13:NDK中无法返回中文问题解决

1问题 为了加强软件的安全性,将http请求,封装在jni中,即通过c语言实现http请求,返回字符串.然而字符串往往包含中文,当返回类型为jstring时,就会出现JNI WARNING: illegal continuation byte 0xd0这错误,这是因为jni中c文件有中文, 中文不能被识别.无法使用(*env)->NewStringUTF(env,s);返回字符串. 2.方案 2.1将native方法返回类型为byte数组  例如:private native byte[] ge

ProGuard代码混淆技术详解

前言 受<APP研发录>启发,里面讲到一名Android程序员,在工作一段时间后,会感觉到迷茫,想进阶的话接下去是看Android系统源码呢,还是每天继续做应用,毕竟每天都是画UI和利用MobileAPI处理Json还是蛮无聊的,做着重复的事情,没有技术的上提升空间的.所以,根据里面提到的Android应用开发人员所需要精通的20个技术点,写篇文章进行总结,一方面是梳理下基础知识和巩固知识,另一方面也是弥补自我不足之处. 那么,今天就来讲讲ProGuard代码混淆的相关技术知识点. 内容目录

Javascript 中的false,零值,null,undefined和空字符串对象

在Javascript中,我们经常会接触到题目中提到的这5个比较特别的对象--false.0.空字符串.null和undefined.这几个对象很容易用错,因此在使用时必须得小心. 类型检测 我们下来看看他们的类型分别是什么: <script type="text/javascript"> alert(typeof(false) === 'boolean'); alert(typeof(0) === 'number'); alert(typeof("")