Имитация выполнения JS для чтения памяти кучи

У меня есть проблема, когда мне нужно посмотреть, занимает ли конкретный исходный код JavaScript много места в куче. В идеале я хотел бы иметь доступ к использованию памяти кучи и типу данных объектов в куче. Проблема в том, что, похоже, мне придется выполнить код, чтобы получить доступ к информации о распределении памяти в куче.

Код, однако, является вредоносным (атаки с помощью динамического распыления), поэтому я хотел бы избежать полного выполнения. Есть ли способ вместо этого смоделировать казнь? Я читал, что я могу использовать sbrk или API-хук (MSFT Detours), чтобы получить использование памяти для определенного процесса (обычно интерпретатора/движка JS), но похоже, что эти варианты использования фактически выполняли код.

РЕДАКТИРОВАТЬ: мне нужно было бы получить доступ к памяти кучи как часть конвейера для нескольких файлов JS, поэтому было бы идеально иметь информацию о памяти через команду или через API.


person pairwiseseq    schedule 01.10.2020    source источник


Ответы (2)


Если вы используете Chrome, вы можете использовать вкладку «Производительность» инструментов разработчика. Просто нажмите запись, обновите страницу или примените JS-скрипт: введите здесь описание изображения

Если вы хотите увидеть память JS, вы также можете использовать диспетчер задач. введите описание изображения здесь -> Дополнительные инструменты -> Диспетчер задач < img src="https://i.stack.imgur.com/yUhjf.jpg" alt="введите здесь описание изображения" />

person AdelmoMezzi    schedule 01.10.2020
comment
Извините, я должен был упомянуть, что мне нужно получить доступ к куче памяти как часть конвейера для нескольких файлов JS. Мне нужно будет получить доступ к информации о памяти через команду. Существует ли API, который предоставляет информацию о памяти V8 без доступа к пользовательскому интерфейсу браузера? Спасибо за Ваш ответ. - person pairwiseseq; 01.10.2020
comment
Попробуйте Shift + Esc или Диспетчер задач из 3 точек -> Дополнительные инструменты -> Диспетчер задач. В этом случае вы можете поместить память и память Javascript (V8). - person AdelmoMezzi; 01.10.2020
comment
Обратите внимание, что этот подход основан на фактическом выполнении всего кода, в отличие от того, что желает OP. - person jmrk; 02.10.2020

Что значит имитировать выполнение?

Вообще говоря: движки JavaScript созданы для выполнения JavaScript. Серьезно.

Для анализа вредоносного кода вы, вероятно, захотите как можно больше изучить песочницу/изолировать его. Теоретически обычного выполнения в браузере должно быть достаточно, однако на практике в браузерах иногда существуют ошибки безопасности, и вредоносный код пытается их использовать, поэтому для этой конкретной цели этого, вероятно, будет недостаточно.

Один из подходов состоит в том, чтобы добавить еще один уровень песочницы. Найдите себе интерпретатор JavaScript-на-JavaScript. Или выберите движок JavaScript без JIT-компиляции, скомпилируйте его в WebAssembly и запустите его из своего приложения. Затем вы можете проверить память экземпляра WebAssembly, на котором запущен вредоносный код; эта память предоставляется вашему приложению JavaScript как ArrayBuffer. (У меня нет конкретных рекомендаций для такого JS-движка, но я уверен, что они существуют.) Возможно, потребуется немного усилий, чтобы запустить такую ​​​​настройку (не уверен, не пробовал), но это d дать вам идеальную изоляцию от вредоносного кода.

person jmrk    schedule 01.10.2020
comment
Похоже, что Node/V8 предоставляет режим песочницы, используя свой VM API. V8, похоже, также поддерживает трассировку. Можно ли подключиться к приложению Node с помощью C++ и собирать статистику кучи, поскольку небезопасный исходный код выполняется в песочнице? - person pairwiseseq; 02.10.2020
comment
Да, как я уже сказал: по самой своей природе все движки JavaScript обеспечивают некоторую песочницу. Но если вы уже знаете, что код является вредоносным, я полагаю, вам понадобится еще один уровень безопасности. Приложения Node могут отслеживать собственное использование памяти; Я не знаю об хуках C++, для этого обратитесь к Node API. Однако: НЕ запускайте ненадежный или даже заведомо вредоносный JS в Node на своей реальной системе! Node, например. обеспечивает взаимодействие с файловой системой, которого нет у браузеров — вредоносный код может удалить или заразить содержимое вашего жесткого диска! Node создан для запуска кода, который вы написали сами и, следовательно, доверяете. - person jmrk; 02.10.2020