jsproxy
jsproxy copied to clipboard
关于 location的重写
关于重写 location,我做了如下的尝试:
var mylocation = {href: 'http://123'};
var myeval = (areWinTypeEval = false) => (str) => {
str = `
function foo() {
const window = this;
const location = mylocation;
const eval = myeval;
${str}
}
foo.call(mywindow)
`;
if (areWinTypeEval) {
window.eval(str)
} else {
eval(str)
}
};
var mywindow = {
location: mylocation,
eval: myeval(true),
__proto__: window,
}
function foo() {
const window = this;
const location = mylocation;
const eval = myeval();
/*此处的代码模拟网页上的原js脚本*/
console.log(window);
console.log(window.location);
console.log(location)
eval('console.log(location)');
window.eval('console.log(location)');
const reval = eval;
reval('console.log(location)');
reval('console.log(window.location)');
reval('eval("console.log(window.location)")')
/*此处的代码模拟网页上的原js脚本 END*/
}
foo.call(mywindow)
上述代码在控制台的输出为
Window {...}
{href: "http://123"}
{href: "http://123"}
{href: "http://123"}
{href: "http://123"}
{href: "http://123"}
{href: "http://123"}
看看是否能解决 重写 location 的问题?
这个方案之前试过,需要给所有脚本裹一层,用局部的 window 变量。
但是有些脚本是通过 var x = ... 定义全局变量的,结果这些变量都变成局部变量了,其他脚本访问不到了。貌似 google 首页就有这种全局变量,导致很多错误。
那这样的呢?试过没?
var mylocation = {href: 'http://123'};
var myeval = (areWinTypeEval = false) => (str) => {
str = `
function foo() {
const window = this;
const location = mylocation;
const eval = myeval;
${str}
}
foo.call(mywindow)
`;
if (areWinTypeEval) {
window.eval(str)
} else {
eval(str)
}
};
var mywindow = {
location: mylocation,
eval: myeval(true),
__proto__: window,
}
{
const window = mywindow;
const location = mylocation;
const eval = myeval();
/*此处的代码模拟网页上的原js脚本*/
var abc = 1234;
console.log(window);
console.log(window.location);
console.log(location)
eval('console.log(location)');
window.eval('console.log(location)');
const reval = eval;
reval('console.log(location)');
reval('console.log(window.location)');
reval('eval("console.log(window.location)")')
/*此处的代码模拟网页上的原js脚本 END*/
}
console.log(abc);
这个还没试过~ ES6 Block Scope 我研究下看看
有些 js 修改 location 时会省略 window,直接 location = '//google.com',这种似乎没法 hook。没有这种用法就好了。。。我想想能不能用 with 实现