Хакер Коди Брошес (Cody Brocious) выложил маленькую демку, которая демонстрирует принцип «суперупаковки JS» (WebGL) в один самораспаковывающийся файл PNG.

http://demoseen.com/windowpane/fl0wer.png.html

«Суперупаковка» в этом случае делает хак с браузером: файл PNG изначально воспринимается браузером как HTML-документ (из-за своего расширения .html), далее он загружает содержимое в тег <img>, заставляя интерпретировать его как PNG. После этого браузер передаёт «изображение» для рендеринга в canvas, и тогда извлекается и запускается на исполнение JS-код, встроенный в PNG.

Кроме потенциальной угрозы для безопасности, такой метод приводит к утечке памяти, по крайней мере, в Chrome.

Суть принципа суперупаковки в том, что формат PNG предусматривает указание chunk type.

4 byte length
4 byte chunk type
 byte chunk data
4 byte CRC

При этом chunk type может быть произвольным.

4 byte length
4 byte "jawh" (Just Another WebGL Hacker (TM))
X byte *bootstrap*
4 byte CRC

В результате можно спокойно упаковать программу (*bootstrap*) в контейнер PNG.

<img onload=with(document.createElement('canvas'))p=width=4968,(c=getContext('2d')).drawImage(this,e='',0);
while(p)e+=String.fromCharCode(c.getImageData(0,0,p,1).data[p-=4]);
(t=top).eval(e) src=#>



Оставить мнение