JS逆向:常見的無限debugger反調(diào)試策略以及應(yīng)對方法

1. 種類劃分

1.1. 按代碼邏輯劃分

1.1. 無限循環(huán)

  • for 循環(huán)
  • while 循環(huán)

注意:使用 while 循環(huán)一定會有次數(shù)上限顿痪,否則瀏覽器會卡死掉访敌。

1.2. 無限遞歸

  • 調(diào)用自身

1.3. 兩個方法循環(huán)互調(diào)

  • 顧名思義

1.4. 計時器

setInterval 這個是 JS 語言當(dāng)中的 定時器吵血,它有兩個參數(shù):第一個是要執(zhí)行的代碼,第二個執(zhí)行時間先朦。
下方是 sojson 混淆后的一段代碼次洼,其中使用了 setInterval 定時器進(jìn)行了反 debugger 操作。

這個一段代碼執(zhí)行的話會一直斷住辛萍,不管你怎么跳轉(zhuǎn)到下一個斷點凡人,它都還是會一直斷,其實這個就是一個無限debugger的代碼叹阔。

1.2. 按是否可混淆劃分

1.2.1. 不可混淆

直接使用代碼挠轴,

debugger;

1.2.2. 可混淆

eval("debugger;")

1.2.3. 可重度混淆

Function("debugger").call()/apply() 或賦值 bind()
xxx.constructor("debugger").call("action")
Fuction.constructor("debugger").call("action")
(function(){return !![];}["constructor"]("debugger")["call"]("action"))

1.3. 按設(shè)置節(jié)點劃分

  • 無限 debugger 貫穿全局
    這種情況,多是由 setInterval 定時器實現(xiàn)的耳幢。針對這種情況岸晦,我們需要將定時器函數(shù)置空或者重寫欧啤。
  • 在加密業(yè)務(wù)邏輯之前設(shè)置
  • 在加密業(yè)務(wù)邏輯之后設(shè)置

2. 應(yīng)對方法

2.1. 針對靜態(tài)文件

2.1.1. conditional breakpoint

在 JS 代碼 debugger 行數(shù)位置,鼠標(biāo)右鍵添加 conditional breakpoint启上,其中條件 condition 設(shè)為 false邢隧;

2.1.2. Fiddler AutoResponder 篡改 JS 代碼

這種方式的核心思路,是替換 JS 文件中的 debugger 關(guān)鍵字冈在,并保存為本地文件倒慧,在請求返回的時候、通過正則匹配等方式包券、攔截并替換返回的 JS 代碼纫谅,已達(dá)到繞過 debugger 的目的。
關(guān)于這種方法溅固,請參考我的另一篇文章:《JS逆向:fiddler 篡改 js 破解企查查無限 debugger 問題》付秕,文中有詳細(xì)的描述。

2.2. 針對動態(tài)文件

2.2.1. 手動在瀏覽器中 Hook
第一步侍郭、打 script 斷點

這一步的目的询吴,是為了讓瀏覽器在剛運行時就被斷下來,以方便進(jìn)行 Hook

第二步亮元、Hook 無限 debugger 函數(shù)
  • 手動置空 debugger 函數(shù)猛计。
    script 斷點,使網(wǎng)頁在 debugger 之前下斷爆捞,手動將debugger所在函數(shù)置空有滑。這種方法簡單粗暴,但是會影響原有的業(yè)務(wù)邏輯嵌削。
包含debugger函數(shù) = function (){};
  • 手動重寫 debugger 函數(shù)毛好。
    script 斷點,然后在 debugger 函數(shù)被調(diào)用的地方下斷苛秕,手動將debugger所在函數(shù)中的 debugger 邏輯刪除肌访,然后 把 debugger 函數(shù)賦值給 調(diào)用函數(shù)

注意:這一步賦值不能省艇劫,否則無法調(diào)用吼驶。

  • Hook Funciton
F_ = Function
Function = function(a){
    if (a!=='debugger'){return F_(a)}
}
  • Hook Function 構(gòu)造器函數(shù)
Function.prototype.constructor_ = Function.prototype.constructor;
Function.prototype.constructor = function(x){
    if (x!=='debugger'){return Function.prototype.constructor_(x)}
}

