dotnetCHARTING v7.0去水印记录

来源:互联网 发布:淘宝上的电棍叫什么 编辑:程序博客网 时间:2024/05/10 20:27

官网下载的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



原创粉丝点击