Игры с виртуализацией в javascript, или как я переписал...
DESCRIPTION
Доклад Евгения Потапова на HighLoad++ 2014.TRANSCRIPT
Игры с виртуализацией в JavaScript, или как я переписал эмуляторЕвгений Потапов
Евгений Потаповгенеральный директор компании ITSumma
более 1000 серверов на поддержке компании
120 миллионов уникальных посетителей ежедневно
Содержание• Предыстория• Существующие проекты• Принципы работы• Cпособы применения• Пути кастомизации• Заключение
Предыстория 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!”
Disclaimer• Не программист (сейчас не
программист)• Вообще ничего не понимаю в
эмуляторах (знаю что есть и как работают)
• Могу быть не прав• Комментарии – Welcome
Доступные решения• JSLinux - http://bellard.org/jslinux/• PCE.JS - http://jamesfriend.com.au/pce-js/• Virtual x86 - http://copy.sh/v86/• PC.JS - http://www.pcjs.org/• JSPCEmulator -
http://jspcemulator.sourceforge.net/• JSDosBox - http://jsdosbox.sourceforge.net/
JSLinux
http://bellard.org/jslinux/
JSLinux• Автор Fabrice Bellard (LZEXE, FFmpeg,
QEMU)• 32-битный x86-совместимый CPU• 16 мегабайт оперативной памяти• Только консольный режим• Работа с буфером обмена• JS-разработка
JSLinux - недостатки • Не развивается с 2012 года• Нет исходных кодов• Только текстовая консоль
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-d
oes-bellard-org-jslinux-workОписание работы
Virtual x86
http://copy.sh/v86/
Virtual x86• x86, 16 бит• Opensource• Активно развивается• Полноценное взаимодействие с
виртуальной машиной через COM1
Virtual x86 - недостатки• Неполноценная реализация
Protected mode
Virtual x86 - подробнее• http://copy.sh/v86/
сайт проекта• https://github.com/copy/v86/
репозиторий
PCE.JS• Эмулятор PCE скомпилированный
в LLVM• LLVM транслированный в
JavaScript с помощью Emscripten• Наиболее полноценная
реализация виртуальной машины
PCE.JS
Недостатки PCE.JS• Не совсем “true” JavaScript-
решение• Не очень активно развивается
PCE.JS подробнее• http://jamesfriend.com.au/pce-js/
сайт проекта (там есть даже MacOSX)
• https://github.com/jsdf/pcegithub-репозиторий
«Вот же круто, а зачем?»
Front-End-разработка:
конвенциональное знание:- Не защитить данные- Не защитить алгоритмы
Защита данных. Доступные методы- Обфускация/минификация работы с данными- Шифрование/стеганография самих данных
проблема: место обработки все равно будет доступно, console.log
Защита алгоритмов. Доступные методы- обфускация кода – js-beautifier-ы достигли большого прогресса (см. слайды про реверс JSLinux)- использование ActionScript/Java итп. - декомпиляция
Защита алгоритмов
Интерпретатор собственного байткода
Основная задача защиты – не сделать анализ невозможным, но сделать его дорогим
Защита алгоритмов
Интерпретатор собственного байткода
Для понимания алгоритма требуется понимание всего байткода, а фактически – анализ эмулятора
Защита алгоритмов
Интерпретатор собственного байткода
- необходима реализация эмулятора- необходима реализация байткода- необходим транслятор в байткод
Защита алгоритмов
- LLVM + Emscripten?В конце концов - это опять же JavaScript
Защита алгоритмов
Интерпретатор собственного байткода
- необходима реализация эмулятораВиртуальная машина- необходима реализация байткодаМашинный код IBM PC- необходим транслятор в байткодASM/Знакомые языки высокого уровня
Что использовать?• Посмотрим на JSLinux• Оценим Virtual x86• Оценим PCE.JS
Как это работает? - JSLinux• Кодовая база:
https://github.com/levskaya/jslinux-deobfuscated
• Core functionalitycpux86-ta.js (9719 LOC)
Как это работает – JSLinuxРегистры
Как это работает - JSLinuxОрганизация памяти
Как это работает - JSLinux
Execution Loopстроки 530-9664 (9134 строк кода)OUTER LOOP – считать OPCodeEXECUTION LOOP – распарсить и исполнить
Как это работает - JSLinux
Как это работает - JSLinux
Как это работает - JSLinux
Exec Loop
Как это работает - JSLinux
http://pdos.csail.mit.edu/6.828/2010/readings/i386/MOV.htm
Opcode: 40Instruction: INC r16Description: Increment word register by 1
grep 0x40
Как это работает - JSLinux
Как это работает - JSLinux• Работа с портами
Мучаем JSLinux• Интерфейс терминала как API
между DOM-моделью и виртуальной машиной
• В самой машине есть TCC/GCC/C++
Мучаем JSLinux
Мучаем JSLinux
Мучаем JSLinux
Мучаем JSLinux
Мучаем JSLinux
Мучаем JSLinux
JSLinux - проблемы• Лицензия• Код не публичен
Virtual x86• Наиболее перспективный с точки зрения
использования в наших целях проект• Уже готово взаимодействие с DOM-
моделью через COM1• Внутри Linux Busybox-а нет cc* (есть Lua)• Внутри DOS-а есть NASM
Virtual x86 - проблемы• Неполноценная реализация x86
PCE.JS• Внутри – полноценный x86• Эмулятор не работает напрямую с
DOM-ом, фактически сверху еще один эмулятор с API C/C++, и модифицировать надо и его
PCE.JS
Я пробовал перехват изменений в памяти – круто (можно написать и на Turbo Pascal-е), но большой overhead.
Заключение• Есть ли смысл?
С Virtual x86 есть практический смысл (при наличии настоящих задач).
• Куда двигаться? Создание VM и инфраструктуры непосредственно для разработки
• Да здравствуют безумства!
Игры с виртуализацией в JavaScript, или как я переписал эмулятор
Евгений Потапов
http://[email protected]://facebook.com/eapotapov