说明 : 主要的思路就是重写JS函数, 如果学习过高级语言的朋友 就很容易理解
好上代码:
1. 劫持
<html>
<head>
<title>js函数劫持</title>
<script type="text/javascript">
var _alert = window.alert;
window.alert = function (msg)
{
if(confirm('alert方法被调用'))
_alert(msg);
}
var _eval = eval;
eval= function (s)
{
//log ip send to srv
if(confirm('eval方法被调用'))
_eval(s);
}
alert('hah');
eval('alert(\"ev\");');
</script>
</head>
<body>
</body>
</html>
2.反劫持
<html>
<head>
<title>js函数反劫持</title>
<script type="text/javascript">
var msg="";
msg= eval+"\n\r";
var _eval = eval;
eval= function (s)
{
//log ip send to srv
if(confirm('eval方法被调用'))
_eval(s);
}
msg += eval;
document.write(msg);
/*
检查函数是否有劫持
*/
function checkJSHook(proc)
{
if(proc.toString().indexOf("[navtiv codde]")>0)
return false;
else
return true;
}
alert(checkJSHook(eval));
</script>
</head>
<body>
</body>
</html>
为什么使用checkJSHook函数体来判断
因为内置函数和自定义函数返回数据部一样
如下:
function eval() { [native code] } //内置函数都返回 [native code]
function (s) { //log ip send to srv if(confirm('eval方法被调用')) _eval(s); }