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

关于字符串的研究,目前已经有两篇。

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

实践篇:字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略

今天来讲第三篇,如何应用上面所学内容,设计一个字符串混淆程序。

先设计一个控制台程序,它是将要被我混淆的程序集文件:

public static void Main()
{try{RunSnippet();}catch (Exception e){string error = string.Format("---\nThe following error occurred while executing the snippet:\n{0}\n---", e.ToString());Console.WriteLine(error);}finally{Console.Write("Press any key to continue...");Console.ReadKey();}
}
 

代码是Snippet Compiler 的标准模板,在控制台上打印一段字符串。这里,有二个字符串常量,是我需要对它进行加密的地方。

image

不能直接改源代码,而且要以程序的方式来操作程序集。要能修改.net程序集,现在能找到的方法是Mono.Cecil,最新的版本是0.9.5.0。

先设计混淆算法,是个很简单的Base64代码转换,这一步可以深入挖掘,做更复杂的混淆算法。

public static string StringDecode(string text1)
{return Encoding.UTF8.GetString(Convert.FromBase64String(text1));
}

要把这段代码转化为IL代码,用Mono.Cecil来注入到制定的程序集中,先来看看翻译成IL之后的代码

.method public hidebysig static string StringDecode(string) cil managed
{.maxstack 8L_0000: call class [mscorlib]System.Text.Encoding [mscorlib]System.Text.Encoding::get_UTF8()L_0005: ldarg.0 L_0006: call uint8[] [mscorlib]System.Convert::FromBase64String(string)L_000b: callvirt instance string [mscorlib]System.Text.Encoding::GetString(uint8[])L_0010: ret 
}

再对比Mono.Cecil的语法例子,把上面的IL代码,翻译成C#代码

MethodDefinition new_method = new MethodDefinition("StringDecode", attr, asm.MainModule.Import(typeof(string)));
ParameterDefinition para = new ParameterDefinition(asm.MainModule.Import(typeof(string)));
new_method.Parameters.Add(para);
tp.Methods.Add(new_method);new_method.Body.MaxStackSize = 8;
MethodReference mr;
ILProcessor worker = new_method.Body.GetILProcessor ();mr = asm.MainModule.Import(typeof(Encoding).GetMethod("get_UTF8"));
worker.Append(worker.Create(OpCodes.Call, mr));worker.Append(worker.Create(OpCodes.Ldarg_0));mr = asm.MainModule.Import(typeof(Convert).GetMethod("FromBase64String"));
worker.Append(worker.Create(OpCodes.Call, mr));mr = asm.MainModule.Import(typeof(Encoding).GetMethod("GetString", new Type[] { typeof(Byte[]) }));
worker.Append(worker.Create(OpCodes.Callvirt, mr));
worker.Append(worker.Create(OpCodes.Ret));

 

再次,我样要搜索目标程序集中的所有字符串,把它转化成Base64的字符串编码,于是遍历IL指令,进行转化

List<Instruction>  actionInsert=new List<Instruction> ();
foreach (Instruction ins in entry_point.Body.Instructions)
{if (ins.OpCode.Name == "ldstr"){Console.WriteLine("Find target instruction, start modify..");byte[] bytes = System.Text.Encoding.UTF8.GetBytes (Convert.ToString (ins.Operand));ins.Operand = Convert.ToBase64String (bytes);actionInsert.Add(ins);}
}
 
 

最后,我们把原来的指令替换成字符串混淆算法调用

for (int i = 0; i < actionInsert.Count; i++)
{mr = asm.MainModule.Import(new_method);worker = entry_point.Body.GetILProcessor();worker.InsertAfter(actionInsert[i], worker.Create(OpCodes.Call, mr));
}
 
 

最后保存程序集,用.net Reflector 载入程序集,如下图所示,字符串常量已经变成了方法调用:

image

这样,增加了代码反编译的难度,字符串的含义完全被替换成一堆无意义的字符串。

Mono.Cecil最新的版本中,API有变化,本篇程序代码中应用到的读取程序集和写入程序集

string path = @"C:\Users\Administrator\Desktop\CPP\Default.exe";
AssemblyDefinition asm = AssemblyDefinition.ReadAssembly(path);
MethodDefinition entry_point = asm.EntryPoint;path = @"C:\Users\Administrator\Desktop\CPP\DefaultSecury.exe";
asm.MainModule.Write(path);

关于字符串混淆算法,下面列举几个我找到的混淆算法,加密强度会高一些:

static string stringEncrypt(string string_0)
{char[] chArray;char[] chArray1 = chArray = string_0.ToCharArray();while (true){int num;int length = chArray1.Length;if (length <= 0){break;}chArray1[num = length + -1] = (char) (chArray[num] - 'ᑩ');}return string.Intern(new string(chArray));
}
 

下面是Dotfuscator的混淆算法,还加了盐,强度提升不少。

