dotnetCHARTING v7.0去水印记录

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值