SlideShare a Scribd company logo
Игры с 
виртуализацией в 
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-does-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/pce 
github-репозиторий
«Вот же круто, а зачем?» 
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 functionality 
cpux86-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/readi 
ngs/i386/MOV.htm 
Opcode: 40 
Instruction: INC r16 
Description: 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://itsumma.ru 
eapotapov@itsumma.ru 
http://facebook.com/eapotapov

More Related Content

PPTX
Какой фреймворк нам нужен для Web? Денис Цыплаков
PPTX
мир без Jsp. thymeleaf 2.0
PDF
Как верстать сайты быстрее, чем их рисуют
PDF
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
PDF
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
PDF
Как верстать сайты быстрее чем их рисуют
PDF
Современный фронтенд за 30 минут.
PDF
Компонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
Какой фреймворк нам нужен для Web? Денис Цыплаков
мир без Jsp. thymeleaf 2.0
Как верстать сайты быстрее, чем их рисуют
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Как верстать сайты быстрее чем их рисуют
Современный фронтенд за 30 минут.
Компонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов

What's hot (19)

PDF
Кэширование в веб-приложениях: что? где? когда?
PDF
Бэкенд, фронтенд — всё смешалось (nodkz)
PDF
Демонизированный PHP - before it was cool
PDF
Сборка проектов с помощью ENB
PPTX
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
PDF
«​Масштабируемый DevOps​» Александр Колесень
PDF
Roman Romanovsky, Sergey Rak - "JavaScript в IoT "
PDF
dont badmouth mojo
PPT
Current State of Server Side JavaScript
PDF
Фронтенд разработка без боли
PDF
Javascript-фреймворки:
 должен остаться только один
PPTX
Вредные советы для разработчиков
PPTX
Обучение фронтенд разработке
PDF
Microsoft Edge и платформа веб-приложений в Windows 10 / Константин Кичинский...
PDF
Разработка API для большого, нагруженного сервиса
PDF
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
PDF
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
PDF
Mihail Zachepilo - WebAssembly powered Machine Learning
PPTX
Обзор интернет браузеров
Кэширование в веб-приложениях: что? где? когда?
Бэкенд, фронтенд — всё смешалось (nodkz)
Демонизированный PHP - before it was cool
Сборка проектов с помощью ENB
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
«​Масштабируемый DevOps​» Александр Колесень
Roman Romanovsky, Sergey Rak - "JavaScript в IoT "
dont badmouth mojo
Current State of Server Side JavaScript
Фронтенд разработка без боли
Javascript-фреймворки:
 должен остаться только один
Вредные советы для разработчиков
Обучение фронтенд разработке
Microsoft Edge и платформа веб-приложений в Windows 10 / Константин Кичинский...
Разработка API для большого, нагруженного сервиса
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Mihail Zachepilo - WebAssembly powered Machine Learning
Обзор интернет браузеров
Ad

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ad

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

  • 1. Игры с виртуализацией в JavaScript, или как я переписал эмулятор Евгений Потапов
  • 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 
  • 6. Доступные решения • 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/
  • 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)
  • 29. Как это работает – JSLinux Регистры
  • 30. Как это работает - JSLinux Организация памяти
  • 31. Как это работает - JSLinux Execution Loop строки 530-9664 (9134 строк кода) OUTER LOOP – считать OPCode EXECUTION LOOP – распарсить и исполнить
  • 34. Как это работает - JSLinux Exec Loop
  • 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
  • 37. Как это работает - JSLinux • Работа с портами
  • 38. Мучаем JSLinux • Интерфейс терминала как API между DOM-моделью и виртуальной машиной • В самой машине есть TCC/GCC/C++
  • 45. JSLinux - проблемы • Лицензия • Код не публичен
  • 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