首页
社区
课程
招聘
[旧帖] [原创]一个.Net网络验证程序的破解[新人求邀请码] 0.00雪花
发表于: 2012-8-28 23:26 5348

[旧帖] [原创]一个.Net网络验证程序的破解[新人求邀请码] 0.00雪花

2012-8-28 23:26
5348

【文章标题】一个.Net网络验证程序的破解
【文章作者】无常pl
【破解工具】Reflector/Http Analyzer/ildasm 
【破解平台】Win7 
【原版下载】不提供
【保护方式】网络会员验证
【软件简介】无 
【破解说明】新手,只是感兴趣,没有其他目的,不足之处还请大家指教 

 这是个需要安装的软件。
安装完以后查启动程序壳,是.Net写的软件。

没有怎么接触过.Net的程序,不知道该怎么下手了。Baidu,google无所不知,搜吧。
用ildasm反汇编
先抓下数据包看看,
随便输入一个用户名和密码。
提示  
 
返回的数据

注册一个账号再试试

返回的数据

分析一下,
第一个数据1可能可能是判断是不是有这个用户,
第二个数据0和第四个数据0可能就是验证的关键了,
最后一个数据可能是请求时间。

分析一下代码

启动程序Dump下来以后看了下,没有找到网络验证的代码,文件也比较小,可能不在这里面。
在文件夹里找了一下,看到了一个叫AppLogin的DLL。看名字验证代码可能再这里面。

