JavaScript奇淫技巧:反調試

2023-01-01 19:33:34 來源:51CTO博客

JavaScript奇淫技巧:反調試


【資料圖】

本文,將分享幾種JS代碼反調試技巧,目標是:實現防止他人調試、動態分析自己的代碼。

檢測調試,方法一:用console.log檢測

代碼:

var c = new RegExp ("1");

c.toString = function () {

alert("檢測到調試")

}

console.log (c);

原理:

當console.log輸出調試信息時,會將非字符串類型數據轉成字符串,于是通過接管toString函數,判斷是否有這樣的行為,而如果沒有打開調試窗口,即不會有console.log輸出,從而識別是否于處調試狀態。

運行效果:

檢測調試,方法二、通過代碼執行時間檢測

代碼:

var startTime = new Date ();

debugger;

var endTime = new Date ();

var isDev = endTime-startTime> 100;

if (isDev){

alert("檢測到調試")

}

原理:

在代碼不同語句間加入debuger指令,debugger會使調試模式暫停,那么暫停將造成延遲。

通過檢測延遲前后果的時間值,從而判斷是否發生了延時,如果發生,則表達處于調試狀態。

運行效果:

debugger觸發暫停:

檢測到調試:

反調試手段

檢測到調試又該如何呢?

反調試方法一、無限debugger

一般情況下,可以用無限循環的debugger,使不停的暫停代碼執行,使調試無法進行。

如:

var c = new RegExp ("1");

c.toString = function () {

alert("檢測到調試")

setInterval(function(){

debugger

},1000);

}

console.log (c);

運行效果:

反調試方法二、內存耗盡

debugger方法雖然效果不錯,但太過直觀,反制效果也過去溫柔。

另有一種“內存耗盡”的方式,會更隱藏、更強大,如:

var startTime = new Date ();

debugger;

var endTime = new Date ();

var isDev = endTime-startTime> 100;

var stack = [];

if (isDev){

while(true){

stack.push(this);

console.log(stack.length,this)

}

}

運行效果:

代碼運行造成的內存占用會越來越大,很快會使瀏覽器崩潰,如下圖:

JS代碼加密

上述幾種方法,已經達到了反調試的效果,但如果他人查看代碼,也可能被找出檢測功能并刪去。

為了防止反調試功能被剔除,我們可以對JS代碼進行混淆加密。

例如本文第一段代碼:

var c = new RegExp ("1");

c.toString = function () {

alert("檢測到調試")

}

console.log (c);

代碼功能很清晰,使用JShaman進行混淆加密:

JShaman是專業且強力的JS代碼混淆加密工具

混淆加密后的代碼,將成為:

var _0x98ac=["117.","56.","26825.27970.21049.35850.35804."];function _0x(str,dy_key){dy_key=9;var i,k,str2="";k=str.split(".");for(i=0;i

這樣的代碼,將很難理解其功能,也就可以防止代碼被修改。

其它的JS功能代碼,同樣可以使用JShaman進行混淆加密,最終使用混淆加密后的安全代碼。

標簽: 同樣可以 動態分析 效果不錯

上一篇:天天實時:43-KVM虛擬化-利用libvirt服務進行KVM虛擬機管理
下一篇:實時焦點:靜態路由配置