2. Евгений Потапов
генеральный директор
компании ITSumma
более 1000 серверов на
поддержке компании
120 миллионов уникальных
посетителей ежедневно
3. Содержание
• Предыстория
• Существующие проекты
• Принципы работы
• Cпособы применения
• Пути кастомизации
• Заключение
4. Предыстория
18.05.2011, https://news.ycombinator.com/item?id=2555349
“Boot a linux kernel right inside your browser.”
“I'm utterly dumbfounded. Not only does it boot, it's got emacs, and a compiler.
Welcome to JS/Linux
~ # emacs test.c
~ # cat test.c
void main(void) {
printf("Hello World!n");
}
~ # tcc test.c -o hello
~ # ./hello
Hello World!”
5. Disclaimer
• Не программист (сейчас не программист)
• Вообще ничего не понимаю в эмуляторах
(знаю что есть и как работают)
• Могу быть не прав
• Комментарии – Welcome
8. JSLinux
• Автор Fabrice Bellard (LZEXE, FFmpeg,
QEMU)
• 32-битный x86-совместимый CPU
• 16 мегабайт оперативной памяти
• Только консольный режим
• Работа с буфером обмена
• JS-разработка
9. JSLinux - недостатки
• Не развивается с 2012 года
• Нет исходных кодов
• Только текстовая консоль
10. JSLinux - подробнее
• http://bellard.org/jslinux/tech.html
Technical Notes
• https://news.ycombinator.com/item?id=2555349
Обсуждение на Hacker News
• https://github.com/levskaya/jslinux-deobfuscated
Деобфусцированный и обработанный код
• http://www.quora.com/Emulators-computing/How-does-bellard-
org-jslinux-work
Описание работы
12. Virtual x86
• x86, 16 бит
• Opensource
• Активно развивается
• Полноценное взаимодействие с
виртуальной машиной через COM1
13. Virtual x86 - недостатки
• Неполноценная реализация Protected
mode
14. Virtual x86 - подробнее
• http://copy.sh/v86/
сайт проекта
• https://github.com/copy/v86/
репозиторий
15. PCE.JS
• Эмулятор PCE скомпилированный в
LLVM
• LLVM транслированный в JavaScript
с помощью Emscripten
• Наиболее полноценная реализация
виртуальной машины
17. Недостатки PCE.JS
• Не совсем “true” JavaScript-решение
• Не очень активно развивается
18. PCE.JS подробнее
• http://jamesfriend.com.au/pce-js/
сайт проекта (там есть даже MacOSX)
• https://github.com/jsdf/pce
github-репозиторий
19. «Вот же круто, а зачем?»
Front-End-разработка:
конвенциональное знание:
- Не защитить данные
- Не защитить алгоритмы
20. Защита данных. Доступные методы
- Обфускация/минификация работы с
данными
- Шифрование/стеганография самих данных
проблема: место обработки все равно будет
доступно, console.log
21. Защита алгоритмов. Доступные методы
- обфускация кода – js-beautifier-ы
достигли большого прогресса (см.
слайды про реверс JSLinux)
- использование ActionScript/Java итп. -
декомпиляция
22. Защита алгоритмов
Интерпретатор собственного байткода
Основная задача защиты – не сделать
анализ невозможным, но сделать его
дорогим
23. Защита алгоритмов
Интерпретатор собственного байткода
Для понимания алгоритма требуется
понимание всего байткода, а
фактически – анализ эмулятора
24. Защита алгоритмов
Интерпретатор собственного байткода
- необходима реализация эмулятора
- необходима реализация байткода
- необходим транслятор в байткод
25. Защита алгоритмов
- LLVM + Emscripten?
В конце концов - это опять же
JavaScript
26. Защита алгоритмов
Интерпретатор собственного байткода
- необходима реализация эмулятора
Виртуальная машина
- необходима реализация байткода
Машинный код IBM PC
- необходим транслятор в байткод
ASM/Знакомые языки высокого уровня
27. Что использовать?
• Посмотрим на JSLinux
• Оценим Virtual x86
• Оценим PCE.JS
28. Как это работает? - JSLinux
• Кодовая база:
https://github.com/levskaya/jslinux-deobfuscated
• Core functionality
cpux86-ta.js (9719 LOC)
35. Как это работает - JSLinux
http://pdos.csail.mit.edu/6.828/2010/readi
ngs/i386/MOV.htm
Opcode: 40
Instruction: INC r16
Description: Increment word register by 1
grep 0x40
46. Virtual x86
• Наиболее перспективный с точки зрения
использования в наших целях проект
• Уже готово взаимодействие с DOM-моделью
через COM1
• Внутри Linux Busybox-а нет cc* (есть Lua)
• Внутри DOS-а есть NASM
47. Virtual x86 - проблемы
• Неполноценная реализация x86
48. PCE.JS
• Внутри – полноценный x86
• Эмулятор не работает напрямую с
DOM-ом, фактически сверху еще один
эмулятор с API C/C++, и
модифицировать надо и его
49. PCE.JS
Я пробовал перехват изменений в
памяти – круто (можно написать и на
Turbo Pascal-е), но большой overhead.
50. Заключение
• Есть ли смысл?
С Virtual x86 есть практический смысл
(при наличии настоящих задач).
• Куда двигаться?
Создание VM и инфраструктуры
непосредственно для разработки
• Да здравствуют безумства!
51. Игры с виртуализацией в JavaScript, или как я
переписал эмулятор
Евгений Потапов
http://itsumma.ru
eapotapov@itsumma.ru
http://facebook.com/eapotapov