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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM