Антикейлоггер «для параноїка» в Safari

Добрий час доби, мій дорогий параноїк! Звичайно ж ти чув про всіляких прихованих утиліт, покликаних нахабним чином поцупити твої таємні дані (паролі, контактні дані, дані кредиток і т. п.) шляхом зчитування буфера обміну, а також натискань клавіш на програмно-апаратному рівні, при їх введенні в браузері. Одним з варіантів мінімізації ризиків є використання віртуальної клавіатури.



Існують вбудовані рішення (наприклад, віртуальна клавіатура Windows), однак, як ми з тобою підозрюємо, визначити які саме значення вводяться за допомогою такого інструменту теоретично можна з допомогою отримання (X,Y) нашої дорогоцінної мишки. Щоб вийти з ситуації просто перемішаємо розкладку віртуальної клавіатури! Що? Перемішати розкладку? Це ж дико незручно! — воскликнешь ти. І будеш правий, проте, параноим до упору…

Якщо бути чесним, ідея перемішати розкладку підглянена в одному великому банку — на сайті відсутнє поле для вводу реквізитів банківської карти і запропоновано вводити номер через віртуальну клавіатуру, причому цифри на панелі калькулятора» переставляються місцями. Зробимо ж щось подібне для будь-якого сайту => майструємо своє розширення для браузера! #В якості прикладу використаємо Safari.

Щоб не особливо мучитися — візьмемо готову віртуальну клавіатуру на javascript/css звідси і злегка доопрацюємо її.

Основна форма
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
< meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<title>Online Keyboard</title>
<link rel="stylesheet" type="text/css" href="css/style.css" />
</head>
<body>

