QQ 공간 로그 인 파라미터 분석 Firefox+Firebug

링크 1:http://i.qq.com/
저 희 는 보통 이 를 통 해 QQ 공간 을 방문 한 후에 브 라 우 저 는 돌아 오 는 페이지 를 받 은 후에 자동 으로 페이지 의 링크 에 따라 다른 자원 을 방문 합 니 다.실제 프로 그래 밍 을 할 때 이 단 계 를 쓰 지 않 아 도 됩 니 다.브 라 우 저 를 모 의 하려 고 하지 않 는 한.
링크 2:http://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=http%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&pt_qzone_sig=1&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=http%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_qr_app=%E6%89%8B%E6%9C%BAQQ%E7%A9%BA%E9%97%B4&pt_qr_link=http%3A//z.qzone.com/download.html&self_regurl=http%3A//qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_링크=http%3A//z.qzone.com/download.htmlhttp://i.qq.com/페이지 에 포 함 된 것 을 되 돌려 줍 니 다.이 링크 는 cookies 정 보 를 얻 을 수 있 습 니 다.예 를 들 어 ptlogin_sig pt_clientip pt_serverip pt_local_token uikey 등 중요 해 보 이 는 것 은 pt 입 니 다.login_sig,뒤에 링크 가 있 습 니 다.하지만 이 값 이 중복 되 더 라 도 서버 에 정상적으로 접근 할 수 있 습 니 다.
관계:링크 3 의 loginsig=2cookie 를 연결 하 는 ptlogin_sig
링크 3:http://check.ptlogin2.qq.com/check?regmaster=&pt_tea=1&pt_vcode=1&uin=[QQ 번호]&appid=549000912&jsver=10132&js_type=1&login_sig=Jb8qYYR6XWBexI*sJL*jj20hiQ72ZFMg06OIKOHDVoaoJxi0Cl90-LYtEtEgHMHb&u1=http%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Flognocc.html%3Fpara%3Dizone&r=0.81206208100567006 로그 인 창 에 사용자 이름 을 입력 한 후 ajax 가 자동 으로 검사 하 는 링크 입 니 다.서버 는 다음 문자열 을 되 돌려 줍 니 다.
ptui_checkVC('0','!HIE','\x00\x00\x00\x00\x3a\x6d\x15\xdc','6720543da1e5adc5b0aab8b3932b2ec4ef8c38a32bbd9ad59d35f1074a7256be8f7fce48e0ca1642d5d2a3502d8a1c1049e285c81e1af7b3','0');
checkVC 의 첫 번 째 매개 변 수 는 0 일 때 인증 코드 를 입력 하지 않 아 도 된다 는 것 을 나타 낸다.
시 대 표 는 인증 코드 를 입력 해 야 합 니 다.
checkVC 의 첫 번 째 매개 변 수 는 0 시의 관계 입 니 다.링크 4 의 verifycode=checkVC 의 두 번 째 매개 변수,링크 4 의 ptverifysession_v1=3cookie 를 연결 하 는 ptvfsession,4 를 연결 하 는 p=암호 화 된 비밀번호
링크 4:http://ptlogin2.qq.com/login?u=[QQ 번호]&verifycode=!CED&pt_vcode_v1=0&pt_verifysession_v1=8fe5343710afe3cbf7b62f4ee56e747251f23edddf0c681087c169738022caded5e33d5621468c7c81ce236cb0e76aaf4a7b8d8499bbb44d&p=jG1LpyBWFAsL9w-199hdIHuvpllpsBufclV9ZECJXkZcmrHlBKlh12WXQvzxSGxQMGkBndMzikwrEgqPJtUEurShStmzGYNKLKTNHP92snWXipoDUUg-G3VSeiw-nryQvE6Mr0khGUqbD2W2FcyMWPihe8MBmFoQpOSsSJWe7Br30kwS8co*WjgDh0aM1xAKGMfpG*QRxEXJ2Cj6L-Tb5Q__&pt_randsalt=0&u1=http%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=5-15-1441425206927&js_ver=10132&js_type=1&login_sig=Ro4T6*1opNh*GcOfSYi5iKaDT0uB5F-S7KM3rEn-DzkZI1uewRtX*xjfqFRnKbkU&pt_uistyle=32&aid=549000912&daid=5&pt_qzone_sig=1
중요 한 것 은 이 암호 화 된 비밀 번 호 를 분석 하 는 것 이다.다음은 주로 이것 을 분석 하 는 데 쓰 인 다.
로그 인 버튼 으로 전환,오른쪽 단추-->Firebug 로 요소 보기
그리고 HTML 에 있 는 위 치 를 볼 수 있 습 니 다.그리고 오른쪽 이 벤트 를 클릭 하면 js 스 크 립 트 에 대응 하 는 click 함 수 를 볼 수 있 습 니 다.
QQ空间登录参数分析Firefox+Firebug_第1张图片
먼저 오른쪽 단 추 를 눌 러 서 함 수 를 복사 한 다음,오른쪽 단 추 를 눌 러 서 스 크 립 트 에서 봅 니 다
복 사 된 함 수 는 다음 과 같 습 니 다:
4.567913.그리고 우 리 는 위 코드 의 일부 문 자 를 선택 하여 검색 합 니 다.
검색 결과
다음은 pt.plogin.submit(e)에 대응 하 는 내용 을 찾 아 보 겠 습 니 다.
다음 내용 을 찾 으 면 var b=pt.plogin.getSubmitUrl('login')에 주의 하 십시오.이것 은 getSubmitUrl 함 수 를 호출 하여 뒤의 암호 화 작업 을 수행 합 니 다.
QQ空间登录参数分析Firefox+Firebug_第2张图片
(function (e){e&&e.preventDefault();if(pt.plogin.needShowNewVc==true){pt.plogin.showVC()}else{pt.plogin.submit(e)}})

 다음은 getSubmitUrl 이라는 함 수 를 찾 겠 습 니 다.
