• Window 用户使用 Ctrl + Shift + I 打开
• Mac 用户使用 Cmd +Opt + I 打开
• F12/右键“检查”即可呼出开发者面板
二.面板功能:
Elements(元素面板):使用“元素”面板可以通过自由操纵DOM和CSS来重演您网站的布局和设计。
Console(控制台面板》:在开发期间,可以使用控制台面板记录诊断信息,或者使用它作为shell,在页面上与JavaScript交互。
Sources(源代码面板):在源代码面板中设置断点来调试 JavaScript,或者通过Workspaces (工作区)连接本地文件来使用开发者工具的实时编辑。
Network(网络面板):从发起网页页面请求Request后得 到的各个请求资源信息(包括状态资源类型、大小、所用时间等),并可以根据这个进行网络性能优化。
Performance(性能面板:使用时间轴面板,可以通过记 录和查看网站生命周期内发生的各种事件来提高页面运行时的性能。
Memory (内存面板):分析web应用或者页面的执行时间以及内存使用情况。
Application(应用面板):记录网站加载的所有资源信息,包括存储数据 (Lcal StorageSession Storage、 -IndexedDB、Web SQL、Cookies)、缓存数据、字体、图片、脚本、样式表等。
Security(安全面板):使用安全面板调试混合内容问题,证书问题等等Audits(审核面板):对当前网页进行 网络利用情况、网页性能方面的诊断,并给出一些优化建议。比如列出所有没有用到的CSS文件等。
三.NetWork面板
Controls(控制器):使用这些选项可以控制Network 面板的外观和功能。
Filters(过滤器):使用这些选项可以控制在 RequestsTable 中显示哪些资源提示:按住 Cmd(Mac)或Ctrl(Windows/Linux)并点击过滤器可以同时选择多个过滤聚。
0verview(概览): 此图表显示了资源检索时间的时间线。如果您看到多条坚线堆叠在一起,则说明这些资源被同时检索。
Requests Table (请求列表):此表格列出了检索的每一 个资源。表格按时间顺序排序,最早的资源在顶部。点击资源的名称可以显示更多信息。 提示:右键点击Timeline 以外的任何一个表格标题可以添加或移除信息列。
Summary(概要): 此窗格可以一目了然地告诉您请求总数、传输的数据量和加载时间。
1.Filters(过滤器)
domain: 仅显示来自指定域的资源。您可以使用通配符 ()来包括多个域。例如, .com显示以.com结尾的所有域名中的资源。DevTools会在自动完成下拉菜单中自动填充它遇到的所有域。
has-response-header: 显示包含指定HTTP响应头信息 的资源。DevTools会在自动完成下拉菜单中自动填充它遇到的所有响应头。
is:通过过is:running找出WebSocket请求。larger-than(大于):显示大于指定大小的资源(以字节为单位)。设置值1000等效于设置值1k。method(方法):显示 通过指定的HTTP方法类型检索的资源。DevTools使用它遇到的所有HTTP方法填充下拉列表。
mime-type (mime类型:显示指定MIME类型的资源。DevTools使用它遇到的所有MIME类型填充下拉列表。
mixed-content(混合内容:显示所有混合内容资源(mixed-content:al)或仅显示当前显示的内容(mixed-content:displayed)。
Scheme(协议):显示通过不受保护的HTTP(scheme:http)或受保护的HTTPS(scheme:https)检索的资源。
set-cookie-domain (cookie域):显示具有Set-Cookie头,并且其Domain属性与指定值匹配的资源。DevTools 会在自动完成下拉菜单中自动填充它遇到的所有Cookie域。
set-cookie-name (cookie名): 显示具有Set-Cookie 头,并且名称与指定值匹配的资源。DevTools会在自动完成下拉菜单中自动填充它遇到的所有Cookie名。
set-cookie-value (cookie值):显示具有Set-Cookie 头,并且值与指定值匹配的资源。DevTools会在自动完成下拉菜单中自动填充它遇到的所有cookie值。
status-code(状态码):仅显示其HTTP状态代码与指定代 码匹配的资源。DevTools会在自动完成下拉菜单中自动填充它遇到的所有状态码。
2.Requests Table (请求列表)
此列表列出了检索的每个资源。默认情况下,此表按时间顺 序排序,也就是最早的资源在顶部。单击资源名称可以获得更多信息。
四.Sources面板
1.Overrides
在Source 面板中找到 Overrides 子面板。
点击Select folderfor Overrides 选择一个目录,作为文件的存储目录,同时确保打开了 Enable Local Overrides。
在Network 面板,选中一个请求右键,点击Save for overrides。
DevTools 会在本地创建一个与请求内容相同的文件,并在 Source 面板中打开编辑完刷新页面以查看效果。
2.调试面板
- Debug调试
- 条件断点
- 行断点
- XHR断点
- 事件侦听器断点
- Watch-变量监听
- Call stack-断点的调用栈列表
- Scope-断点所在作用域的内容
- Breakpoints-断点列表
- XHR/fetch Breakpoints-请求断点列表
- DOM Breakpoints- Dom断点列表
- Event Listener Breakpoints-可断点的事件监听列表
五.Console面板
- 配合断点调试
debugger关键字的应用:
- Function/eval “debugger”
- function debugger
二.解决方案
- 禁用所有断点
- 禁用某处断点
- 条件断点
- 中间人工具替换特征字符串
- reres替换本地修改过的文件
- 重写关键函数
1.禁用所有断点
- 或者使用插件Toggle JavaScript。
- 这种方式有个缺点,在禁用之后,自己想打断点调试也是不可行的。
2.禁用某处断点
3.条件断点
- 这里的if判断,如果_$$7 小于等于85,就会进入debugger。
- 那么就可以在这里下个断点。
- 将这里的结果设置为false,就不会进入 debugger循环了。
4.中间人替换/本地替换
实际上就是将debugger这个字符串替换成空,可以用例如 Chrome Devtools的overrides、fiddler autoresponse、mitmproxy、Charles的map local等等实现。
5.重新函数
- 直接将这个函数置空那么调用这个函数的时候就什么都不执行了。
- 也就不会触发debugger。
1.快速定位之搜索
- 中间人的全局搜索
- 开发者工具的全局搜索
2.快速定位之断点
- XHR
- DOM
- EVENT
- 自定义
打个比方,在抓包处看到,密码是加密的:
想逆出密码是如何加密的。
可以打XHR断点,当URL包含doLogin.do 的时候就会自动断下。
也可以打EVENT断点,当点击登录或者回车键登录的时候就会触发:
这样也可以实现想要的效果:
3.快速定位之hook
“hook”是一种编程技术,用于在特定的代码执行点插入自定 义的逻辑。它允许开发人员在不修改原始代码的情况下改变程序的行为。通过使用钩子,开发人员可以在函数执行前后、变量赋值时或特定事件发生时注入自己的代码。这种技术可以用于实现各种功能,如日志记录、性能监测、状态管理等。通过使用钩子,开发人员可以更灵活地扩展和定制他们的代码,使其更易于维护和扩展。
1.json
2.cookie
3.window attr
4.eval/Function
5.websocket
6.…
// hook JSON.parse
(function() {
var parse = JSON.parse;
JSON.parse = function(params) {
console.log("Hook JSON.parse: ", params);
debugger;
return parse(params);
}
})();
// hook指定cookie
Object.defineProperty(document, 'cookie', {
set: function(val) {
if (val.indexOf('xxxxxx') != -1){
debugger ;
}
}
})
// hook window属性
Object.defineProperty(window, '_$xx', {
set: function(val) {
debugger ;
}
})
// hook eval
var _eval = eval
eval = function(arg) {
debugger;
return _eval(arg)
}
eval.toString = function() {
return "function eval() { [native code] }"
}
eval.length = 1;
var _old = Function.prototype.toString.call
Function.prototype.toString.call = function(arg) {
if (arg == eval)
return "function eval() { [native code] }"
return _old(arg);
}
1.// hook debugger
Function.prototype.constructor = function(param){
if(param!="debugger"){
return A(param)
}
return function(){}
}
原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/90913.html