破解一款软件验证

开始

  马上就要开始考教资了,现在开始准备学习,然后日常翻翻B站,发现了感觉不错的课程。但是电脑端不能下载怎么办?

​ 其实之前有用过下载工具的,不过此时找不到了,那就网上下载一个,结果发现需要关注公众号,哎?我不想关注,感觉作者也不容易,我于是就关注了,并且请求一个验证码。

​ 结果验证码不好使,死活不好使。那么我寻思是否可以用它练习一下逆向能力呢?

OD尝试

  1. 首先打开OD,然后把程序拖进去
  2. 结果发现程序直接就飞了...
  3. OD好像不太合适
  4. 再想想大佬们说开始之前应该先查壳 : - )

PEID查壳

  1. 查壳结果如下

    image-20200227194315877

  2. 这里可以看到是一个 32位程序,是C#开发的,并且好像没有加壳
  3. C#的话 我记的是有专门工具的, 之前还用它反编译过一个游戏,去爱盘下载到 dnSpy

dnSpy 反编译

  1. 原本以为要用OD跟踪调试,会很麻烦,没想到是C#开发
  2. 拖进dnSpy 直接把代码给反编译出来了,甚至没有做混淆
  3. 定位到入口

image-20200227194904189

这里可以看到 运行之后首先会检查更新,不过因为是最新版的关系 我运行是没有察觉

因为没有写过C#的关系,第二行第三行不知道是干嘛的,但是最后一行能看出来是实例化了一个主窗口

  1. 点击进入之后

image-20200227195134822

  1. 再进去

image-20200227195207530

  1. 根据之前写Java代码的经验来看 这个应该就是主页上各种组件了,现在尝试找到触发弹窗的按钮,并且找到关联的回调函数
  2. 根据按钮标题可以找到

image-20200227195431560

  1. 继续进去可以看到大概逻辑

image-20200227195537825

  1. 首先判断编辑框是否为空,然后判断版权,这里的话不清楚B站版权的能不能直接下载
  2. 看到this.check() 应该是一个关键的,因为下面直接开启了一个线程,已经开始下载视频了,那么直接把判断中的! 去掉,就行了,这样 不管它检查了什么,都会直接过掉,编辑代码保存即可
  3. 之后运行反编译之后的程序,发现已经过了验证 不需要验证码了

其他方法

  1. 既然都看到代码了,我也好奇它check了啥
public bool check()
        {
            string text = FileUtil.checkOpenId();
            string text2 = "http://www.屏蔽.com/qrcode/ajax/query/";
            if (text != null && !"".Equals(text))
            {
                text2 = text2 + "?openid=" + text.Trim();
            }
            else
            {
                text2 = text2 + "?mac=" + ManagementSystemInfo.getMac().Trim();
            }
            Console.WriteLine("----" + text2 + "---");
            string text3 = "";
            try
            {
                text3 = HttpUtil.HttpGet(text2, null, null);
            }
            catch (Exception)
            {
            }
            if (text3 == null || "".Equals(text3))
            {
                return false;
            }
            Console.WriteLine(text3);
            MessagePack messagePack = JsonConvert.DeserializeObject<MessagePack>(text3);
            string status = messagePack.status;
            if (status == "nodata")
            {
                new Subscribe().ShowDialog();
                return false;
            }
            if (status == "fobidden")
            {
                MessageBox.Show("不能使用该软件");
                return false;
            }
            if (!(status == "custom"))
            {
                FileUtil.writeOpenId(messagePack.openid);
                return true;
            }
            MessageBox.Show(messagePack.message);
            return false;
        }
  1. 上面就是check() 的代码 可以看到,它get了openid ,进去查看代码之后,知道就是公众号发布的验证码
  2. 判断有没有openid 如果没有,就获取主机的mac地址(我猜的),然后给提交上服务器去了(蜜汁操作)
  3. 然后请求了一个接口,判断在数据库中是否有这个验证码,讲道理,我既然有公众号给的openid应该能过这里的判断才对啊,于是我浏览器直接请求这个链接,发现得到的json结果 status 是 nodata
  4. 那这里有验证码也不能使用就确实是服务器那边有问题了
  5. 根据请求的接口 会返回一个json ,根据status 决定了之后的行为,比如我有验证码但是错误 就会弹出来窗口,

让我关注公众号 (但是真的有用的话 我就不会写这个文章了)

  1. 如果 status == fobidden 那就弹出相应提示,
  2. 最重要的是那个 custom 状态,会更新本地的openid 那么此时我有一个不修改代码就能过验证的方法...

网址劫持

hosts 文件 hosts文件负责解析域名并优先于DNS服务,通常很多恶意软件会恶意更改该文件来达到劫持网站的目地。

  1. 那么我只要通过hosts文件修改他的域名指向,指向到我的 127.0.0.1 然后 我本地构造出符合条件的json字符串 就可以过了验证
  2. 于是我在 hosts文件中添加

image-20200227201510731

  1. 这样 我访问网址之后 会被跳转到我的本地服务器,然后根据url构造请求文件

image-20200227205003682

  1. 访问结果如下

image-20200227204948578

  1. 此时再打开软件,就可以跳过验证 (好神奇....)

软件作者看到这个 别杀我祭天 QAQ 我没分享出去

猜你喜欢

转载自www.cnblogs.com/cjdty/p/12374948.html