簡(jiǎn)單總結(jié)下目前我掌握的幾種對(duì)抗debugger反調(diào)試的方法掰吕,也歡迎大佬們有新的好用的方式補(bǔ)充果覆。
function test(x,y){
z=x+y;
return z;
}
setInterval(function()
{test+""=="function test(x,y){z=x+y;return z;}" ? console.log("未修改")
:setInterval(
function(){
debugger;
},1000);}
,1000);
test(100,200);
然后我們添加這一句燎猛,也就是對(duì)源代碼進(jìn)行破壞,讓他驗(yàn)證不通過照皆。方法一:通過停用斷點(diǎn)
應(yīng)該是各位見過最多的方法了愤钾,就是開發(fā)者工具的這個(gè)按鈕:方法二:條件斷點(diǎn)
想必各位對(duì)如下打斷點(diǎn)的方式并不陌生:點(diǎn)擊代碼行數(shù)就會(huì)添加斷點(diǎn)兴枯。這是普通斷點(diǎn)的快捷添加方法。在瀏覽器中還有一種條件斷點(diǎn)矩欠。
再按下F9峰伙,你會(huì)發(fā)現(xiàn)debugger已經(jīng)消失了。
方法三:離老子遠(yuǎn)點(diǎn)8媚(Never Pause Here)
字面意思瞳氓,不從這行代碼經(jīng)過。依舊是右鍵點(diǎn)擊行號(hào)栓袖,選擇Never pause here匣摘。
以上是常規(guī)操作,接下來介紹比較騷操作的方法裹刮。
首先是用fiddler&charles&multiproxy之類的工具音榜。接下來我會(huì)用fiddler演示,其他的工具類似捧弃。
方法四:替換文件
我們既然已經(jīng)知道代碼里有反調(diào)試赠叼,那么用以上工具替換response內(nèi)容不就行了嗎?這里演示有點(diǎn)蛋疼违霞,服務(wù)器到期了嘴办,我又不想去專門找個(gè)有反調(diào)試的網(wǎng)站。买鸽。于是自己注入一個(gè)吧涧郊。
使用到Fiddler的Fiddler Script功能,F(xiàn)iddler Script使用的語言是JScript.NET眼五。語法和JS類似妆艘,我是當(dāng)做JS來寫的彤灶,細(xì)微差別注意一下就好了,反正用到這個(gè)功能一般也不會(huì)寫太多代碼批旺。幌陕。
首先,百度主頁是沒有任何debugger的汽煮,我們接下來要做的是在百度中注入一段反調(diào)試代碼搏熄,讓他進(jìn)入到debugger中。打開Fiddler逗物,在右邊可以找到Fiddler Script選項(xiàng)卡。OnBeforeResponse是在攔截響應(yīng)前執(zhí)行逗扒,比如我們?cè)诰W(wǎng)頁中打開了百度,百度的代碼已經(jīng)返回來了欠橘,但被Fiddler攔截在了這里矩肩,還沒有到達(dá)瀏覽器!我們可以在這個(gè)階段劫持響應(yīng)內(nèi)容肃续。
其他的可以去查找相關(guān)資料或者閱讀官方文檔黍檩,F(xiàn)iddler Script是Fiddler強(qiáng)大之處之一。
我們可以在這里寫代碼擴(kuò)展一些自己想要的東西始锚。這個(gè)的應(yīng)用其實(shí)很廣刽酱,比如有時(shí)候不得不用selenium抓數(shù)據(jù),但是又不想通過selenium讀數(shù)據(jù)瞧捌,因?yàn)橐染W(wǎng)頁渲染棵里,實(shí)在太慢了。這時(shí)候就可以使用Fiddler Script姐呐,在里面寫一段腳本殿怜,讓響應(yīng)回來的時(shí)候直接解析,然后把數(shù)據(jù)保存在數(shù)據(jù)庫里曙砂。
咳咳稳捆,扯遠(yuǎn)了。先來注入:選擇OnBeforeResponse麦轰,會(huì)自動(dòng)跳到這個(gè)函數(shù)的位置:接下來我們要干掉他。AutoResponser:
先右鍵點(diǎn)擊查看網(wǎng)頁源代碼甲脏,把源代碼拷貝下來一份眶熬,放到我們寫好的html中。
PS:萬萬沒想到網(wǎng)頁里還是出現(xiàn)了debugger海渊,是因?yàn)镕iddler Script注入的地方?jīng)]有關(guān)绵疲。。也驗(yàn)證了臣疑,F(xiàn)iddler Script的優(yōu)先級(jí) > AutoResponser盔憨。AutoResponser執(zhí)行后才會(huì)走Fiddler Script
方法五:腳本注入
方法四是比較方便的,但是有時(shí)候你會(huì)發(fā)現(xiàn)要修改的JS代碼是動(dòng)態(tài)的讯沈,每次加載都不一樣郁岩,這時(shí)候如果盲目替換文件,很可能導(dǎo)致網(wǎng)頁的邏輯無法使用缺狠。我們僅僅需要把debugger的地方干掉就可以了驯用。
也就是,通過注入儒老,修改指定代碼蝴乔。細(xì)心的你可能已經(jīng)發(fā)現(xiàn)了,這不就是上面我們注入debugger做的事嗎驮樊?是的薇正。。囚衔。所以挖腰,沒有看上面方法四的建議回去看一下。练湿。猴仑。方法類似,指定Host,用正則替換掉debugger代碼辽俗。
這里不再講了疾渣。
方法六:JS Hook劫持方法
首先要裝一個(gè)油猴插件,這個(gè)程序員應(yīng)該都裝了吧崖飘。榴捡。。實(shí)現(xiàn)各種騷操作朱浴。
js的hook和Frida中的很像吊圾,或者說比Frida的hook更簡(jiǎn)單。我們現(xiàn)在知道了debugger是在setInterval中執(zhí)行的翰蠢,那我們嘗試劫持setInterval项乒。點(diǎn)擊這里,新建一個(gè)油猴腳本:
然后就是主要代碼了:
var new_setInterval=setInterval;
window.setInterval=function(a,b){
if(a.toString().indexOf("debugger")!=-1)
{
return null;
}
new_setInterval(a,b);
}
首先用new_setInterval接收了原生的setInterval。然后hook原生setInterval啃憎,如果在參數(shù)a芝囤,也就是定時(shí)器結(jié)束時(shí)調(diào)用的函數(shù)中出現(xiàn)debugger的話,就讓函數(shù)返回null辛萍,什么都不做悯姊,再繼續(xù)運(yùn)行定時(shí)器。
總結(jié)
以前遇到debugger贩毕,沒有處理的經(jīng)驗(yàn)悯许,真的是一臉懵逼,慢慢也積累下來一些對(duì)抗的方法辉阶,希望能拋磚引玉先壕,各位如果有其他方法也可以交流一下。
其實(shí)通過這些谆甜,學(xué)到的不僅僅是針對(duì)反調(diào)試垃僚,這些方法在其他的地方也有相當(dāng)多的應(yīng)用場(chǎng)景。比如Hook规辱,這么好用的方法難道僅僅用來對(duì)付反調(diào)試谆棺?不不不,他還可以hook任意JS加密方法罕袋,hook Cookie的生成改淑,hook一個(gè)搜索不到的入口等等等碍岔。。留給大家自己研究了溅固。
如果后續(xù)我找到新的對(duì)付無限debugger的方法付秕,也會(huì)更新在這里。