Хакер Коди Брошес (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 typebyte 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=#>