wmsuper 发表于 2017-5-15 23:36

对一个在线学习的秒挂助手的破解

本帖最后由 wmsuper 于 2017-5-15 23:54 编辑

0x01 软件分析
软件是由C#写的,需要充值,否则不能使用,其次软件并没有加壳,猜测能直接爆破。


0x02 软件破解
直接改跳转,把brtrue.s->(206)改成brtrue.s->(188)即无论正确与否都跳转到下一句,到这里,保存之后能成功运行并开始进行秒挂操作,看样子是成功破解了

0x03 遇到问题
在破解第二天之后,发现软件不行了,全部失败,估计有验证。


仔细查看代码,发现程序在确认信息的时候,会发送支付请求,但是实际上余额不足不会发起支付请求的,所以这样会被作者察觉可能软件被非法修改。那么他是如何让秒挂结果失败的呢?进一步发现有一处登陆的地方,获取登陆后的cookies,但是登陆的账号和密码并不是发往在线学习网站,而是发往作者服务器的,由作者的服务器作为代{过}{滤}理对在线学习的网站发起请求,
并返回对应的登陆cookies,所以作者可以轻易把账号或IP作为黑名单拉黑。

示意图如下:

从以上可以知道,软件并没有实现登陆网站的逻辑,登陆逻辑在服务器上,但是却实现了秒挂的代码,所以要实现的是直接登陆获取获取登陆cookies而不依赖作者的服务器。
0x04 软件补完计划
先把程序反编译并导出,并把所有关于支付的代码注释掉。研究了下登陆POST的请求,发现很简单,教科书式的登陆:

写出获取cookies的函数,替换掉原来获取cookies的代码,这样就能把软件缺少的那部分代码逻辑补完了(ps:还有一处获取cookies的地方,原理差不多,不再赘述。)
public string getCookies(string url, string account, string password)
      {
            CookieContainer cc = new CookieContainer();
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            string postData = "txtLoginName=" + account + "&txtPassword=" + password;
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            request.ContentType = "application/x-www-form-urlencoded";
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
            request.ProtocolVersion = HttpVersion.Version11;
            request.AllowAutoRedirect = true;
            request.ContentLength = byteArray.Length;
            request.CookieContainer = cc;
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();
            reader.Close();
            dataStream.Close();
            response.Close();
            //判断登录是否成功
            // Console.WriteLine(responseFromServer);

            if (responseFromServer.Contains("用户名或密码错误"))
                return "-1";
            else
                return cc.GetCookieHeader(request.RequestUri); ;

      }
this.student_COOKIE =getCookies("http://student.uestcedu.com/login.jsp", this.txtUserName.Text, this.txtPassWord.Text);

0x05 建议
1.加强壳,比较厉害当然是DNG啦。
2.把重要的代码实现逻辑都放在服务器上,那么破解程序的难度不亚于重新编写一个程序的难度。(注意处理网站的安全性,尤其是个人网站,否则黑客嘿嘿嘿)

Hmily 发表于 2017-5-16 11:45

学习了,思路开阔,干的漂亮!

corbell 发表于 2017-5-16 17:48

其实吧,我觉得有些课真的很没必要....但我也理解学校的难处

qq749858568 发表于 2017-5-16 00:47

破解后的demo在哪

乖乖黑娃娃 发表于 2017-5-16 00:52

谢谢分享

苏醒梦回 发表于 2017-5-16 00:54

看一下,谢谢分享

宇宙小菜鸟 发表于 2017-5-16 00:57

受教了感谢分享

key4479 发表于 2017-5-16 01:53

请问楼主有没有网络学习挂机类的工具破解案例或教程?

qaz003 发表于 2017-5-16 03:13

谢谢分享。。。涨姿势了。。

YsGer 发表于 2017-5-16 04:17

不谋而合的想法,可惜我研究的那个c#程序还么有成功!{:1_906:}

nmsl 发表于 2017-5-16 04:37

感谢发布原创作品,吾爱破解论坛因你更精彩!

hubengbeng 发表于 2017-5-16 08:37

学习学习感谢分享
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 对一个在线学习的秒挂助手的破解