Игры с виртуализацией в javascript, или как я переписал...

51
Игры с виртуализацией в JavaScript, или как я переписал эмулятор Евгений Потапов

Upload: ontico

Post on 21-Jun-2015

546 views

Category:

Internet


4 download

DESCRIPTION

Доклад Евгения Потапова на HighLoad++ 2014.

TRANSCRIPT

Page 1: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Игры с виртуализацией в JavaScript, или как я переписал эмуляторЕвгений Потапов

Page 2: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Евгений Потаповгенеральный директор компании ITSumma

более 1000 серверов на поддержке компании

120 миллионов уникальных посетителей ежедневно

Page 3: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Содержание• Предыстория• Существующие проекты• Принципы работы• Cпособы применения• Пути кастомизации• Заключение

Page 4: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Предыстория 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)

Disclaimer• Не программист (сейчас не

программист)• Вообще ничего не понимаю в

эмуляторах (знаю что есть и как работают)

• Могу быть не прав• Комментарии – Welcome

Page 6: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Доступные решения• 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)

JSLinux

http://bellard.org/jslinux/

Page 8: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

JSLinux• Автор Fabrice Bellard (LZEXE, FFmpeg,

QEMU)• 32-битный x86-совместимый CPU• 16 мегабайт оперативной памяти• Только консольный режим• Работа с буфером обмена• JS-разработка

Page 9: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

JSLinux - недостатки • Не развивается с 2012 года• Нет исходных кодов• Только текстовая консоль

Page 10: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

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)

Virtual x86

http://copy.sh/v86/

Page 12: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Virtual x86• x86, 16 бит• Opensource• Активно развивается• Полноценное взаимодействие с

виртуальной машиной через COM1

Page 13: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Virtual x86 - недостатки• Неполноценная реализация

Protected mode

Page 14: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Virtual x86 - подробнее• http://copy.sh/v86/

сайт проекта• https://github.com/copy/v86/

репозиторий

Page 15: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

PCE.JS• Эмулятор PCE скомпилированный

в LLVM• LLVM транслированный в

JavaScript с помощью Emscripten• Наиболее полноценная

реализация виртуальной машины

Page 16: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

PCE.JS

Page 17: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Недостатки PCE.JS• Не совсем “true” JavaScript-

решение• Не очень активно развивается

Page 18: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

PCE.JS подробнее• http://jamesfriend.com.au/pce-js/

сайт проекта (там есть даже MacOSX)

• https://github.com/jsdf/pcegithub-репозиторий

Page 19: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

«Вот же круто, а зачем?»

Front-End-разработка:

конвенциональное знание:- Не защитить данные- Не защитить алгоритмы

Page 20: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Защита данных. Доступные методы- Обфускация/минификация работы с данными- Шифрование/стеганография самих данных

проблема: место обработки все равно будет доступно, console.log

Page 21: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Защита алгоритмов. Доступные методы- обфускация кода – js-beautifier-ы достигли большого прогресса (см. слайды про реверс JSLinux)- использование ActionScript/Java итп. - декомпиляция

Page 22: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Защита алгоритмов

Интерпретатор собственного байткода

Основная задача защиты – не сделать анализ невозможным, но сделать его дорогим

Page 23: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Защита алгоритмов

Интерпретатор собственного байткода

Для понимания алгоритма требуется понимание всего байткода, а фактически – анализ эмулятора

Page 24: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Защита алгоритмов

Интерпретатор собственного байткода

- необходима реализация эмулятора- необходима реализация байткода- необходим транслятор в байткод

Page 25: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Защита алгоритмов

- LLVM + Emscripten?В конце концов - это опять же JavaScript

Page 26: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Защита алгоритмов

Интерпретатор собственного байткода

- необходима реализация эмулятораВиртуальная машина- необходима реализация байткодаМашинный код IBM PC- необходим транслятор в байткодASM/Знакомые языки высокого уровня

Page 27: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Что использовать?• Посмотрим на JSLinux• Оценим Virtual x86• Оценим PCE.JS

Page 28: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Как это работает? - JSLinux• Кодовая база:

https://github.com/levskaya/jslinux-deobfuscated

• Core functionalitycpux86-ta.js (9719 LOC)

Page 29: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Как это работает – JSLinuxРегистры

Page 30: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Как это работает - JSLinuxОрганизация памяти

Page 31: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Как это работает - JSLinux

Execution Loopстроки 530-9664 (9134 строк кода)OUTER LOOP – считать OPCodeEXECUTION LOOP – распарсить и исполнить

Page 32: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Как это работает - JSLinux

Page 33: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Как это работает - JSLinux

Page 34: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Как это работает - JSLinux

Exec Loop

Page 35: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Как это работает - 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)

Как это работает - JSLinux

Page 37: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Как это работает - JSLinux• Работа с портами

Page 38: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Мучаем JSLinux• Интерфейс терминала как API

между DOM-моделью и виртуальной машиной

• В самой машине есть TCC/GCC/C++

Page 39: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Мучаем JSLinux

Page 40: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Мучаем JSLinux

Page 41: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Мучаем JSLinux

Page 42: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Мучаем JSLinux

Page 43: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Мучаем JSLinux

Page 44: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Мучаем JSLinux

Page 45: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

JSLinux - проблемы• Лицензия• Код не публичен

Page 46: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Virtual x86• Наиболее перспективный с точки зрения

использования в наших целях проект• Уже готово взаимодействие с DOM-

моделью через COM1• Внутри Linux Busybox-а нет cc* (есть Lua)• Внутри DOS-а есть NASM

Page 47: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Virtual x86 - проблемы• Неполноценная реализация x86

Page 48: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

PCE.JS• Внутри – полноценный x86• Эмулятор не работает напрямую с

DOM-ом, фактически сверху еще один эмулятор с API C/C++, и модифицировать надо и его

Page 49: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

PCE.JS

Я пробовал перехват изменений в памяти – круто (можно написать и на Turbo Pascal-е), но большой overhead.

Page 50: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Заключение• Есть ли смысл?

С Virtual x86 есть практический смысл (при наличии настоящих задач).

• Куда двигаться? Создание VM и инфраструктуры непосредственно для разработки

• Да здравствуют безумства!

Page 51: Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Потапов (ITsumma)

Игры с виртуализацией в JavaScript, или как я переписал эмулятор

Евгений Потапов

http://[email protected]://facebook.com/eapotapov