试用版的spire.xls在生成excel时,会在文件中加入一个名叫Evaluation Warning的Sheet,显示试用信息以及版权信息购买方式等,
明显生成这样的excel是不能用于生产环境的,
如果要去掉这个sheet,需要找到关键代码,使用ILSpy或者Reflector打开dll文件(Reflactor会报错,还是ILSpy靠谱), 明显代码是被混淆了的,基本上可以判断混淆的字符串是用到一个解密方法来解密成原字符串的:
internal
static
string
b(
string
A_0,
int
A_1)
{
char
[] array = A_0.ToCharArray();
int
num = 1400442094 + A_1;
int
arg_47_0;
int
arg_14_0;
if
((arg_14_0 = (arg_47_0 = 0)) < 1)
{
goto
IL_47;
}
IL_14:
int
num2;
int
expr_14 = num2 = arg_14_0;
char
[] arg_44_0 = array;
int
arg_44_1 = num2;
char
expr_1B = array[num2];
byte
b = (
byte
)((
int
)(expr_1B &
'ÿ'
) ^ num++);
byte
b2 = (
byte
)((
int
)(expr_1B >> 8) ^ num++);
byte
arg_3C_0 = b2;
b2 = b;
b = arg_3C_0;
arg_44_0[arg_44_1] = (
char
)((
int
)b2 << 8 | (
int
)b);
arg_47_0 = expr_14 + 1;
IL_47:
if
((arg_14_0 = arg_47_0) >= array.Length)
{
return
string
.Intern(
new
string
(array));
}
goto
IL_14;
}
第一个参数是加密后的字符串,第二个参数是一个数字,具体不知道代表什么,在调用的时候按照代码里面的值拷贝过来就行了。
想了一会没想到突破口,最后想到了,利用反推办法 ,既然在写文件的时候会多插入一个sheet,而且还会写入字符串到单元格,也就是会调用
Worksheet.Range[x,y]="版权信息";
类似的代码,分析一下Worksheet的Range属性
这个
Workbook.0的方法很可疑,进去看看
解密一下
可以确定这个方法就是用来插入版权信息sheet的,把这个方法体的内容清空应该就可以了,利用Reflexil修改IL
最后用Reflexil 保存dll,并去掉程序集的强命名(Strong Name)
这样还没完,把这个修改后的dll重新引用后,发现还是不能正常工作,一度怀疑去掉强命名以后,dll内部会做签名的自检查验证,这么高级的验证不知道怎么做,也很想知道,找到答案后其实很简单:
原因是Spire.XLS.dll还会实例化Spire.Pdf.dll中的 被标记为
internal的类,Spire.XLS默认情况是不能调用Spire.Pdf程序集里的标记为
internal的类,但是在
以后可以借鉴一下,让别人就算把签名去掉也没法用你写的dll,但是如果在Spire.Pdf 程序集描述中加上[assembly:
InternalsVisibleTo就允许访问了
[
assembly:
InternalsVisibleTo(
"Spire.XLS, PublicKey=002400000480000094000000060200000024000052534131000400000100010095B1C6F75D4349575193724350FFE019FE6135C34E66BCD90B591FE2ABEE1AD5347CEDE09F870A5E8BE4E78972CE20A719CE85714C093C623685DDD0FC88C3B65B6C35E3316F161B356F921B26D9441FD5EC0436E839C721F7456BBA01523B565AFFD8FED8114551765F0F01C287B8B32BC81042D0508449F369B1254D8463CD")]
修改为 [
assembly:
InternalsVisibleTo(
"Spire.XLS")] 再把Spire.Pdf 程序集的强命名去掉,保存
最后Spire.XLS.dll ,Spire.Pdf.dll ,Spire.License.dll 这3个dll一起就使用