去掉ILDasm的SuppressIldasmAttribute限制
原文:去掉ILDasm的SuppressIldasmAttribute限制
今天本打算汉化一个.Net程序的,当用ILDasm打开的时候,出现了"受保护模块—无法进行反汇编"的错误提示

看到这个错误提示后,便尝试用ILSpy打开,结果一切正常。网上搜了下,原来是SuppressIldasmAttribute这个属性弄的。
关于SuppressIldasmAttribute这个属性,它可以在程序集中声明,声明这个属性后,ILDasm便不对这个程序集进行反汇编,从而起到一定程度的保护作用。其使用方法可以参看使用SuppressIldasmAttribute防止MSIL反組譯工具對組件進行反組譯这篇文章。
不过,这个SuppressIldasmAttribute是个君子协议,就算加上这个声明,编译器也没有什么额外的保护操作,只是ILDasm不对它反汇编罢了。像ILSpy、Reflector等第三方反编译工具都是无视这个属性的,基本上是一种掩耳盗铃罢了。园子里有篇文章谈谈ILDasm的功能限制与解除比较详细的介绍到了这个。
那么,如果我们要用ILDasm越过SuppressIldasmAttribute的限制反汇编程序该怎么办呢?一种方法是写个程序修改该程序集的的IL码,去掉SuppressIldasmAttribute属性,代码如下(需要Mono.Cecil库支持):
public static void RemoveSuppressIldasmAttribute(string input, string output)
{
AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(input);
foreach (CustomAttribute attribute in assembly.CustomAttributes)
{
if (attribute.Constructor.DeclaringType.Name == "SuppressIldasmAttribute")
{
assembly.CustomAttributes.Remove(attribute);
break;
}
}
assembly.Name.PublicKey = null;
assembly.Name.PublicKeyToken = null;
assembly.Write(output);
}
用这个函数把程序集中的SuppressIldasmAttribute属性去掉后,就可以用ILDasm打开了。
这个方法略显麻烦,在前面的文章谈谈ILDasm的功能限制与解除中给出了另一种解决方法:直接去掉ILDasm中对SuppressIldasmAttribute的限制,这样就可以打开有SuppressIldasmAttribute声明的程序集了。原文中已经给了一个修改后的ILDasm.exe的下载,不过由于该文章发表时间较早,给出的ILDasm.exe的版本也比较老,要使用最新的ILDasm.exe必须我们自己修改。原文中是通过反汇编的方式修改的,比较麻烦,这里给一个简单的方法。
1. 将ILDasm.exe改个扩展名(记得备份原文件),然后用VisualStudio打开。
PS:之所以要改扩展名,是因为我要以十六进制的方式编辑,如果不改扩展名的话,VS把它当个exe打开,只能修改资源文件,如果用Ultraedit或WinHex之类的程序以十六进制方式编辑则可以不用改扩展名。
2. 查找SuppressIldasmAttribute字符串

3. 把它修改成一个其他的字符串(似乎不能乱改,包括长度,所以我随便替换某个字符即可)

4. 保存修改后还原扩展名为.exe,这样你的新ILDasm.exe就无视SuppressIldasmAttribute了。
去掉ILDasm的SuppressIldasmAttribute限制的更多相关文章
- C# 反编译防范
C# 编写的代码通过VS编译器生成 dll 或 exe ,很容易被一些反编译工具查看到源码或对源码进行修改.为防止代码被反编译或被篡改,我们可以进行一定的防范措施.但不能杜绝,因为DotNet编写代码 ...
- 【解决方案】VS2013外部工具中添加ildasm.exe
VS2013安装在Win8.1的操作系统中,开始屏幕中找不到ildasm.exe没有显示,于是下面提供了一种方法将ildasm.exe工具添加到VS2013外部工具中,并将反编译的代码输出到VS201 ...
- 谈谈ILDasm的功能限制与解除
原文:谈谈ILDasm的功能限制与解除 首先,我在此申明,此文并不是教别人突破限制,我们只是用学习的眼光看问题 大家都知道ILDasm是.NET程序的反编译工具,它是由Microsoft提供的反编译工 ...
- 最新 去掉 Chrome 新标签页的8个缩略图
chrome的新标签页的8个缩略图实在让人不爽,网上找了一些去掉这个略缩图的方法,其中很多已经失效.不过其中一个插件虽然按照原来的方法已经不能用了,但是稍微变通一下仍然是可以用的(本方法于2017.1 ...
- wget 显示"英国中部时间",去掉烦人的刷屏显示
wget下载文件显示多行,进度条后面显示英国中部时间,非常让人郁闷. 本来英文是eta(Estimated Time of Arrival 预计到达时间),翻译错了,干脆去掉好了. 先要有两个个工具 ...
- String 中去掉空格
JAVA中去掉空格 1. String.trim() trim()是去掉首尾空格 2.str.replace(" ", ""); 去掉所有空格,包括首尾.中间 ...
- navigationController 去掉背景图片、去掉底部线条
//去掉背景图片 [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMe ...
- [LeetCode] Remove K Digits 去掉K位数字
Given a non-negative integer num represented as a string, remove k digits from the number so that th ...
- 写出将字符串中的数字转换为整型的方法,如:“as31d2v”->312,并写出相应的单元测试,正则去掉非数值、小数点及正负号外的字符串
写出将字符串中的数字转换为整型的方法,如:"as31d2v"->312,并写出相应的单元测试,输入超过int范围时提示不合法输入. public struct Convert ...
随机推荐
- Counting Triangles(hd1396)
Counting Triangles Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- ADO.NET帮助类DBHelper
一. DBHelper帮助类 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- MYSQL 提取时间中的信息的 4 方法
方法 1. year(),month(),day() 方法 2. dayofweek(),dayofmonth(),dayofyear(); 方法 3. hour(),minute(),second( ...
- Linux操作系统安全(一)
谈到Linux,大伙最先想到的是这是一个由全世界的优秀的黑客共同开发的一个开源操作系统,目前在服务器领域有着非常广的使用,同时,基于Linux操作系统而开发的Android系统也已经占据了移 ...
- javascript对象继承的实现
现在有两个对象,需要实现Chinese类型对象对Person类型对象的继承. 这里分两部分,属性和方法. 属性可以直接用构造函数的方法实现继承,而方法则要通过原型链来实现继承. 先解释什么是原型链,每 ...
- linux服务器开发浅谈
[开发前准备] 在进行linux服务器开发之前,必须很清楚地了解所开发的对象需要考虑的相关问题比如:功能架构:提供服务的模块体系结构稳定性:服务器的出core率,内存泄露情况性能:请求与返回的速度与正 ...
- TX enqueue DRM
- Java中的import
有些人写了一阵子 Java,可是对于 Java的 package 跟 import 还是不太了解.很多人以为原始码 .java 文件中的 import 会让编译器把所 import 的程序通通写到编译 ...
- MVC模式下My97DatePicker日期控件引用注意事项
My97DatePicker日期控件之前在用webform模式开发的时候,只要 <script language="javascript" type="text/j ...
- session劫持以及预防
session劫持是一种广泛存在的比较严重的安全威胁,在session技术中,客户端和服务端通过session的标识符来维护会话, 但这个标识符很容易就能被嗅探到,从而被其他人利用.它是中间人攻击的一 ...