QQ空间登录参数分析Firefox+Firebug_第3张图片
    $.e.add(domBtn, 'click', function (e) {
        e && e.preventDefault();
        if (pt.plogin.needShowNewVc == true) {
            pt.plogin.showVC()
        } else {
            pt.plogin.submit(e)
        }
    });

그 중에서 코드 에서 비교적 중요 한 것 은 f.p=$.Encryption.getEncryption(d,pt.plogin.salt,f.verifycode,pt.plogin.armSafeEdit.isSafe)이다.
마지막 매개 변수 pt.plogin.armSafeEdit.isSafe 는 중요 하지 않 습 니 다.이 매개 변 수 는 보안 컨트롤 이 설치 되 어 있 는 지 없 는 지 판단 하 는 데 사 용 됩 니 다.설치 되 어 있 지 않 으 면 비밀 번 호 는 원래 의 값 으로 전 달 됩 니 다.설치 되 어 있 으 면 비밀 번 호 는 md5 값 으로 전 달 됩 니 다.
다음은 getEncryption 이라는 함 수 를 찾 습 니 다.
submit: function (a) {
    if (pt.plogin.cntCheckTimeout >= 2) {
        pt.plogin.show_err(pt.plogin.checkErr[pt.ptui.lang]);
        pt.plogin.needVc = false;
        pt.plogin.needShowNewVc = false;
        return
    }
    pt.plogin.submitTime = new Date().getTime();
    a && a.preventDefault();
    if (pt.plogin.lastCheckAccount != pt.plogin.account && !pt.plogin.hasCheck) {
        pt.plogin.check(arguments.callee);
        return
    }
    if (!pt.plogin.ptui_onLogin(document.loginform)) {
        return false
    } else {
        $.cookie.set('ptui_loginuin', escape(document.loginform.u.value), pt.ptui.domain, '/', 24 * 30)
    }
    if (pt.plogin.checkRet == - 1 || pt.plogin.checkRet == 3) {
        pt.plogin.show_err(pt.plogin.checkErr[pt.ptui.lang]);
        pt.plogin.lastCheckAccount = '';
        pt.plogin.domFocus($('p'));
        pt.plogin.check();
        return
    }
    clearTimeout(pt.plogin.loginClock);
    pt.plogin.loginClock = setTimeout('pt.plogin.loginTimeout();', 5000);
    var b = pt.plogin.getSubmitUrl('login');
    $.winName.set('login_href', encodeURIComponent(pt.ptui.href));
    pt.plogin.showLoading();
    if (pt.plogin.isVCSessionTimeOut() && !pt.plogin.needVc) {
        pt.plogin.lastCheckAccount = '';
        pt.plogin.check();
        window.setTimeout(function () {
            pt.plogin.submit()
        }, 1000)
    } else {
        $.http.loadScript(b);
        pt.plogin.isdTime['7808-7-2-0'] = new Date().getTime()
    }
    return false
},