[System.Windows.Forms/*23000001*/]System.Windows.Forms.Control/*0100002D*/::Focus() /* 0A000032 */
    IL_005c:  /* 26   |                  */ pop
    IL_005d:  /* 2A   |                  */ ret

    IL_005e:  /* 72   | (70)00026A       */ ldstr      "http://www.xxxx.com/validate/update.asp\?username="
    + "{0}&password={1}&softid=xxxx" /* 7000026A */    验证的网页
    IL_0063:  /* 02   |                  */ ldarg.0
    IL_0064:  /* 7B   | (04)000009       */ ldfld      class [System.Windows.Forms/*23000001*/]System.Windows.Forms.TextBox/*0100000C*/ MailSend.AppLogin.TAppLogin/*02000002*/::TextUsername /* 04000009 */
    IL_0069:  /* 6F   | (0A)00002E       */ callvirt   instance string [System.Windows.Forms/*23000001*/]System.Windows.Forms.Control/*0100002D*/::get_Text() /* 0A00002E */
    IL_006e:  /* 02   |                  */ ldarg.0
    IL_006f:  /* 7B   | (04)000008       */ ldfld      class [System.Windows.Forms/*23000001*/]System.Windows.Forms.TextBox/*0100000C*/ MailSend.AppLogin.TAppLogin/*02000002*/::TextPassword /* 04000008 */
    IL_0074:  /* 6F   | (0A)00002E       */ callvirt   instance string [System.Windows.Forms/*23000001*/]System.Windows.Forms.Control/*0100002D*/::get_Text() /* 0A00002E */
    IL_0079:  /* 28   | (0A)000033       */ call       string [mscorlib/*23000002*/]System.String/*01000023*/::Format(string,
                                                                                                                      object,
                                                                                                                      object) /* 0A000033 */
    IL_007e:  /* 0A   |                  */ stloc.0
    .try
    {
      IL_007f:  /* 06   |                  */ ldloc.0
      IL_0080:  /* 28   | (0A)000013       */ call       string [Other/*23000003*/]MailSend.Other.Func.NetWork/*01000024*/::GetUrlText(string) /* 0A000013 */
      IL_0085:  /* 0B   |                  */ stloc.1
      IL_0086:  /* 07   |                  */ ldloc.1
      IL_0087:  /* 39   | A8010000         */ brfalse    IL_0234      跳到--连接登录服务器误,请稍后再试

      IL_008c:  /* 07   |                  */ ldloc.1
      IL_008d:  /* 7E   | (0A)00002F       */ ldsfld     string [mscorlib/*23000002*/]System.String/*01000023*/::Empty /* 0A00002F */
      IL_0092:  /* 28   | (0A)000034       */ call       bool [mscorlib/*23000002*/]System.String/*01000023*/::op_Inequality(string,
                                                                                                                             string) /* 0A000034 */
      IL_0097:  /* 39   | 98010000         */ brfalse    IL_0234      跳到--连接登录服务器误,请稍后再试

      IL_009c:  /* 07   |                  */ ldloc.1
      IL_009d:  /* 17   |                  */ ldc.i4.1
      IL_009e:  /* 8D   | (01)00002F       */ newarr     [mscorlib/*23000002*/]System.Char/*0100002F*/
      IL_00a3:  /* 0D   |                  */ stloc.3
      IL_00a4:  /* 09   |                  */ ldloc.3
      IL_00a5:  /* 16   |                  */ ldc.i4.0
      IL_00a6:  /* 1F   | 7C               */ ldc.i4.s   124
      IL_00a8:  /* 9D   |                  */ stelem.i2
      IL_00a9:  /* 09   |                  */ ldloc.3
      IL_00aa:  /* 6F   | (0A)000035       */ callvirt   instance string[] [mscorlib/*23000002*/]System.String/*01000023*/::Split(char[]) /* 0A000035 */
      IL_00af:  /* 0C   |                  */ stloc.2
      IL_00b0:  /* 08   |                  */ ldloc.2
      IL_00b1:  /* 16   |                  */ ldc.i4.0
      IL_00b2:  /* 9A   |                  */ ldelem.ref
      IL_00b3:  /* 72   | (70)000315       */ ldstr      "1" /* 70000315 */  这个1可能是验证数据
      IL_00b8:  /* 28   | (0A)000030       */ call       bool [mscorlib/*23000002*/]System.String/*01000023*/::op_Equality(string,
                                                                                                                           string) /* 0A000030 */
      IL_00bd:  /* 39   | 49010000         */ brfalse    IL_020b

      IL_00c2:  /* 08   |                  */ ldloc.2
      IL_00c3:  /* 18   |                  */ ldc.i4.2
      IL_00c4:  /* 9A   |                  */ ldelem.ref
      IL_00c5:  /* 28   | (0A)000015       */ call       valuetype [mscorlib/*23000002*/]System.DateTime/*01000027*/ [mscorlib/*23000002*/]System.Convert/*01000026*/::ToDateTime(string) /* 0A000015 */
      IL_00ca:  /* 28   | (0A)000016       */ call       valuetype [mscorlib/*23000002*/]System.DateTime/*01000027*/ [mscorlib/*23000002*/]System.DateTime/*01000027*/::get_Now() /* 0A000016 */
      IL_00cf:  /* 28   | (0A)000036       */ call       bool [mscorlib/*23000002*/]System.DateTime/*01000027*/::op_GreaterThan(valuetype [mscorlib/*23000002*/]System.DateTime/*01000027*/,
                                                                                                                                valuetype [mscorlib/*23000002*/]System.DateTime/*01000027*/) /* 0A000036 */
      IL_00d4:  /* 39   | FE000000         */ brfalse    IL_01d7         跳到--您的账号使用时已到,请联系客服

      IL_00d9:  /* 08   |                  */ ldloc.2
      IL_00da:  /* 19   |                  */ ldc.i4.3
      IL_00db:  /* 9A   |                  */ ldelem.ref
      IL_00dc:  /* 72   | (70)000319       */ ldstr      "0" /* 70000319 */   这个0可能是验证数据 
      IL_00e1:  /* 28   | (0A)000030       */ call       bool             

第一次接触这种代码,好多都看不太懂。搜搜其他大侠怎么分析这种代码的。
看到Reflector这个程序很强大,直接翻译出源码来了。

private void ButtonLogin_Click(object sender, EventArgs e)
{
    if (this.TextUsername.Text == string.Empty)
    {
        MsgBox.ShowErrorBox("您必须输入用户名");
        this.TextUsername.Focus();
    }
    else if (this.TextPassword.Text == string.Empty)
    {
        MsgBox.ShowErrorBox("您必须输入密码");
        this.TextPassword.Focus();
    }
    else
    {
        string url = string.Format("http://www.xxxxcom/validate/update.asp?username={0}&password={1}&softid=xxxx", this.TextUsername.Text, this.TextPassword.Text);
        try
        {
            string urlText = NetWork.GetUrlText(url);
            if ((urlText != null) && (urlText != string.Empty))
            {
                string[] strArray = urlText.Split(new char[] { '|' });
                if (strArray[0] == "1")
                {
                    if (Convert.ToDateTime(strArray[2]) > DateTime.Now)
                    {
                        if ((strArray[3] == "0") ||(Datetime.DateTimeDiff(Convert.ToDateTime(strArray[3]), Convert.ToDateTime(strArray[4])) > 100L))
                        {
                            this.TempLoginUser.Username = this.TextUsername.Text;
                            this.TempLoginUser.Password = this.TextPassword.Text;
                            this.TempLoginUser.Type = (strArray[1] == "1") ? "收费用户" : "普通用户";
                            this.TempLoginUser.Expire = (strArray[1] == "1") ? Convert.ToDateTime(strArray[2]) : DateTime.Now.AddYears(1);
                            if (this.TempLoginUser.Type == "普通用户")
                            {                             MsgBox.ShowInfoBox("普通账号只可以“xxxx”\n若想无限制使用请联系客服购买。");
                            }
                            Reg.SaveReg("username", this.TextUsername.Text);
                            base.DialogResult = DialogResult.OK;
                        }
                        else
                        {                          MsgBox.ShowErrorBox("同一帐号同一时间只能一人登录!\n如果您上次异常退出程序,请1-2分钟后尝试重新登录。");
                        }
                    }
                    else
                    {
                        MsgBox.ShowErrorBox("您的账号使用时间已到,请联系客服续费。");
                        this.TextPassword.Text = "";
                        this.TextUsername.Focus();
                        this.TextUsername.SelectAll();
                    }
                }
                else
                {
                    MsgBox.ShowErrorBox("账号或密码错误");
                    this.TextPassword.Text = "";
                    this.TextPassword.Focus();
                }
            }
            else
            {
                MsgBox.ShowErrorBox("连接登录服务器错误,请稍后再试");
            }
        }
        catch
        {
            MsgBox.ShowErrorBox("程序出现致命错误。请重新安装程序。");
            Environment.Exit(0);
        }
    }
}

流程清楚多了,返回的数据结构是这样的
1                验证账号或密码错误   
0                是否是收费用户
2012-8-24         到期时间   
0                是否有人登陆
2012-8-24 7:51:31  请求时间

在启动程序调用了Update.dll的ChecUpdate函数检查版本信息

public static void CheckUpdate(int AppID)
{
    string str = GetUrlText(new Uri("http://www.xxxx.com/validate/ver.asp?softid=xxxx"), Encoding.Default, 30);
    if (str != null)
    {
        if (Convert.ToDouble(str) > 4.6)
        {
            MessageBox.Show("软件已升级到 " + str + " 版,点击确定后软件将自动升级到最新版本。");
            Execute(Application.StartupPath + @"\update.exe", "http://www.xxxx.com/download/xxxx_update.rar|" + Path.GetFileName(Application.ExecutablePath), null);
            Environment.Exit(0);
        }
    }
    else
    {
        MessageBox.Show("不能连接到服务器,请联系管理员", "错误", MessageBoxButtons.OK, MessageBoxIcon.Hand);
        Environment.Exit(0);
    }
}

搭个asp服务器
建一个validate/update.asp文件
里面的数据为1 | 1 | 2012-9-24 | 0 | 2012-8-24 7:51:31

建一个validate/ver.asp文件
里面是版本信息

再把C:\Windows\System32\drivers\etc目录下的hosts文件改为  
127.0.0.1   www.xxxx.com

测试时又遇到个问题,

可能在启动程序有检查。

分析一下启动程序有个CheckHosts函数


启动程序检查hosts文件是否改成了xxxx.com.

用ildasm反汇编一下,Dump保存为main.il

找到相应位置

保存一下,用ilasm.exe编译
再进行测试,成功。完

第一次写这东西,有点乱,大家见谅!


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (20)
雪    币: 221
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
分析的很不错。
2个疑问:
1、用本地验证,新版本无需改动直接可以运行;
2、改动程序直接过验证,跳过自动版本更新。
2012-8-29 15:10
0
雪    币: 122
活跃值: (75)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
谢谢,就你回我。其中有版本验证,页面是ver.asp。我忘记写了,已经改了。它是先检查hosts文件是否被修改,然后版本检查。
2012-8-29 18:59
0
雪    币: 278
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
返回竟然是明文...之前破解过某个营销软件,感觉挺像
2012-8-30 13:23
0
雪    币: 584
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
头都看大了,想学习可习基础太差了·
2012-9-2 19:11
0
雪    币: 274
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感觉不错 但看不懂
2012-9-6 11:04
0
雪    币: 87
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不错,但是我是一个纯小白。什么都不懂
2012-9-18 20:59
0
雪    币: 63
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
表示看不懂。
2012-10-19 20:44
0
雪    币: 89
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
看不懂也得看。
2012-10-19 21:07
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢楼主分享。
2012-10-20 20:14
0
雪    币: 63
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看来我还是得学习基础东西。
2012-10-21 08:06
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
mark。网络验证。。。
2015-2-6 13:09
0
雪    币: 26
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我也要邀请码,好吧..我也写个原创破解的。
2015-2-8 18:02
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
就能看懂一点 。。
2015-2-8 20:09
0
雪    币: 3
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yfd
15
谢谢!学习了。
2015-2-9 17:47
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
新手看不懂,努力学习
2015-2-10 16:44
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这个对我有启发。。。。。。
2015-2-11 10:55
0
雪    币: 93
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
.net.学习了,不会弄,呵呵!谢谢!
2015-5-4 08:28
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
触类旁通
2015-9-6 18:17
0
雪    币: 4
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
学习了,谢谢分享
2018-8-26 10:02
0
雪    币: 1385
活跃值: (5609)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
21
2018-9-6 10:04
0
游客
登录 | 注册 方可回帖
返回
//