官网下载的dotnetCHARTINGv7.0在底部和右上部带有水印和官网的链接。尝试清除这两部分。在这里记录操作步骤。
一、Web控件和winform控件部分
Web控件和winform控件破解的步骤相同,只是具体的函数不同,以web为例说明。
1、准备ildasm和ilasm。用ildasm生成中间代码。
2、里面有两张水印图片,用ps制作成透明图片。
3、打开il文件,发现字符串被加密,无法通过查找文本定位相关代码。通过观察得知
所有字符串转为了bytearray (A2 9F A4 ED A6 F5 A8 97 ) 形式存储;
调用全局函数string a$PST06000001(string, int32) /* 06000001 */解密字符串。
4、用Reflector7.7打开dotnetCHARTING.dll文件。dll被混淆了。在全局函数部分查找到string a$PST06000001(string, int32) 的定义。但是该函数
有语义错误,无法正确解密字符串。
5、换用dotPeek打开dotnetCHARTING.dll文件。string a$PST06000001(string, int32) 的定义目测没有问题,使用该函数尝试解密一个字符串(dotPeek中反编译出来的),能够得到有意义的文字。函数string a$PST06000001(string, int32) 的string参数为dotPeek中反编译出来的字符串;int32参数在每个函数的开头定义。
6、对比dotPeek中反编译出来的字符串与il中的bytearray 。发现bytearray 中使用了unicode方式编码。改写string a$PST06000001(string, int32) 的实现部分,使其能解密bytearray 。
private string winarr(string str, int count)
{
str = str.Replace(" ", "").Replace("\t", "").Replace("\0","");
Char[] chartmp = new Char[str.Length /4];
string tmp = "";
for (int i = 0; i < str.Length; i += 4)
{
tmp = str[i + 2].ToString() + str[i + 3].ToString() + str[i].ToString() + str[i+1].ToString();
chartmp[i / 4] = (Char)int.Parse(tmp, System.Globalization.NumberStyles.HexNumber);
}
int num1 = 755457428 + count;
int num2 = 0;
int num3 = 1;
if (num2 < num3)
goto label_2;
label_1:
int index1 = num2;
char[] chArray2 = chartmp;
int index2 = index1;
int num4 = (int)(short)chartmp[index1];
int num5 = (int)byte.MaxValue;
int num6 = num4 & num5;
int num7 = num1;
int num8 = 1;
int num9 = num7 + num8;
byte num10 = (byte)(num6 ^ num7);
int num11 = 8;
int num12 = num4 >> num11;
int num13 = num9;
int num14 = 1;
num1 = num13 + num14;
int num15 = (int)(byte)(num12 ^ num13);
int num16 = (int)(ushort)((uint)num10 << 8 | (uint)(byte)num15);
chArray2[index2] = (char)num16;
int num17 = 1;
num2 += num17;
label_2:
int length = chartmp.Length;
if (num2 >= length)
return string.Intern(new string(chartmp));
else
goto label_1;
}
7、按行读取il文件,把其中所有的bytearrary解密为可读的字符串。需要注意的是:需要读取每个函数开头定义的int变量的值,因为这个值是解密函数的第二个参数
FileStream fileW = new FileStream(@"D:\wintxt\1.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter sw = new StreamWriter(fileW, Encoding.ASCII);//D:\当前项目使用\测试\WindowsFormsApplication1\WindowsFormsApplication1\t.cs
FileStream fileStream = new FileStream(@"D:\1\w.il", FileMode.Open, FileAccess.Read);
StreamReader streamReader = new StreamReader(fileStream, Encoding.ASCII);
fileStream.Seek(0, SeekOrigin.Begin);
String content = @streamReader.ReadLine();
int count = 0;
bool isInArr = false;
string arr = "";
while (content != null)
{
if (content.Contains("0x"))
{
int ind = content.IndexOf("0x");
try
{
count = int.Parse(content.Substring(ind + 2).Trim(), System.Globalization.NumberStyles.HexNumber);
}
catch
{
}
}
if (content.Contains("bytearray"))
{
isInArr = true;
arr = content.Substring(content.IndexOf("bytearray (")+11);
}
if (isInArr && content.Contains("IL_") && !content.Contains("bytearray"))
{
isInArr = false;
if (arr.IndexOf(")") > 0)
arr = arr.Substring(0, arr.IndexOf(")"));
string tt = winarr(arr, count);
sw.WriteLine(tt);
//Console.WriteLine(tt);
sw.WriteLine(content);//多输出一行,便于在il文件中定位。
sw.Flush();
}
if (isInArr && !content.Contains("bytearray"))
{
if(content.IndexOf(")")>0)
content= content.Substring(0, content.IndexOf(")"));
if (content.Contains("/"))
{
content = content.Substring(0, content.IndexOf("/"));
}
arr += content.Trim();
}
content = streamReader.ReadLine();
}
8、在新生成的文件中查找相关文本:www、development、visit。然后在il中找到使用这些文本的函数,更进一步在dotPeek中找到该函数。查找规律发现this.b5 & this.b6是条件(winform中是this.b4 && this.b5),只要改为!this.b5 & !this.b6即可去除水印。在il中具体为bool dotnetCHARTING.bj/*02000251*/::b5和bool dotnetCHARTING.bj/*02000251*/::b6;把紧跟在这两个函数后面的brfalse改为brtrue。
9、重新生成dll文件(winform中需要删除il中publickey,hash,publickeytoken,以去掉强名称)。
10、把web控件覆盖官方例子中的对应文件,在网页中查看,成功。
11、winform控件无法在官方例子中使用,因为生成时使用了高版本的ilasm。在vs2010中新建项目(注意项目使用的framwork版本,我的默认使用framwork4 client profile,不能添加到工具箱,改为framwork4 成功)。添加引用,添加到工具箱;复制官方例子中的代码;成功执行。
二、silverlight部分
这一部分没有混淆,水印类为CABand;查找调用该类的代码,进行相应处理即可。
下载地址:
http://download.csdn.net/detail/shmiluwabi666/4888867