如果覺得上面的代碼太粗暴,也可使用下方代碼店煞。

Function.prototype.__constructor_back = Function.prototype.constructor;
Function.prototype.constructor = function() {
    if(arguments && typeof arguments[0]==='string'){
        //alert("new function: "+ arguments[0]);
        if("debugger" === arguments[0]){
            //arguments[0]="console.log(\"anti debugger\");";
            //arguments[0]=";";
            return
        }
    }
   return Function.prototype.__constructor_back.apply(this,arguments);
}
  • Hook eval 函數(shù)
eval_ = eval;
//下面這樣寫蟹演,是為了過瑞數(shù)的 eval.toString 檢測
eval = function(a){if(a=='debugger'){return ''}else{return eval_(a)}}    
  • Hook conole.log,為了防止調(diào)試過程中顷蟀,console.log 被重寫酒请,也可以在此時對 console.log 進(jìn)行 hook,之后在 console.log 無法正常打印的位置鸣个,再將 console.log 進(jìn)行復(fù)原羞反;

Hook console.log:

console.log_ = console.log

將 console.log 復(fù)原:

console.log = console.log_
  • Hook setInterval 函數(shù)
    -- 業(yè)務(wù)代碼和 setInterval 無關(guān)
setInterval = function(){}

-- 業(yè)務(wù)代碼和 setInterval 有關(guān)

setInterval_back = setInterval
setInterval = function(a,b){
    if(a.toString().indexOf('debugger') == -1){
      return null;
    }
    setInterval_back(a, b)
}
2.2.2. Fiddler + 編程貓插件 + Hook

使用這種方法布朦,就不需要再打 script 斷點。

注意:如果 script 斷點無法在 debugger 函數(shù)之前斷下來昼窗,那就只能用這種方式進(jìn)行攔截 Hook是趴,才能過掉 debugger。

使用編程貓插件用到的代碼澄惊,和在瀏覽器中手動 Hook 基本一致唆途。在 Hook eval 過瑞數(shù) debugger 的時候,可以用到下面的代碼掸驱。

//配合編程貓專用工具進(jìn)行hook
(function() { 
'use strict';

//過 瑞數(shù) debuger 
var eval_ = window.eval;
window.eval = function(x){
    eval_(x.replace("debugger;","  ; "));
};
//過 瑞數(shù) debuger檢測
window.eval.toString = eval_.toString;
})();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肛搬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子亭敢,更是在濱河造成了極大的恐慌,老刑警劉巖图筹,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帅刀,死亡現(xiàn)場離奇詭異,居然都是意外死亡远剩,警方通過查閱死者的電腦和手機(jī)扣溺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓜晤,“玉大人锥余,你說我怎么就攤上這事×÷樱” “怎么了驱犹?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長足画。 經(jīng)常有香客問我雄驹,道長,這世上最難降的妖魔是什么淹辞? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任医舆,我火速辦了婚禮,結(jié)果婚禮上象缀,老公的妹妹穿的比我還像新娘蔬将。我一直安慰自己,他們只是感情好央星,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布霞怀。 她就那樣靜靜地躺著,像睡著了一般莉给。 火紅的嫁衣襯著肌膚如雪里烦。 梳的紋絲不亂的頭發(fā)上凿蒜,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音胁黑,去河邊找鬼废封。 笑死,一個胖子當(dāng)著我的面吹牛丧蘸,可吹牛的內(nèi)容都是我干的漂洋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼力喷,長吁一口氣:“原來是場噩夢啊……” “哼刽漂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弟孟,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤贝咙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拂募,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庭猩,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年陈症,在試婚紗的時候發(fā)現(xiàn)自己被綠了蔼水。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡录肯,死狀恐怖趴腋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情论咏,我是刑警寧澤优炬,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站厅贪,受9級特大地震影響穿剖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卦溢,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一糊余、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧单寂,春花似錦贬芥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尊沸,卻和暖如春威沫,著一層夾襖步出監(jiān)牢的瞬間贤惯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工棒掠, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留孵构,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓烟很,卻偏偏與公主長得像颈墅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雾袱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容