getEncryption(password,salt,vcode,isMd 5)의 네 가지 인 자 를 되 돌아 봅 니 다.
getEncryption(d, pt.plogin.salt, f.verifycode, pt.plogin.armSafeEdit.isSafe)
password=d 는 원본 암호 값 입 니 다.(보안 컨트롤 이 설치 되 어 있 으 면 암호 의 md5 값 입 니 다.)
salt=pt.plogin.salt 사용자 이름 에 따 른 무 작위 소금 사용자 이름 실행 uin2hex 함수
vcode=f.verifycode 는 cookies 에서 직접 가 져 오 면 됩 니 다.인증 코드
isMd 5=pt.plogin.armSafeEdit.isSafe true 는 보안 컨트롤 을 불 러 오 는 데 성 공 했 음 을 나 타 냅 니 다 false 는 실 패 했 음 을 나 타 냅 니 다.
사실 보안 컨트롤 의 역할 은 암 호 를 md5 암호 화 하 는 것 입 니 다.getEncryption 코드 에서 pt.plogin.armSafeEdit.isSafe 를 통 해 암호 화 여 부 를 판단 하 는 것 입 니 다.
뒤의 기본 적 인 예측 은 모두 가 스스로 분석 할 수 있 을 것 이다.새로운 암호 화 방법 은 RSA 암호 화 를 추 가 했 는데 주로 다음 과 같은 코드 이다.
대응 하 는 함수
getSubmitUrl: function (b) {
    var a = pt.plogin.loginUrl + b + '?';
    var f = {
    };
    if (b == 'pt_susp_repush') {
        return a += 'appid=' + pt.ptui.appid + '&daid=' + pt.ptui.daid
    }
    if (b == 'login') {
        f.u = encodeURIComponent(pt.plogin.at_account);
        f.verifycode = $('verifycode').value;
        if (pt.plogin.needShowNewVc) {
            f.pt_vcode_v1 = 1
        } else {
            f.pt_vcode_v1 = 0
        }
        f.pt_verifysession_v1 = pt.plogin.pt_verifysession || $.cookie.get('verifysession');
        var d = $('p').value;
        if (pt.plogin.armSafeEdit.isSafe) {
            d = pt.plogin.armSafeEdit.safepwd
        }
        f.p = $.Encryption.getEncryption(d, pt.plogin.salt, f.verifycode, pt.plogin.armSafeEdit.isSafe);
        f.pt_randsalt = pt.plogin.isRandSalt || 0
    }
    if (b == 'login') {
        f.u1 = encodeURIComponent(pt.qlogin.getSurl($('u').value))
    } else {
        f.u1 = encodeURIComponent(pt.qlogin.getSurl())
    }
    f.ptredirect = pt.ptui.target;
    f.h = 1;
    f.t = 1;
    f.g = 1;
    f.from_ui = 1;
    f.ptlang = pt.ptui.lang;
    f.action = pt.plogin.action.join('-') + '-' + (new Date() - 0);
    f.js_ver = pt.ptui.ptui_version;
    f.js_type = pt.plogin.js_type;
    f.login_sig = pt.ptui.login_sig;
    f.pt_uistyle = pt.ptui.style;
    if (pt.ptui.low_login == 1 && pt.plogin.low_login_enable && !pt.plogin.isMailLogin) {
        f.low_login_enable = 1;
        f.low_login_hour = pt.plogin.low_login_hour
    }
    if (pt.ptui.csimc != '0') {
        f.csimc = pt.ptui.csimc;
        f.csnum = pt.ptui.csnum;
        f.authid = pt.ptui.authid
    }
    f.aid = pt.ptui.appid;
    if (pt.ptui.daid) {
        f.daid = pt.ptui.daid
    }
    if (pt.ptui.pt_3rd_aid != '0') {
        f.pt_3rd_aid = pt.ptui.pt_3rd_aid
    }
    if (pt.ptui.regmaster) {
        f.regmaster = pt.ptui.regmaster
    }
    if (pt.ptui.mibao_css) {
        f.mibao_css = pt.ptui.mibao_css
    }
    if (pt.ptui.pt_qzone_sig == '1') {
        f.pt_qzone_sig = 1
    }
    if (pt.ptui.pt_light == '1') {
        f.pt_light = 1
    }
    for (var c in f) {
        a += (c + '=' + f[c] + '&')
    }
    return a
},

예전 에 js 코드 에 있 던 QQ 의 TEA 함수.
    function getEncryption(password, salt, vcode, isMd5) {
        vcode = vcode || '';
        password = password || '';
        var md5Pwd = isMd5 ? password : md5(password),
        h1 = hexchar2bin(md5Pwd),
        s2 = md5(h1 + salt),
        rsaH1 = $pt.RSA.rsa_encrypt(h1),
        rsaH1Len = (rsaH1.length / 2).toString(16),
        hexVcode = TEA.strToBytes(vcode.toUpperCase(), true),
        vcodeLen = Number(hexVcode.length / 2).toString(16);
        while (vcodeLen.length < 4) {
            vcodeLen = '0' + vcodeLen
        }
        while (rsaH1Len.length < 4) {
            rsaH1Len = '0' + rsaH1Len
        }
        TEA.initkey(s2);
        var saltPwd = TEA.enAsBase64(rsaH1Len + rsaH1 + TEA.strToBytes(salt) + vcodeLen + hexVcode);
        TEA.initkey('');
        setTimeout(function () {
            __monitor(488358, 1)
        }, 0);
        return saltPwd.replace(/[\/\+=]/g, function (a) {
            return {
                '/': '-',
                '+': '*',
                '=': '_'
            }
            [
                a
            ]
        })
    }

일단 여기까지 분석 할 게 요.
아마 이 링크 는 여러분 들 이 이해 할 수 있 을 것 입 니 다.http://www.jianshu.com/p/4217d8f3574b
원시 JS:여기 누 르 기

좋은 웹페이지 즐겨찾기