zoukankan      html  css  js  c++  java
  • [Python] 破解一款软件验证

    开始

      		马上就要开始考教资了,现在开始准备学习,然后日常翻翻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 我没分享出去

  • 相关阅读:
    PHP siege 压测 QPS大小
    macOs 使用Homebrew升级到MySQL 8系列之后,php无法连接解决方法
    Nginx无法加载.woff .eot .svg .ttf等解决办法
    layer 点击弹出图片
    glusterFS系统中文管理手册(转载)
    Linux 命令行总结
    linux /proc/meminfo 文件分析(转载)
    每秒执行一个shell脚本(转载)
    python SMTP邮件发送(转载)
    Python XML解析(转载)
  • 原文地址:https://www.cnblogs.com/cjdty/p/12374948.html
Copyright © 2011-2022 走看看