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 我没分享出去

  • 相关阅读:
    Java实现 LeetCode 343 整数拆分(动态规划入门经典)
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 338 比特位计数
    H264(NAL简介与I帧判断)
    分享一段H264视频和AAC音频的RTP封包代码
  • 原文地址:https://www.cnblogs.com/cjdty/p/12374948.html
Copyright © 2011-2022 走看看