Игры с виртуализацией в javascript, или как я переписал...
DESCRIPTION
Доклад Евгения Потапова на HighLoad++ 2014.TRANSCRIPT
![Page 1: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/1.jpg)
Игры с виртуализацией в JavaScript, или как я переписал эмуляторЕвгений Потапов
![Page 2: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/2.jpg)
Евгений Потаповгенеральный директор компании ITSumma
более 1000 серверов на поддержке компании
120 миллионов уникальных посетителей ежедневно
![Page 3: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/3.jpg)
Содержание• Предыстория• Существующие проекты• Принципы работы• Cпособы применения• Пути кастомизации• Заключение
![Page 4: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/4.jpg)
Предыстория 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!”
![Page 5: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/5.jpg)
Disclaimer• Не программист (сейчас не
программист)• Вообще ничего не понимаю в
эмуляторах (знаю что есть и как работают)
• Могу быть не прав• Комментарии – Welcome
![Page 6: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/6.jpg)
Доступные решения• 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/
![Page 7: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/7.jpg)
JSLinux
http://bellard.org/jslinux/
![Page 8: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/8.jpg)
JSLinux• Автор Fabrice Bellard (LZEXE, FFmpeg,
QEMU)• 32-битный x86-совместимый CPU• 16 мегабайт оперативной памяти• Только консольный режим• Работа с буфером обмена• JS-разработка
![Page 9: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/9.jpg)
JSLinux - недостатки • Не развивается с 2012 года• Нет исходных кодов• Только текстовая консоль
![Page 10: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/10.jpg)
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Описание работы
![Page 11: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/11.jpg)
Virtual x86
http://copy.sh/v86/
![Page 12: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/12.jpg)
Virtual x86• x86, 16 бит• Opensource• Активно развивается• Полноценное взаимодействие с
виртуальной машиной через COM1
![Page 13: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/13.jpg)
Virtual x86 - недостатки• Неполноценная реализация
Protected mode
![Page 14: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/14.jpg)
Virtual x86 - подробнее• http://copy.sh/v86/
сайт проекта• https://github.com/copy/v86/
репозиторий
![Page 15: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/15.jpg)
PCE.JS• Эмулятор PCE скомпилированный
в LLVM• LLVM транслированный в
JavaScript с помощью Emscripten• Наиболее полноценная
реализация виртуальной машины
![Page 16: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/16.jpg)
PCE.JS
![Page 17: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/17.jpg)
Недостатки PCE.JS• Не совсем “true” JavaScript-
решение• Не очень активно развивается
![Page 18: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/18.jpg)
PCE.JS подробнее• http://jamesfriend.com.au/pce-js/
сайт проекта (там есть даже MacOSX)
• https://github.com/jsdf/pcegithub-репозиторий
![Page 19: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/19.jpg)
«Вот же круто, а зачем?»
Front-End-разработка:
конвенциональное знание:- Не защитить данные- Не защитить алгоритмы
![Page 20: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/20.jpg)
Защита данных. Доступные методы- Обфускация/минификация работы с данными- Шифрование/стеганография самих данных
проблема: место обработки все равно будет доступно, console.log
![Page 21: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/21.jpg)
Защита алгоритмов. Доступные методы- обфускация кода – js-beautifier-ы достигли большого прогресса (см. слайды про реверс JSLinux)- использование ActionScript/Java итп. - декомпиляция
![Page 22: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/22.jpg)
Защита алгоритмов
Интерпретатор собственного байткода
Основная задача защиты – не сделать анализ невозможным, но сделать его дорогим
![Page 23: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/23.jpg)
Защита алгоритмов
Интерпретатор собственного байткода
Для понимания алгоритма требуется понимание всего байткода, а фактически – анализ эмулятора
![Page 24: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/24.jpg)
Защита алгоритмов
Интерпретатор собственного байткода
- необходима реализация эмулятора- необходима реализация байткода- необходим транслятор в байткод
![Page 25: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/25.jpg)
Защита алгоритмов
- LLVM + Emscripten?В конце концов - это опять же JavaScript
![Page 26: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/26.jpg)
Защита алгоритмов
Интерпретатор собственного байткода
- необходима реализация эмулятораВиртуальная машина- необходима реализация байткодаМашинный код IBM PC- необходим транслятор в байткодASM/Знакомые языки высокого уровня
![Page 27: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/27.jpg)
Что использовать?• Посмотрим на JSLinux• Оценим Virtual x86• Оценим PCE.JS
![Page 28: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/28.jpg)
Как это работает? - JSLinux• Кодовая база:
https://github.com/levskaya/jslinux-deobfuscated
• Core functionalitycpux86-ta.js (9719 LOC)
![Page 29: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/29.jpg)
Как это работает – JSLinuxРегистры
![Page 30: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/30.jpg)
Как это работает - JSLinuxОрганизация памяти
![Page 31: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/31.jpg)
Как это работает - JSLinux
Execution Loopстроки 530-9664 (9134 строк кода)OUTER LOOP – считать OPCodeEXECUTION LOOP – распарсить и исполнить
![Page 32: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/32.jpg)
Как это работает - JSLinux
![Page 33: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/33.jpg)
Как это работает - JSLinux
![Page 34: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/34.jpg)
Как это работает - JSLinux
Exec Loop
![Page 35: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/35.jpg)
Как это работает - JSLinux
http://pdos.csail.mit.edu/6.828/2010/readings/i386/MOV.htm
Opcode: 40Instruction: INC r16Description: Increment word register by 1
grep 0x40
![Page 36: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/36.jpg)
Как это работает - JSLinux
![Page 37: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/37.jpg)
Как это работает - JSLinux• Работа с портами
![Page 38: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/38.jpg)
Мучаем JSLinux• Интерфейс терминала как API
между DOM-моделью и виртуальной машиной
• В самой машине есть TCC/GCC/C++
![Page 39: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/39.jpg)
Мучаем JSLinux
![Page 40: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/40.jpg)
Мучаем JSLinux
![Page 41: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/41.jpg)
Мучаем JSLinux
![Page 42: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/42.jpg)
Мучаем JSLinux
![Page 43: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/43.jpg)
Мучаем JSLinux
![Page 44: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/44.jpg)
Мучаем JSLinux
![Page 45: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/45.jpg)
JSLinux - проблемы• Лицензия• Код не публичен
![Page 46: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/46.jpg)
Virtual x86• Наиболее перспективный с точки зрения
использования в наших целях проект• Уже готово взаимодействие с DOM-
моделью через COM1• Внутри Linux Busybox-а нет cc* (есть Lua)• Внутри DOS-а есть NASM
![Page 47: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/47.jpg)
Virtual x86 - проблемы• Неполноценная реализация x86
![Page 48: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/48.jpg)
PCE.JS• Внутри – полноценный x86• Эмулятор не работает напрямую с
DOM-ом, фактически сверху еще один эмулятор с API C/C++, и модифицировать надо и его
![Page 49: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/49.jpg)
PCE.JS
Я пробовал перехват изменений в памяти – круто (можно написать и на Turbo Pascal-е), но большой overhead.
![Page 50: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/50.jpg)
Заключение• Есть ли смысл?
С Virtual x86 есть практический смысл (при наличии настоящих задач).
• Куда двигаться? Создание VM и инфраструктуры непосредственно для разработки
• Да здравствуют безумства!
![Page 51: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)](https://reader035.vdocuments.pub/reader035/viewer/2022081513/5585ba6bd8b42a40548b4c39/html5/thumbnails/51.jpg)
Игры с виртуализацией в JavaScript, или как я переписал эмулятор
Евгений Потапов
http://[email protected]://facebook.com/eapotapov