最新webqq密碼的加密方式分析過程
wyzsk發表於2020-08-19
作者:
等TA回來
·
2014/03/27 15:53
授人以魚,不如授人以漁,今天就分享一個 分析qq加密的過程。
工具:谷歌瀏覽器自帶的的除錯工具(在瀏覽器中按F12撥出)
以下是全過程,歷時4個的小時。
提交的時候呼叫 onFormSubmit
#!js
function onFormSubmit(form)
{
if (form.remember_uin.checked){
return ptui_onLoginEx(form, "qq.com")
}else{
var myDate=new Date();
myDate.setFullYear(1971,1,1);
pt.cookie.set("ptui_loginuin", "", myDate, '/', 'ui.ptlogin2.qq.com');
return ptui_onLogin(form);
}
}
如果使用者沒有勾選儲存密碼呼叫 ptui_onLogin
#!js
function ptui_onLogin(A) {
try {
if (parent.ptlogin2_onLogin) {
if (!parent.ptlogin2_onLogin()) {
return false
}
}
if (parent.ptlogin2_onLoginEx) {
var D = A.u.value;
var B = A.verifycode.value;
if (str_uintip == D) {
D = ""
}
if (!parent.ptlogin2_onLoginEx(D, B)) {
return false
}
}
} catch(C) {}
return ptui_checkValidate(A)
}
接下來呼叫 ptui_checkValidate(A)
#!js
function ptui_checkValidate(B) {
var A = B.u; //此處獲取使用者名稱
var D = B.p; //此處獲取密碼
var E = B.verifycode; //此處獲取驗證碼
if (A.value == "" || str_uintip == A.value) {
pt.show_err(str_no_uin);
A.focus();
return false
}
A.value = A.value.trim();
if (!pt.chkUin(A.value)) {
pt.show_err(str_inv_uin);
A.focus();
A.select();
return false
}
if (D.value == "") {
pt.show_err(str_no_pwd);
D.focus();
return false
}
if (E.value == "") {
if (!isLoadVC) {
loadVC(true);
g_submitting = true;
return false
}
pt.show_err(str_no_vcode);
try {
E.focus()
} catch(C) {}
if (!g_loadcheck) {
ptui_reportAttr(78028)
} else {
ptui_reportAttr(78029)
}
return false
}
if (E.value.length < 4) {
pt.show_err(str_inv_vcode);
E.focus();
E.select();
return false
}
if (isLoadVC && !(/^[a-zA-Z0-9]+$/.test(E.value))) {
pt.show_err(str_correct_vcode);
E.focus();
E.select();
return false
}
D.setAttribute("maxlength", "32");
ajax_Submit();
ptui_reportNum(g_changeNum);
g_changeNum = 0;
return true
}
然後:
#!js
function ajax_Submit() {
if (pt.checkRet == -1 || pt.checkRet == 3) {
pt.show_err(pt.checkErr[window.g_lang]);
try {
$("p").focus()
} catch(B) {}
return
}
var A = getSubmitUrl("login");
pt.winName.set("login_param", encodeURIComponent(login_param));
pt.loadScript(A);
return
}
最後在這個函式中加密組裝提交地址:
#!js
function getSubmitUrl(K) {
var E = true;
var C = document.forms[0];
var A = (pt.isHttps ? "https://ssl.": "http://") + "ptlogin2." + g_domain + "/" + K + "?";
var B = document.getElementById("login2qq");
if (pt.regmaster == 2) {
A = "http://ptlogin2.function.qq.com/" + K + "?regmaster=2&"
} else {
if (pt.regmaster == 3) {
A = "http://ptlogin2.crm2.qq.com/" + K + "?regmaster=3&"
}
}
for (var J = 0; J < C.length; J++) {
if (K == "ptqrlogin" && (C[J].name == "u" || C[J].name
== "p" || C[J].name == "verifycode" || C[J].name == "h")) {
continue
}
if (C[J].name == "ipFlag" && !C[J].checked) {
A += C[J].name + "=-1&";
continue
}
if (C[J].name == "fp" || C[J].type == "submit") {
continue
}
if (C[J].name == "ptredirect") {
g_ptredirect = C[J].value
}
if (C[J].name == "low_login_enable" && (!C[J].checked)) {
E = false;
continue
}
if (C[J].name == "low_login_hour" && (!E)) {
continue
}
if (C[J].name == "webqq_type" && !B && (!C[J].checked)) {
continue
}
A += C[J].name;
A += "=";
if (C[J].name == "u" && pt.needAt) {
A += pt.needAt + "&";
continue
}
if (C[J].name == "p") {
var M = C.p.value;
var I = hexchar2bin(md5(M));
var H = md5(I + pt.uin);
var G = md5(H + C.verifycode.value.toUpperCase());
A += G
} else {
if (C[J].name == "u1" || C[J].name == "ep") {
var D = C[J].value;
var L = "";
if (g_appid == "1003903" && B) {
L = /\?/g.test(D) ? "&": "?";
var F = document.getElementById("webqq_type").value;
L += "login2qq=" + B.value + "&webqq_type=" + F
}
A += encodeURIComponent(D + L)
} else {
A += C[J].value
}
}
A += "&"
}
A += "fp=loginerroralert&action=" + pt.action.join("-") + "-" +
(new Date() - g_begTime) + "&mibao_css=" + pt.mibao_css + "&t=" +
pt.submitN[pt.uin] + "&g=1";
A += "&js_type=" + pt.js_type + "&js_ver=" + window.g_pt_version + "&login_sig=" + window.g_login_sig;
return A
}
核心的加密程式碼如下:
#!js
if (C[J].name == "p") {
var M = C.p.value;
var I = hexchar2bin(md5(M));
var H = md5(I + pt.uin); //pt.uin 估計是使用者qq號的16進製表示
var G = md5(H + C.verifycode.value.toUpperCase());
A += G
var M = "××××××";var ver="!";var I = hexchar2bin(md5(M));var H = md5(I + pt.uin);var G = md5(H + ver.toUpperCase());
hexchar2bin演算法如下:
#!js
function hexchar2bin(str) {
var arr = [];
for (var i = 0; i < str.length; i = i + 2) {
arr.push("\\x" + str.substr(i, 2))
}
arr = arr.join("");
eval("var temp = '" + arr + "'");
return temp
}
最終加密過程如下:
#!js
md5(md5(hexchar2bin(md5(pwd))+uin)+verifycode.toUpperCase())
#!js
md5(md5(hexchar2bin(md5("××××××××"))+'\x00\x00\x00\x00\x01\xd3\xff\xf3')+"!EHZ")
"918AAFDF8C9481F7AC2FC1C89A4DED7B"
此處改變了 pt.uin:
#!js
function ptui_checkVC(A, C, B) {
clearTimeout(checkClock);
pt.checkRet = A;
pt.uin = B;
if (A == "2") {
g_uin = "0";
pt.show_err(str_inv_uin)
}
if (!pt.submitN[B]) {
pt.submitN[B] = 1
}
var E = new Date();
g_time.time7 = E;
var D = {
"12": g_time.time7 - g_time.time6
};
if (!curXui) {
ptui_speedReport(D)
}
g_loadcheck = false;
switch (A + "") {
case "0":
case "2":
case "3":
$("verifycode").value = C || "abcd";
loadVC(false);
break;
case "1":
$("verifycode").value = pt.needCodeTip ? str_codetip: "";
loadVC(true);
break;
default:
break
}
}
其實找出這個演算法花的時間很少,只是一直找不到 ptui_checkVC 呼叫的地方,後來恍然大悟,在驗證qq是否需要圖片驗證碼的時候返回的就是給js呼叫的,地址是:
https://ssl.ptlogin2.qq.com/chec ... 5Q4YxDJ8Rza4-1ubGMR*aruR6Byct1dQ&u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&r=0.5011255156714469
返回內容如下:
#!js
ptui_checkVC('0','!BGC','\x00\x00\x00\x00\x01\xd3\xff\xf3');
第三個引數就是 16進製表示的qq號碼
至此全搞定,剩下的就是程式設計實現。https方式訪問。可以試試 libcurl 或者自己 用openssl+socket也可以
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!
相關文章
- 密碼加密的最好方式2017-11-06密碼加密
- 常見的使用者密碼加密方式以及破解方法2017-08-27密碼加密
- 密碼學系列——常見的加密方式(c#程式碼實操)2020-08-05密碼學加密C#
- Spring原始碼剖析4:其餘方式獲取Bean的過程分析2019-08-25Spring原始碼Bean
- 將 Laravel 使用者密碼加密方式修改為 md5+salt 方式2019-01-30Laravel密碼加密
- [原創逆向]Telock98加密過程分析(上)2004-06-24加密
- 輸入密碼連線過程log2020-10-28密碼
- 直播開發app,MySQL8修改root密碼加密方式2023-01-19APPMySql密碼加密
- 原始碼分析OKHttp的執行過程2018-10-27原始碼HTTP
- https加密過程2024-03-29HTTP加密
- 文字加密:常見的密碼加密解密方法2020-10-30加密密碼解密
- MySQL • 原始碼分析 • SHUTDOWN過程2017-12-13MySql原始碼
- 序列密碼的加密與解密2020-07-19密碼加密解密
- 產生隨機密碼的sql儲存過程2008-05-07隨機密碼SQL儲存過程
- nacos2.3 密碼驗證的處理過程2024-04-24密碼
- 簡單抓包分析:LDAP的simple方式認證過程2016-01-18LDA
- 凱撒密碼加解密過程與破解原理2024-07-10密碼解密
- 【圖片+程式碼】:GCC 連結過程中的【重定位】過程分析2022-03-17GC
- Glide的load()過程原始碼分析2018-09-28IDE原始碼
- 一個SQL Server Sa密碼破解的儲存過程2009-02-05SQLServer密碼儲存過程
- 如何基於Security框架相容多套使用者密碼加密方式2023-03-20框架密碼加密
- 配置Golden Gate 密碼加密2015-04-08Go密碼加密
- 密碼引擎-加密API研究2024-04-13密碼加密API
- 在程式前加一個密碼輸入框的過程!2003-08-01密碼
- Netty NioEventLoop 建立過程原始碼分析2019-03-02NettyOOP原始碼
- Spring啟動過程——原始碼分析2019-04-14Spring原始碼
- knockout原始碼分析之執行過程2016-07-17原始碼
- android view draw原始碼過程分析2014-03-19AndroidView原始碼
- 最新破解Wordpress後臺密碼的方法2015-11-14密碼
- .NET中的密碼學--對稱加密2009-02-02密碼學加密
- Hadoop過程中配置SSH免密碼登入2017-12-30Hadoop密碼
- 密碼大師4.0破解過程 (3千字)2001-05-06密碼
- MySQL密碼加密認證的簡單指令碼2018-04-04MySql密碼加密指令碼
- 密碼學課程設計 - 混合密碼的實現2020-12-05密碼學
- RSA加密原理&密碼學&HASH2019-10-16加密密碼學
- 密碼學之對稱加密2019-09-05密碼學加密
- 分析建模的五個子過程中為什麼有個編碼子過程?2015-10-04
- Mybatis原始碼分析(六)外掛的建立代理過程2019-03-10MyBatis原始碼