Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Игры с 
виртуализацией в 
JavaScript, или как я 
переписал эмулятор 
Евгений Потапов
Евгений Потапов 
генеральный директор 
компании ITSumma 
более 1000 серверов на 
поддержке компании 
120 миллионов уникаль...
Содержание 
• Предыстория 
• Существующие проекты 
• Принципы работы 
• Cпособы применения 
• Пути кастомизации 
• Заключе...
Предыстория 
18.05.2011, https://news.ycombinator.com/item?id=2555349 
“Boot a linux kernel right inside your browser.” 
“...
Disclaimer 
• Не программист (сейчас не программист) 
• Вообще ничего не понимаю в эмуляторах 
(знаю что есть и как работа...
Доступные решения 
• JSLinux - http://bellard.org/jslinux/ 
• PCE.JS - http://jamesfriend.com.au/pce-js/ 
• Virtual x86 - ...
JSLinux 
http://bellard.org/jslinux/
JSLinux 
• Автор Fabrice Bellard (LZEXE, FFmpeg, 
QEMU) 
• 32-битный x86-совместимый CPU 
• 16 мегабайт оперативной памяти...
JSLinux - недостатки 
• Не развивается с 2012 года 
• Нет исходных кодов 
• Только текстовая консоль
JSLinux - подробнее 
• http://bellard.org/jslinux/tech.html 
Technical Notes 
• https://news.ycombinator.com/item?id=25553...
Virtual x86 
http://copy.sh/v86/
Virtual x86 
• x86, 16 бит 
• Opensource 
• Активно развивается 
• Полноценное взаимодействие с 
виртуальной машиной через...
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 ...
«Вот же круто, а зачем?» 
Front-End-разработка: 
конвенциональное знание: 
- Не защитить данные 
- Не защитить алгоритмы
Защита данных. Доступные методы 
- Обфускация/минификация работы с 
данными 
- Шифрование/стеганография самих данных 
проб...
Защита алгоритмов. Доступные методы 
- обфускация кода – js-beautifier-ы 
достигли большого прогресса (см. 
слайды про рев...
Защита алгоритмов 
Интерпретатор собственного байткода 
Основная задача защиты – не сделать 
анализ невозможным, но сделат...
Защита алгоритмов 
Интерпретатор собственного байткода 
Для понимания алгоритма требуется 
понимание всего байткода, а 
фа...
Защита алгоритмов 
Интерпретатор собственного байткода 
- необходима реализация эмулятора 
- необходима реализация байткод...
Защита алгоритмов 
- LLVM + Emscripten? 
В конце концов - это опять же 
JavaScript
Защита алгоритмов 
Интерпретатор собственного байткода 
- необходима реализация эмулятора 
Виртуальная машина 
- необходим...
Что использовать? 
• Посмотрим на JSLinux 
• Оценим Virtual x86 
• Оценим PCE.JS
Как это работает? - JSLinux 
• Кодовая база: 
https://github.com/levskaya/jslinux-deobfuscated 
• Core functionality 
cpux...
Как это работает – 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...
Как это работает - JSLinux
Как это работает - JSLinux 
• Работа с портами
Мучаем JSLinux 
• Интерфейс терминала как API между 
DOM-моделью и виртуальной 
машиной 
• В самой машине есть TCC/GCC/C++
Мучаем JSLinux
Мучаем JSLinux
Мучаем JSLinux
Мучаем JSLinux
Мучаем JSLinux
Мучаем JSLinux
JSLinux - проблемы 
• Лицензия 
• Код не публичен
Virtual x86 
• Наиболее перспективный с точки зрения 
использования в наших целях проект 
• Уже готово взаимодействие с DO...
Virtual x86 - проблемы 
• Неполноценная реализация x86
PCE.JS 
• Внутри – полноценный x86 
• Эмулятор не работает напрямую с 
DOM-ом, фактически сверху еще один 
эмулятор с API ...
PCE.JS 
Я пробовал перехват изменений в 
памяти – круто (можно написать и на 
Turbo Pascal-е), но большой overhead.
Заключение 
• Есть ли смысл? 
С Virtual x86 есть практический смысл 
(при наличии настоящих задач). 
• Куда двигаться? 
Со...
Игры с виртуализацией в JavaScript, или как я 
переписал эмулятор 
Евгений Потапов 
http://itsumma.ru 
eapotapov@itsumma.r...
Upcoming SlideShare
Loading in …5
×

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

1,698 views

Published on

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

Published in: Internet
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Игры с виртуализацией в JavaScript, или как я переписал эмулятор Евгений Потапов
  2. 2. Евгений Потапов генеральный директор компании ITSumma более 1000 серверов на поддержке компании 120 миллионов уникальных посетителей ежедневно
  3. 3. Содержание • Предыстория • Существующие проекты • Принципы работы • Cпособы применения • Пути кастомизации • Заключение
  4. 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. 5. Disclaimer • Не программист (сейчас не программист) • Вообще ничего не понимаю в эмуляторах (знаю что есть и как работают) • Могу быть не прав • Комментарии – Welcome 
  6. 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/
  7. 7. JSLinux http://bellard.org/jslinux/
  8. 8. JSLinux • Автор Fabrice Bellard (LZEXE, FFmpeg, QEMU) • 32-битный x86-совместимый CPU • 16 мегабайт оперативной памяти • Только консольный режим • Работа с буфером обмена • JS-разработка
  9. 9. JSLinux - недостатки • Не развивается с 2012 года • Нет исходных кодов • Только текстовая консоль
  10. 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 Описание работы
  11. 11. Virtual x86 http://copy.sh/v86/
  12. 12. Virtual x86 • x86, 16 бит • Opensource • Активно развивается • Полноценное взаимодействие с виртуальной машиной через COM1
  13. 13. Virtual x86 - недостатки • Неполноценная реализация Protected mode
  14. 14. Virtual x86 - подробнее • http://copy.sh/v86/ сайт проекта • https://github.com/copy/v86/ репозиторий
  15. 15. PCE.JS • Эмулятор PCE скомпилированный в LLVM • LLVM транслированный в JavaScript с помощью Emscripten • Наиболее полноценная реализация виртуальной машины
  16. 16. PCE.JS
  17. 17. Недостатки PCE.JS • Не совсем “true” JavaScript-решение • Не очень активно развивается
  18. 18. PCE.JS подробнее • http://jamesfriend.com.au/pce-js/ сайт проекта (там есть даже MacOSX) • https://github.com/jsdf/pce github-репозиторий
  19. 19. «Вот же круто, а зачем?» Front-End-разработка: конвенциональное знание: - Не защитить данные - Не защитить алгоритмы
  20. 20. Защита данных. Доступные методы - Обфускация/минификация работы с данными - Шифрование/стеганография самих данных проблема: место обработки все равно будет доступно, console.log
  21. 21. Защита алгоритмов. Доступные методы - обфускация кода – js-beautifier-ы достигли большого прогресса (см. слайды про реверс JSLinux) - использование ActionScript/Java итп. - декомпиляция
  22. 22. Защита алгоритмов Интерпретатор собственного байткода Основная задача защиты – не сделать анализ невозможным, но сделать его дорогим
  23. 23. Защита алгоритмов Интерпретатор собственного байткода Для понимания алгоритма требуется понимание всего байткода, а фактически – анализ эмулятора
  24. 24. Защита алгоритмов Интерпретатор собственного байткода - необходима реализация эмулятора - необходима реализация байткода - необходим транслятор в байткод
  25. 25. Защита алгоритмов - LLVM + Emscripten? В конце концов - это опять же JavaScript
  26. 26. Защита алгоритмов Интерпретатор собственного байткода - необходима реализация эмулятора Виртуальная машина - необходима реализация байткода Машинный код IBM PC - необходим транслятор в байткод ASM/Знакомые языки высокого уровня
  27. 27. Что использовать? • Посмотрим на JSLinux • Оценим Virtual x86 • Оценим PCE.JS
  28. 28. Как это работает? - JSLinux • Кодовая база: https://github.com/levskaya/jslinux-deobfuscated • Core functionality cpux86-ta.js (9719 LOC)
  29. 29. Как это работает – JSLinux Регистры
  30. 30. Как это работает - JSLinux Организация памяти
  31. 31. Как это работает - JSLinux Execution Loop строки 530-9664 (9134 строк кода) OUTER LOOP – считать OPCode EXECUTION LOOP – распарсить и исполнить
  32. 32. Как это работает - JSLinux
  33. 33. Как это работает - JSLinux
  34. 34. Как это работает - JSLinux Exec Loop
  35. 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
  36. 36. Как это работает - JSLinux
  37. 37. Как это работает - JSLinux • Работа с портами
  38. 38. Мучаем JSLinux • Интерфейс терминала как API между DOM-моделью и виртуальной машиной • В самой машине есть TCC/GCC/C++
  39. 39. Мучаем JSLinux
  40. 40. Мучаем JSLinux
  41. 41. Мучаем JSLinux
  42. 42. Мучаем JSLinux
  43. 43. Мучаем JSLinux
  44. 44. Мучаем JSLinux
  45. 45. JSLinux - проблемы • Лицензия • Код не публичен
  46. 46. Virtual x86 • Наиболее перспективный с точки зрения использования в наших целях проект • Уже готово взаимодействие с DOM-моделью через COM1 • Внутри Linux Busybox-а нет cc* (есть Lua) • Внутри DOS-а есть NASM
  47. 47. Virtual x86 - проблемы • Неполноценная реализация x86
  48. 48. PCE.JS • Внутри – полноценный x86 • Эмулятор не работает напрямую с DOM-ом, фактически сверху еще один эмулятор с API C/C++, и модифицировать надо и его
  49. 49. PCE.JS Я пробовал перехват изменений в памяти – круто (можно написать и на Turbo Pascal-е), но большой overhead.
  50. 50. Заключение • Есть ли смысл? С Virtual x86 есть практический смысл (при наличии настоящих задач). • Куда двигаться? Создание VM и инфраструктуры непосредственно для разработки • Да здравствуют безумства!
  51. 51. Игры с виртуализацией в JavaScript, или как я переписал эмулятор Евгений Потапов http://itsumma.ru eapotapov@itsumma.ru http://facebook.com/eapotapov

×