Reflector.FileDisassembler的一个bug修复

 Reflector for .NET应该是.NET程序员除了VS.NET以外必备的一个工具,当然
你如果喜欢EditPlus一类的编辑器,甚至VS.NET也可以不用。Reflector内核版本升
级非常的频繁,不过它的一个和重要的功能,获得反编译代码文件的功能却是一个叫
Reflector.FileDisassembler的插件提供的。昨天反编译一个混淆过的assembly,发
现了它的一个bug。
关于反编译别人的assembly对还是不对,不是我这篇文章讨论的话题,如果对这
个感兴趣可以看看蔡学墉写的"To De or Not to De?"。
混淆对变量、类和名称空间的重命名,一般有两种主要的方案:一是简化方案,
把能替换的symbol都换成尽可能简单的字符,从a开始,把大小写的字母排完,然后
aa、ab、...、ZZ,再aaa;另一总方案是,把能替换的symbol都换成很复杂的一个随
机字符串,足有10个以上的字符,其代表是XenoCode。对于使用第一种重命名方案的
混淆器混淆后的结果,很容易出现名称空间叫a和A,类名叫a和A的情况。
Reflector.FileDisassembler生成.cs文件时,按一个class一个文件,文件路径
根据名称空间来组织。这样一来问题就来了,由于Windows系统对于文件名和目录不
区分大小写。如果我assembly中的名称空间叫a和A,其下的类为a和A。那么按照Reflector
.FileDisassembler的文件命名策略就因该得到:a/a.cs、A/a.cs或a/a.cs、a/A.cs
。这样的命名方式在Unix下可以生成不同的文件,可是在Windows下我们只能得到一
个文件:a/a.cs。
幸好Reflector.FileDisassembler发布的时候带有源代码,也就省得去Reflect
一把了,毕竟机器生成的临时变量名看起来还是很不爽的。修复这个bug很简单,修
改了一下CreateFile方法,同时添加了一个GetUniqueFileName方法,源代码如下:
private StreamWriter CreateFile(string directory, string fileName)
{
directory = directory.Replace("<", "_");
directory = directory.Replace(">", "_");
directory = directory.Replace(":", "_");
directory = directory.Replace("|", "_");
directory = directory.Replace("?", "_");
directory = directory.Replace("*", "_");
directory = Path.Combine(this.outputDirectory, directory);
ILanguage language = this.LanguageManager.ActiveLanguage;
string fileExtension = language.FileExtension;
fileName = fileName.Replace("<", "_");
fileName = fileName.Replace(">", "_");
fileName = fileName.Replace(":", "_");
fileName = fileName.Replace("|", "_");
fileName = fileName.Replace("?", "_");
fileName = fileName.Replace("*", "_");
fileName = Path.Combine(directory, fileName);
fileName = Path.ChangeExtension(fileName, fileExtension);
fileName = GetUniqueFileName(fileName);
this.WriteLine(fileName);
directory = fileName.Substring(0, fileName.LastIndexOf('//'));
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
StreamWriter writer = new StreamWriter(fileName);
return writer;
}
private Hashtable fileNames = new Hashtable();
private string GetUniqueFileName(string fileName)
{
string strExtension = Path.GetExtension(fileName);
fileName = fileName.Replace(strExtension, "");
string _fileName = fileName.ToLower();
bool bFirstRename = true;
while(fileNames.Contains(_fileName))
{
string existFileName = (string)fileNames[_fileName];
string [] efnParts = existFileName.Split(new char[] { '//' });
string [] fnParts = fileName.Split(new char[] { '//' });
for (int i = 0; i < fnParts.Length; ++i)
{
if (efnParts != fnParts)
{
if (bFirstRename)
{
fnParts += '_';
bFirstRename = false;
}
fnParts += 'x';
break;
}
}
fileName = string.Empty;
for (int i = 0; i < fnParts.Length; ++i)
{
fileName += '//' + fnParts;
}
fileName = fileName.Substring(1);
_fileName = fileName.ToLower();
}
fileNames[_fileName] = fileName;
return fileName + strExtension;
}
你可以把这段代码加入上面Denis Bauer的Reflector.FileDisassembler源代码
中编译,也可以直接下载最新的插件dll。这个bug同时也反馈给了Denis Bauer,下
个版本因该就会有正式的修复。
原文:[http://www.cnblogs.com/birdshome/archive/2005/04/18/139646.html]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值