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方法,源代码如下:

     代码在回复中,贴上代码怎么也不能成功发帖


    你可以把这段代码加入上面Denis Bauer的Reflector.FileDisassembler源代码中编译,也可以直接下载最新的插件dll。这个bug同时也反馈给了Denis Bauer,下个版本因该就会有正式的修复。

posted on 2005-04-18 14:30  birdshome  阅读(8666)  评论(18编辑  收藏  举报

导航