aardio爬蟲) 實戰篇:逆向有道翻譯web介面

来源:https://www.cnblogs.com/kanadeblisst/p/18174306
-Advertisement-
Play Games

前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...


前言

之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/

逆向思路

逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼,逆向我就不贅述了。這篇文章說一下怎麼將文章中給的Python代碼翻譯成aardio調用和扣js代碼用ChakraCore調用。

扣js代碼

有道翻譯的js是webpack,扣webpack主要有兩個內容,一個是載入器函數,還有就是實際調用的函數。這個可以去看b站志遠一期的內容,講的很詳細。

這個我看了下,把整個js放到nodejs里執行就行,不需要扣函數,函數和函數之間關聯太多了,扣反而不方便。上面補個window,然後導出成全局函數。

91565這個函數在另一個js文件里,把整個大對象拿下來和e合併一下。

然後就可以直接調用

var r = n(91565)
console.log(r.createHash("md5").update("11111111").digest("hex"))

再封裝兩個函數給外部調用:

function md5(content){
    let r = n(91565);
    return r.createHash("md5").update(content).digest("hex");
};

function aes_cbc_decrypt(key, iv, content){
    let r = n(91565);
    let o = r.createHash("md5").update(key).digest();
    let a = r.createHash("md5").update(iv).digest() ; 
    let i = r.createDecipheriv("aes-128-cbc", o, a);
    let c = i.update(content, "base64", "utf-8");
    return c += i.final("utf-8");
};

測試了封裝的ChakraCore庫,有個莫名其妙的bug:如果不在js里調用這兩個函數,那你再aardio使用run或者callFunction調用可能會報錯,測試了半天也沒找到具體原因,主要是ChakraCore的文檔有點少。

沒辦法,目前只能在javaScript里先調用一次,這個bug後面看看能不能解決

var decodeiv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4";
var decodekey = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl";
var text = "";
// 需要先在js里調用一次,不然aardio調用報錯
md5("1111")
aes_cbc_decrypt(decodekey, decodeiv, text)

用ChakraCore調用的完整代碼(js文件我放到了aardio-extlibs那個github倉庫里作為ChakraCore的用例):

import console; 
import kirequests;
import ChakraCore;
io.open()
var core = ChakraCore()
core.start()

core.run(string.load("./有道翻譯.js"))

var client = "fanyideskweb";
var product = "webfanyi";
var key = "fsdsogkndfokasodnaso";
var signStr = `client=%s&mysticTime=%s&product=%s&key=%s`;

// 先請求主頁獲取cookie
var session = kirequests.session();
var url = "https://fanyi.youdao.com/index.html"
var resp = session.get(url);

// 要翻譯的內容
var word = "中國";
// 內容是什麼語言
var from = "auto";
// 想翻譯成什麼語言
var to = "";
var webtranslateApi = "https://dict.youdao.com/webtranslate";
var timestamp = tostring(tonumber(time())) + string.random(3,"1234567890");
var postData = {
	"i": word,
	"from": from,
	"to": to,
	"domain": "0",
	"dictResult": "true",
	"keyid": product,
	"client": client,
	"product": product,
	"appVersion": "1.0.0",
	"vendor": "web",
	"pointParam": "client,mysticTime,product",
	"mysticTime": timestamp,
	"keyfrom": "fanyi.web",
	"mid": "1",
	"screen": "1",
	"model": "1",
	"network": "wifi",
	"abtest": "0",
	"yduuid": "abcdefg"
}
var s = string.format(signStr, client,timestamp,product,key)
postData["sign"] =  core.callFunction("window.md5",s);
var resp = session.post(url=webtranslateApi,data=postData);
// 開始解密
var decodeiv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4";
var decodekey = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl";
var result = core.callFunction("window.aes_cbc_decrypt", decodekey, decodeiv,resp.text)
console.log(result)
console.pause(true);

aardio實現

這裡在給個不用ChakraCore用上篇文章寫的aes庫調用的代碼。

import console; 
import kirequests;
import kicrypt.aes;
import crypt;
import crypt.bin;


var client = "fanyideskweb";
var product = "webfanyi";
var key = "fsdsogkndfokasodnaso";
var signStr = `client=%s&mysticTime=%s&product=%s&key=%s`;

// 先請求主頁獲取cookie
var session = kirequests.session();
var url = "https://fanyi.youdao.com/index.html"
var resp = session.get(url);

// 要翻譯的內容
var word = "hello";
// 內容是什麼語言
var from = "auto";
// 想翻譯成什麼語言
var to = "";
var webtranslateApi = "https://dict.youdao.com/webtranslate";
var timestamp = tostring(tonumber(time())) + string.random(3,"1234567890");
var postData = {
	"i": word,
	"from": from,
	"to": to,
	"domain": "0",
	"dictResult": "true",
	"keyid": product,
	"client": client,
	"product": product,
	"appVersion": "1.0.0",
	"vendor": "web",
	"pointParam": "client,mysticTime,product",
	"mysticTime": timestamp,
	"keyfrom": "fanyi.web",
	"mid": "1",
	"screen": "1",
	"model": "1",
	"network": "wifi",
	"abtest": "0",
	"yduuid": "abcdefg"
}

postData["sign"] = crypt.md5(string.format(signStr, client,timestamp,product,key),false);
var resp = session.post(url=webtranslateApi,data=postData);
// 開始解密
var decodeiv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4";
var decodekey = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl";
var key = string.unhex(crypt.md5(decodekey,false),"")
var iv = string.unhex(crypt.md5(decodeiv,false),"")
var aesObj = kicrypt.aes(key, iv);
var data = crypt.bin.decodeUrlBase64(resp.text)
var result = aesObj.decrypt(data, kicrypt.aes.CBC)
console.log(result)
console.pause(true);

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在電子商務系統中,SKU(Stock Keeping Unit,庫存單位)和SPU(Standard Product Unit,標準產品單位)是兩種不同的概念,它們共同用於商品管理和庫存控制。雖然理論上可以只使用SKU來管理商品,但在實際應用中,同時使用SPU和SKU有其明顯的優勢和必要性。 SKU ...
  • 這一篇文章拖了有點久,雖然在項目中使用分散式鎖的頻率比較高,但整理成文章發佈出來還是花了一點時間。在一些移動端、用戶量大的互聯網項目中,經常會使用到 Redis 分散式鎖作為控制訪問高併發的工具。 ...
  • 作者:avengerEug 鏈接:https://juejin.cn/post/6984574787511123999 前言 經過前面對Spring AOP、事務的總結,我們已經對它們有了一個比較感性的認知了。 今天,我繼續安利一個獨門絕技:Spring 事務的鉤子函數。單純的講技術可能比較枯燥乏味 ...
  • 在Spring中,CompletableFuture通常用於非同步編程,可以方便地處理非同步任務的執行和結果處理,CompletableFuture 是 Java 8 引入的一個類,用於支持非同步編程和併發操作。它基於 Future 和 CompletionStage 介面,提供了豐富的方法來處理非同步任務 ...
  • 正文 今天值班,但是睡到 9:30 才醒。副行長在我睡覺的時候打電話,說他有事待會兒來。我一聽這話,肯定就不會來了,果然不出所料(笑。下午 16:00 早退,反正值班沒人管,17:00 有點困,便睡了一覺。以為最多睡到 18:30,結果睡到了 19:30…… 弄好了靈送的綠植和透明板。研究了一下蘭的 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...