<div id="container">
<textarea id="write" rows="6" cols="60"></textarea>
<ul id="keyboard">
<li class="symbol"><span class="off">`</span><span class="on">~</span></li>
<li class="symbol"><span class="off">1</span><span class="on">!</span></li>
<li class="symbol"><span class="off">2</span><span class="on">@</span></li>
<li class="symbol"><span class="off">3</span><span class="on">#</span></li>
<li class="symbol"><span class="off">4</span><span class="on">$</span></li>
<li class="symbol"><span class="off">5</span><span class="on">%</span></li>
<li class="symbol"><span class="off">6</span><span class="on">^</span></li>
<li class="symbol"><span class="off">7</span><span class="on">&</span></li>
<li class="symbol"><span class="off">8</span><span class="on">*</span></li>
<li class="symbol"><span class="off">9</span><span class="on">(</span></li>
<li class="symbol"><span class="off">0</span><span class="on">)</span></li>
<li class="symbol"><span class="off"></span><span class="on">_</span></li>
<li class="symbol"><span class="off">=</span><span class="on">+</span></li>
<li class="delete lastitem">delete</li>
<li class="tab">tab</li>
<li class="letter">q</li>
<li class="letter">w</li>
<li class="letter">e</li>
<li class="letter">r</li>
<li class="letter">t</li>
<li class="letter">y</li>
<li class="letter">u</li>
<li class="letter">i</li>
<li class="letter"></li>
<li class="letter">p</li>
<li class="symbol"><span class="off">[</span><span class="on">{</span></li>
<li class="symbol"><span class="off">]</span><span class="on">}</span></li>
<li class="symbol lastitem"><span class="off"></span><span class="on">|</span></li>
<li class="capslock">caps lock</li>
<li class="letter">a</li>
<li class="letter">s</li>
<li class="letter">d</li>
<li class="letter">f</li>
<li class="letter">g</li>
<li class="letter">h</li>
<li class="letter">j</li>
<li class="letter">k</li>
<li class="letter">l</li>
<li class="symbol"><span class="off">;</span><span class="on">:</span></li>
<li class="symbol"><span class="off">'</span><span class="on">"</span></li>
<li class="return lastitem">return</li>
<li class="left-shift">shift</li>
<li class="letter">z</li>
<li class="letter">x</li>
<li class="letter"></li>
<li class="letter">v</li>
<li class="letter">b</li>
<li class="letter">n</li>
<li class="letter">m</li>
<li class="symbol"><span class="off"></span><span class="on"><</span></li>
<li class="symbol"><span class="off">.</span><span class="on">></span></li>
<li class="symbol"><span class="off">/</span><span class="on">?</span></li>
<li class="right-shift lastitem">shift</li>
<li class="space lastitem"> </li>
</ul>
</div>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript" src="js/keyboard.js"></script>
</body>
</html>

Стилі
* {
margin: 0;
padding: 0;
}
body {
font: 71%/1.5 Verdana, Sans-Serif;
background: #eee;
}
#container {
margin: 100px auto;
width: 688px;
}
#write {
margin: 0 0 5px;
padding: 5px;
width: 671px;
height: 200px;
font: 1em/1.5 Verdana, Sans-Serif;
background: #fff;
border: 1px solid #f9f9f9;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
}
#keyboard {
margin: 0;
padding: 0;
list-style: none;
}
#keyboard li {
float: left;
margin: 0 5px 5px 0;
width: 40px;
height: 40px;
line-height: 40px;
text-align: center;
background: #fff;
border: 1px solid #f9f9f9;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
}
.capslock, .tab .left-shift {
clear: left;
}
#keyboard .tab #keyboard .delete {
width: 70px;
}
#keyboard .capslock {
width: 80px;
}
#keyboard .return {
width: 77px;
}
#keyboard .left-shift {
width: 95px;
}
#keyboard .right-shift {
width: 109px;
}
.lastitem {
margin-right: 0;
}
.uppercase {
text-transform: uppercase;
}
#keyboard .space {
clear: left;
width: 681px;
}
.on {
display: none;
}
#keyboard li:hover {
position: relative;
top: 1px;
left: 1px;
border-color: #e5e5e5;
cursor: pointer;
}

Обробка натискань
$(function(){
var $write = $('#write'),
shift = false,
capslock = false;

$('#keyboard li').click(function(){
var $this = $(this),
character = $this.html(); // If it's a lowercase letter, nothing happens to this variable

// Shift keys
if ($this.hasClass('left-shift') || $this.hasClass('right-shift')) {
$('.letter').toggleClass('uppercase');
$('.symbol span').toggle();

shift = (shift === true) ? false : true;
capslock = false;
return false;
}

// Caps lock
if ($this.hasClass('capslock')) {
$('.letter').toggleClass('uppercase');
capslock = true;
return false;
}

// Delete
if ($this.hasClass('delete')) {
var html = $write.html();

$write.html(html.substr(0, html.length - 1));
return false;
}

// Special characters
if ($this.hasClass('symbol')) character = $('span:visible', $this).html();
if ($this.hasClass('space')) character = ' ';
if ($this.hasClass('tab')) character = " ";
if ($this.hasClass('return')) character = "
";

// Uppercase letter
if ($this.hasClass('uppercase')) character = character.toUpperCase();

// Remove shift once a key is clicked.
if (shift === true) {
$('.symbol span').toggle();
if (capslock === false) $('.letter').toggleClass('uppercase');

shift = false;
}

// Add the character
$write.html($write.html() + character);
});
});


Як видно з «основної форми» наша віртуальна клавіатура являє собою звичайний структурований список ul-li, перетворює його в віртуальну клавіатуру додається css файл, а обробкою натискань зайнятий js-скрипт, змінює відповідні характеристики кнопок (видимість, регістр тощо).

Спершу внесемо деякі модифікації в стилі, додавши #keycont залежність, тим самим ізолювавши стилі нашої клавіатури від стилів сторінки, на якій ми будемо її використовувати наступним чином:

#keycont {
display: none;
position: fixed !important;
top: 50% !important;
left: 50% !important;

font: normal 14px/1.5 Verdana, Sans-Serif !important;
color: #444 !important;
text-shadow: none !important;
background-color: #eee !important;
padding: 5px 0 0 5px !important;
margin: 0;

-moz-border-radius: 5px !important;
-webkit-border-radius: 5px !important;
-webkit-user-select: none !important;

z-index:999999999 !important;
}

Модифікації дають нам можливість бачити клавіатуру адекватно, поверх сторінки, по центру + додана деяка крос-браузерность для згладжування кнопочок. Інші модифікації опустимо, вони не настільки важливі.

Далі доопрацюємо на js-скрипт. Додаємо функцію перемішування клавіш:
Array.prototype.shuffle = function( b )
{
var i = this.length, j, t;
while( i ) 
{
j = Math.floor( ( i-- ) * Math.random() );
t = b && typeof this[i].shuffle!=='undefined' ? this[i].shuffle() : this[i];
this[i] = this[j];
this[j] = t;
}
return this;
};

Вона-то і буде змінювати положення кнопочок на клавіатурі. Наступним кроком додамо елементи «кнопочки» для перемішування. Для простоти будемо перемішувати клавіші в рамках горизонталі розташування (не зовсім чисто, але цілком достатньо для наших потреб):

//Constructing keyboard
var keyboard = '<div id="keycont"><ul id="keyboard">';
var line0 = new Array('<li class="symbol"> <span class="off">`</span> <span class="on">~</span> </li>', '<li class="symbol"> <span class="off">1</span> <span class="on">!</span> </li>', '<li class="symbol"> <span class="off">2</span> <span class="on">@</span> </li>', '<li class="symbol"> <span class="off">3</span> <span class="on">#</span> </li>', '<li class="symbol"> <span class="off">4</span> <span class="on">$</span> </li>', '<li class="symbol"> <span class="off">5</span> <span class="on">%</span> </li>', '<li class="symbol"> <span class="off">6</span> <span class="on">^</span> </li>', '<li class="symbol"> <span class="off">7</span> <span class="on">&</span> </li>', '<li class="symbol"> <span class="off">8</span> <span class="on">*</span> </li>', '<li class="symbol"> <span class="off">9</span> <span class="on">(</span> </li>', '<li class="symbol"> <span class="off">0</span> <span class="on">)</span> </li>', '<li class="symbol"> <span class="off"></span> <span class="on">_</span> </li>', '<li class="symbol"> <span class="off">=</span> <span class="on">+</span> </li>');
var line1 = new Array('<li class="letter">q</li>', '<li class="letter">w</li>', '<li class="letter">e</li>', '<li class="letter">r</li>', '<li class="letter">t</li>', '<li class="letter">y</li>', '<li class="letter">u</li>', '<li class="letter">i</li>', '<li class="letter"></li>', '<li class="letter">p</li>', '<li class="symbol"> <span class="off">[</span> <span class="on">{</span> </li>', '<li class="symbol"> <span class="off">]</span> <span class="on">}</span> </li>', '<li class="symbol lastitem"> <span class="off">\</span> <span class="on">|</span> </li>');
var line2 = new Array('<li class="letter">a</li>', '<li class="letter">s</li>', '<li class="letter">d</li>', '<li class="letter">f</li>', '<li class="letter">g</li>', '<li class="letter">h</li>', '<li class="letter">j</li>', '<li class="letter">k</li>', '<li class="letter">l</li>', '<li class="symbol"> <span class="off">;</span> <span class="on">:</span> </li>', '<li class="symbol"> <span class="off">'</span> <span class="on">"</span> </li>');
var line3 = new Array('<li class="letter">z</li>', '<li class="letter">x</li>', '<li class="letter"></li>', '<li class="letter">v</li>', '<li class="letter">b</li>', '<li class="letter">n</li>', '<li class="letter">m</li>', '<li class="symbol"> <span class="off"></span> <span class="on"><</span> </li>', '<li class="symbol"> <span class="off">.</span> <span class="on">></span> </li>', '<li class="symbol"> <span class="off">/</span> <span class="on">?</span> </li>');

line0.shuffle();
line1.shuffle();
line2.shuffle();
line3.shuffle();

keyboard += line0.join("");
keyboard += '<li class="delete lastitem">delete</li>';
keyboard += '<li class="tab">tab</li>';

keyboard += line1.join("");
keyboard += '<li class="capslock">caps lock</li>';

keyboard += line2.join("");
keyboard += '<li class="return lastitem">return</li>';
keyboard += '<li class="left-shift">shift</li>';

keyboard += line3.join("");
keyboard += '<li class="right-shift lastitem">shift</li>';
keyboard += '<li class="space lastitem"> </li>';

keyboard+='</ul></div>';

$('body').append(keyboard);

Клавіатура зібрана!

Залишилася справа за малим — на сторінці клавіатура потрібна далеко не завжди, а тільки в тих випадках, коли ми збираємося щось вводити в «секретні» поля, причому цих полів на сторінці може бути кілька (в даному релізі будемо відловлювати поля введення пароля по відомій властивості). Тому додаємо пару-трійку нових функцій активації/деактивації (приховання/показу) клавіатури:

$write.focus(function(){
$write = $(this);
$keycont.fadeIn();
wrfocus = true;
});

$write.focusout(function(){
if (focusss == false) {wrfocus=false; $keycont.fadeOut();}
});

$keycont.hover(
function(){
if (wrfocus == true) focusss = true;
},
function(){
focusss = false;
}
);

$keycont.focusout(function(){
if (focusss == false) {wrfocus=false; $keycont.fadeOut();}
});

$keycont.click(function(){
focusss = true;
if (wrfocus == true) $write.focus();
});

Ось і вся магія, якщо не заглиблюватися далі.

Особливості клавіатури: відносна кросбраузерність, перемішування клавіш при перезавантаженні сторінки (для різних вкладок клавіатура перемішується по незалежно), потрібно увімкнути javascript, можуть бути приховані підводні камені.

Протестовано на ряді популярних ресурсів:

Habrahabr
Facebook
VK
Stackoverflow

На жаль, не запрацювало в Google і iCloud, швидше за все є специфічні моменти на даних ресурсах.

Робив клавіатуру давно, тому перепрошую за не занадто докладний опис.

Складання розширення для Mozilla можна скачати по цим посиланням. Встановлюється і активується в Safari через вкладку «Розробник», про те як це зробити — запитати в улюбленому пошуковику.

p.s. можна налаштувати клавіатуру по своєму смаку (відловлювати поля введення банківських карт і інших специфічних полів улюблених сайтів), перемішування кнопочок ж відключається видаленням відповідної рядки в коді.

Користуємося на здоров'я, удачі!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.