static string GetString(string source, int salt){int index = 0;char[] data = source.ToCharArray();salt += 0xe74d6d7; // This const data generated by dotfuscatorwhile (index < data.Length){char key = data[index];byte low = (byte)((key & '\x00ff') ^ salt++);byte high = (byte)((key >> 8) ^ salt++);data[index] = (char)((low << 8 | high));index++;}return string.Intern(new string(data));}
 

经过混淆后的字符串,完全看不出原文的含义。比如下面的代码片段,都有些怀疑它使用的字符集,有点像中东国家的语言

 

再来看一个代码中有中文的例子,这是一段用户登陆代码,它加密后的字符看起来更不可理解。

image

如果要给字符串混淆加盐,只需要简单的修改上面的代码,添加一个临时变量,再增加到调用的混淆算法中。

全文代码以NUnit测试方法写成,单元测试配合Resharper真是好用,可以节省大量的代码,一个方法即可作为入口程序启动运行。

给开发和测试带多很多方便。

转载于:https://www.cnblogs.com/JamesLi2015/p/3168786.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github上的各大高校资料以及国外公开课视频

2019 第 37 篇文章&#xff0c;总第 61 篇文章本文大约 1800 字&#xff0c;阅读大约需要 5 分钟最近发现兴起了一股在 Github 上大学的潮流&#xff0c;目前可以选择的大学包括清华、北大、上海交通大学、中国科学技术大学、中山大学&#xff0c;然后今天还发现还可以选择上国…

Python基础入门_2基础语法和变量类型

Python 基础入门系列第二篇&#xff0c;上一篇简单介绍了为什么用 Python&#xff0c;以及安装和配置环境。 这一篇将先介绍基础的语法&#xff0c;包括标识符&#xff0c;即变量名字&#xff0c;然后 Python 特色的缩进规则&#xff0c;注释、保留字等等&#xff0c;接着就是…

java解析bmp文件

最近想做一个图片查看器&#xff0c;因为bmp的图片简单些&#xff0c;也就从这个入手。 运用的基本知识还是IO的&#xff0c;关键是在于对于“协议”的理解。 一直觉得这些个协议是个很帅气的东西。感觉就像密码一样&#xff0c;你读到了一个文件&#xff0c;你只有知道对方的“…

不到20行代码,用Python做一个智能聊天机器人

这是小编推荐的第 11 篇好文来源&#xff1a;菜鸟学Python作者&#xff1a;小安和小编伴随着自然语言技术和机器学习技术的发展&#xff0c;越来越多的有意思的自然语言小项目呈现在大家的眼前&#xff0c;聊天机器人就是其中最典型的应用&#xff0c;今天小编就带领大家用不到…

详解div+css相对定位和绝对定位用法

1.定位的专业解释&#xff1a; (1)语法 position:static|absolute|fixed|relative 从上面语法可以看出&#xff0c;定位的方法有很多种&#xff0c;它们分别是静态(static)&#xff0c;绝对定位(absolute)&#xff0c;固定(fixed)&#xff0c;相对定位(relative)。在这个教程里…

Python基础入门_3条件语句和迭代循环

Python 基础入门前两篇&#xff1a; Python 基础入门–简介和环境配置Python基础入门_2基础语法和变量类型 这是第三篇内容&#xff0c;主要简单介绍条件语句和迭代循环语句&#xff0c;内容也比较简单&#xff0c;目录如下&#xff1a; 条件语句和迭代循环 1. 条件语句 Py…

排序算法比较总结

冒泡排序 每次从头开始&#xff08;每次结束可以不到最后&#xff0c;因为上一次已经确定最大值在末尾了&#xff09;&#xff0c;比较相邻两个数&#xff0c;每次下沉一个最大值。 123456789101112131415161718192021222324252627282930313233343536 #include <iostream>…

如果你还不了解GBDT,不妨看看这篇文章

作者&#xff1a;Freemanzxp简介&#xff1a;中科大研二在读&#xff0c;目前在微软亚洲研究院实习&#xff0c;主要研究方向是机器学习。原文&#xff1a;https://blog.csdn.net/zpalyq110/article/details/79527653Github&#xff1a;https://github.com/Freemanzxp/GBDT_Sim…

来了解下计算机视觉的八大应用

2019 第 40 篇&#xff0c;总第 64 篇文章本文大约7000字&#xff0c;建议收藏阅读之前通过三篇文章简单介绍了机器学习常用的几种经典算法&#xff0c;当然也包括了目前很火的 CNNs 算法了&#xff1a;常用机器学习算法汇总比较(上&#xff09;常用机器学习算法汇总比较(中&am…

itchat 保存好友信息以及生成好友头像图片墙

2019 第 41 篇&#xff0c;总第 65 篇文章本文大约 4000 字&#xff0c;阅读大约需要 12 分钟最近简单运用 itchat 这个库来实现一些简单的应用&#xff0c;主要包括以下几个应用&#xff1a;统计保存好友的数量和信息统计和保存关注的公众号数量和信息简单生成好友头像的图片墙…

启动outlook时报错:mapi无法加载信息服务msncon.dll

今天这个Office2010 outlook搞的让人蛋疼&#xff0c;老是说启动outlook时报错&#xff1a;mapi无法加载信息服务msncon.dll。 百度了一下&#xff0c;如下解决方案&#xff1a; 安装路径为D:\NEW Windows7 File\office2010\Office14 在命令行中定位到outlook安装文件夹&#x…

快速入门Pytorch(1)--安装、张量以及梯度

2019 第 42 篇&#xff0c;总第 66 篇文章本文大约 9000 字&#xff0c;建议收藏阅读&#xff01;这是翻译自官方的入门教程&#xff0c;教程地址如下&#xff1a;https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html虽然教程名字是 60 分钟入门&#xff0…