Как было дело давным-давно я увидел демку Micropolis (вы тоже можете глянуть ее на Youtube), и она меня покорила. Там был целый город, пусть квадратный, но все же. Там была река, мосты, поезд, воздушный транспорт. Робот. Нет, РОБОТ. И он даже шагал. Под музыку. И все это в 4 килобайтах. Да, не мегабайтах, и даже не 64, а именно 4. Тогда я не смог понять, как это работает, но вот недавно решил разобраться.
Естественно, первым слоем нужно было снять упаковку - так как очевидно, что данное демо запаковано. Но оказалось, что делать этого не нужно - так как запакована она очень хитрым способом. Вся демка это просто файл .bat длиной 4092 байта. Естественно всякую фигню в начале Windows пропустит ибо таких команд у него и в помине не было, а потом он перейдет в конец и увидит обычный батник - который копирует демку во временный каталог и распаковывает ее стандартной Windows-программой Expand, в результате чего мы получаем файл длиной 9571 байт, уже ничем не упакованный.
Но если мы попытаемся его запустить, ничего не заработает, потому что демка была написана во времена Windows XP SP1, и ориентируется именно на него. Поэтому в процессе декомпиляции я немного изменил ее, адаптировав под современные реалии:
- Импорты. Как обычно все демо импортируют нужные им функции. Обычно не по именам, так как это, очевидно, занимает слишком много места. Новые демо чаще берут 32-битный хэш от нужных имен функций, и сами настраивают импорт используя функцию GetProcAddress. Однако здесь авторы пошли еще…