2014 HighLoad - Игры с виртуализацией в JavaScript, или как я переписал эмулятор.pptx
- Количество слайдов: 51
Игры с виртуализацией в Java. Script, или как я переписал эмулятор Евгений Потапов
Евгений Потапов генеральный директор компании 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 x 86 - http: //copy. sh/v 86/ PC. JS - http: //www. pcjs. org/ JSPCEmulator - http: //jspcemulator. sourceforge. net/ JSDos. Box - http: //jsdosbox. sourceforge. net/
JSLinux http: //bellard. org/jslinux/
JSLinux • • • Автор Fabrice Bellard (LZEXE, FFmpeg, QEMU) 32 -битный x 86 -совместимый 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-does-bellard-orgjslinux-work Описание работы
Virtual x 86 http: //copy. sh/v 86/
Virtual x 86 • • x 86, 16 бит Opensource Активно развивается Полноценное взаимодействие с виртуальной машиной через COM 1
Virtual x 86 - недостатки • Неполноценная реализация Protected mode
Virtual x 86 - подробнее • http: //copy. sh/v 86/ сайт проекта • https: //github. com/copy/v 86/ репозиторий
PCE. JS • Эмулятор PCE скомпилированный в LLVM • LLVM транслированный в Java. Script с помощью Emscripten • Наиболее полноценная реализация виртуальной машины
PCE. JS
Недостатки PCE. JS • Не совсем “true” Java. Script-решение • Не очень активно развивается
PCE. JS подробнее • http: //jamesfriend. com. au/pce-js/ сайт проекта (там есть даже Mac. OSX) • https: //github. com/jsdf/pce github-репозиторий
«Вот же круто, а зачем? » Front-End-разработка: конвенциональное знание: - Не защитить данные - Не защитить алгоритмы
Защита данных. Доступные методы - Обфускация/минификация работы с данными - Шифрование/стеганография самих данных проблема: место обработки все равно будет доступно, console. log
Защита алгоритмов. Доступные методы - обфускация кода – js-beautifier-ы достигли большого прогресса (см. слайды про реверс JSLinux) - использование Action. Script/Java итп. декомпиляция
Защита алгоритмов Интерпретатор собственного байткода Основная задача защиты – не сделать анализ невозможным, но сделать его дорогим
Защита алгоритмов Интерпретатор собственного байткода Для понимания алгоритма требуется понимание всего байткода, а фактически – анализ эмулятора
Защита алгоритмов Интерпретатор собственного байткода - необходима реализация эмулятора - необходима реализация байткода - необходим транслятор в байткод
Защита алгоритмов - LLVM + Emscripten? В конце концов - это опять же Java. Script
Защита алгоритмов Интерпретатор собственного байткода - необходима реализация эмулятора Виртуальная машина - необходима реализация байткода Машинный код IBM PC - необходим транслятор в байткод ASM/Знакомые языки высокого уровня
Что использовать? • Посмотрим на JSLinux • Оценим Virtual x 86 • Оценим PCE. JS
Как это работает? - JSLinux • Кодовая база: https: //github. com/levskaya/jslinuxdeobfuscated • Core functionality cpux 86 -ta. js (9719 LOC)
Как это работает – JSLinux Регистры
Как это работает - JSLinux Организация памяти
Как это работает - JSLinux Execution Loop строки 530 -9664 (9134 строк кода) OUTER LOOP – считать OPCode EXECUTION LOOP – распарсить и исполнить
Как это работает - JSLinux
Как это работает - JSLinux
Как это работает - JSLinux Exec Loop
Как это работает - JSLinux http: //pdos. csail. mit. edu/6. 828/2010/readings/i 386/MOV. htm Opcode: 40 Instruction: INC r 16 Description: Increment word register by 1 grep 0 x 40
Как это работает - JSLinux
Как это работает - JSLinux • Работа с портами
Мучаем JSLinux • Интерфейс терминала как API между DOMмоделью и виртуальной машиной • В самой машине есть TCC/GCC/C++
Мучаем JSLinux
Мучаем JSLinux
Мучаем JSLinux
Мучаем JSLinux
Мучаем JSLinux
Мучаем JSLinux
JSLinux - проблемы • Лицензия • Код не публичен
Virtual x 86 • Наиболее перспективный с точки зрения использования в наших целях проект • Уже готово взаимодействие с DOM-моделью через COM 1 • Внутри Linux Busybox-а нет cc* (есть Lua) • Внутри DOS-а есть NASM
Virtual x 86 - проблемы • Неполноценная реализация x 86
PCE. JS • Внутри – полноценный x 86 • Эмулятор не работает напрямую с DOM-ом, фактически сверху еще один эмулятор с API C/C++, и модифицировать надо и его
PCE. JS Я пробовал перехват изменений в памяти – круто (можно написать и на Turbo Pascal-е), но большой overhead.
Заключение • Есть ли смысл? С Virtual x 86 есть практический смысл (при наличии настоящих задач). • Куда двигаться? Создание VM и инфраструктуры непосредственно для разработки • Да здравствуют безумства!
Игры с виртуализацией в Java. Script, или как я переписал эмулятор Евгений Потапов http: //itsumma. ru eapotapov@itsumma. ru http: //facebook. com/eapotapov