آموزش مبهم کردن کد های جاوا اسکریپت

آموزش وب ، javascript ، هک و امنیت ،
145 بازدید
آموزش مبهم کردن کد های جاوا اسکریپت
آموزش مبهم کردن (obfuscation) عبارت ها با استفاده از کد های جاوا اسکریپت

شاید به نظرتان کار ما در این مطلب رمزگذاری باشد نه مبهم کردن. ولی برای این که دقیقا متوجه بشوید ما در این مطلب قرار است چه کاری انجام دهیم ، پیشنهاد می کنم مطلب "مقدمه ای بر رمزگذاری و مبهم کردن کد" را مطالعه کنید.

با مطالعه مقدمه ی بالا تفاوت بین رمزگذاری و مبهم کردن را متوجه می شوید. ما در این مطلب قرار است کد ها را مبهم کنیم نه رمزگذاری.

آشنایی با کد کاراکتر ها (char code)

هر کاراکتر در سیستم ، با یک کد عددی مشخص می شود. که آن کد نیز به صورت دو دویی (Binary) در سیستم شناخته می شود. به عنوان مثال کد کاراکتر "b" ، عدد 98 است.

اول می خواهیم با هم چند آزمایش انجام دهیم. اگر تا به حال کد جاوا اسکریپت نوشته باشید حتما باید با کنسول جاوا اسکریپت مرورگر آشنا باشید. در مرورگر دکمه ی F12 را بزنید و کنسول را باز کنید. در کنسول کد زیر را بنویسید و اجرا کنید.

<<<code>>>

String.fromCharCode(98); // "b"

<<</code>>>

خروجی این کد کاراکتر b خواهد بود. در اصل تابع fromCharCode مقدار ورودی کد کاراکتر را دریافت می کند و کاراکتر مربوط به آن را بر می گرداند.

حال کد های زیر را در کنسول اجرا کنید.

<<<code>>>

"ab".charCodeAt(0); // 97

"ab".charCodeAt(1); // 98

<<</code>>>

خط اول مقدار 97 که کد کاراکتر a است را بر می گرداند و خط دوم 98 که کد کاراکتر b است. در اصل تابع charCodeAt کد کاراکتر nام را از مقدار String (رشته) بر می گرداند.

متد fromCharCode از شی String در جاوا اسکریپت

این متد (تابع) برای به دست آوردن کاراکتر از کد آن است و شکل کلی آن به شکل زیر است:

<<<code>>>

String.fromCharCode( charCode1[, ...[, charCodeN]] );

<<</code>>>

در این تابع می توان چندین عدد را به عنوان آرگومان وارد کرد و به جای یک کاراکتر ، یک عبارت را در خروجی دریافت کرد.

متد charCodeAt از مقدار رشته در جاوا اسکریپت

این تابع ، کد یک کاراکتر را بر می گرداند. شکل کلی آن:

<<<code>>>

str.charCodeAt( index );

<<</code>>>

مقدار str یک مقدار از نوع رشته است که می تواند شامل چندین کاراکتر باشد.

تغییر کاراکتر های یک عبارت با الگوریتمی مشخص

در این قسمت می خواهیم کاراکتری را به عنوان ورودی به یک برنامه بدهیم و در خروجی ، عبارت را به صورت مبهم شده بگیریم.

<<<code>>>

var str = "toolstheme.ir is a very good site!",

   newStr = "";

for( var i = 0 ; i < str.length ; i++ )

{

   var charCode = str.charCodeAt( i );

   charCode++;

   newStr += String.fromCharCode( charCode );

}

document.write( str + "<br />" + newStr );

<<</code>>>

نمایش نتیجه ی کد بالا

خیلی جالب ، متن ما تبدیل می شود به عبارت uppmtuifnf/js!jt!b!wfsz!hppe!tjuf" که یک عبارت مبهم است.

کد بالا یک نمونه ی خیلی ساده از obfuscator ها است. اگر به حروف الفبا دقت کنید ، متوجه می شوید که همه ی آن ها یک کاراکتر بالاتر رفته اند. مثلا o شده است u.

حال اگر بخواهیم این عبارت مبهم را به حالت اول بازگردانیم کافی است از همان کد قبلی استفاده کنیم ولی این بار عکس عمل را انجام دهیم. یعنی کد کاراکتر ها را منهای یک کنیم. این طوری عبارت اولیه را به دست خواهیم آورد.

برای مبهم کردن کد هم به همین شکل عمل می کنیم با این تفاوت که به جای عبارت ورودی ، کد جاوا اسکریپت قرار می دهیم. به این شکل کد ما مبهم می شود.

این فقط شکل ساده و کلی مبهم کردن یک عبارت بود. هر چه الگوریتم استفاده شده برای مبهم کردن پیچیده تر باشد ، تشخیص آن سخت تر خواهد بود.

مثال پیچیده تر

<<<code>>>

var str = "toolstheme.ir is a very good site!",

   newStr = "";

for( var i = 0 ; i < str.length ; i++ )

{

   var charCode = str.charCodeAt( i );

   charCode = charCode.toString(2) + "0";

   charCode = parseInt(charCode, 2);

   newStr += String.fromCharCode( charCode );

}

document.write( str + "<br />" + newStr );

<<</code>>>

برای آشنایی با مبنای اعداد این مطلب را مطالعه کنید.

در قسمت آبی رنگ با استفاده از تابع toString ، عدد در مبنای ده به عدد در مبنای دو تبدیل شده است.

در قسمت سبز رنگ با استفاده از تابع parseInt عدد در مبنای دو را به مبنای ده تبدیل کرده ایم. (آرگومان دوم ، مبنای ابتدایی عدد است)

خروجی کد بالا را در لینک زیر ببینید. نتیجه خیلی نامفهوم تر است. (èÞÞØæèÐÊÚÊÒä@Òæ@Â@ìÊäò@ÎÞÞÈ@æÒèÊB)

نمایش نتیجه ی کد بالا

البته این نکته قابل یادآوری است که برگرداندن عدد کد کاراکتر به مبنای 2 و تغییر آن و سپس بازگرداندن آن به مبنای 10 هیچ ضرورتی ندارد. در مثال بالا خیلی راحت می توان در همان مبنای 10 عدد را ضرب در 2 کردن و دقیقا همین نتیجه را گرفت ( امتحان کنید ). اما این مثال را زدم تا بدانید که می توان چنین کار هایی نیز انجام داد. اگر شما بتوانید مقداری متغیر برای عدد صفر (که زیر آن خط کشیده شده است) ایجاد کنید و کد را از حالت ثابت خارج کنید ، این تغییر مبنا ها می تواند مفید باشد.

برای برگرداندن عبارت مبهم به حالت اولیه لازم است دوباره کد هر یک از کاراکتر های عبارت را در به مبنای 2 ببرید و صفر آخر آن ها را حذف کنید و به مبنای 10 برگردانید.

استفاده از عملگر های بیتی برای مبهم کردن

در مثال قبل ، ما کد کاراکتر را به مبنای 2 تبدیل کردیم. در این مثال می خواهیم با ایجاد تغییراتی در ساختار بیتی اعداد ، کد کاراکتر ها را تغییر بدهیم و آن را مبهم کنیم.

<<<code>>>

var str = "toolstheme.ir is a very good site!",

   newStr = "";

for( var i = 0 ; i < str.length ; i++ )

{

   var charCode = str.charCodeAt( i );

   charCode ^= 2;

   newStr += String.fromCharCode( charCode );

}

document.write( str + "<br />" + newStr );

<<</code>>>

نمایش نتیجه ی کد بالا

در قسمت آبی رنگ عملگری بیتی را مشاهده می کنید. عملگر ^ یا XOR عملگری بیتی است. (به زودی مطلبی در این باره منتشر خواهم کرد)

چند عملگر بیتی دیگر: & ، | ، ~ ، >> ، <<

می توانید با قرار دادن آن ها بین تو عدد در کنسول جاوا اسکریپت نتیجه را مشاهده کنید.

امیدوارم مطلب مفیدی بوده باشد

رمز تمام فایل های فشرده
رمز فایل فشرده است.