Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > FASM: убрать Stub


Автор: p0s0l 14.2.2004, 21:11
Мне надо получить PE-Exe минимального размера, делаю всё в одной секции, но еще бы хотелось убрать stub... Пишу в FASM'е. Может есть какая-нибудь директива для убирания заглушки ? Пусть e_lfanew в Dos-хэдере ссылалась бы на байт, сразу идущий за этим самым дос-хэдером...

Автор: oleg1973 14.2.2004, 22:05
там можно свой стуб.ехе втыкат
если его 0 длинны сделать smile.gif
или лучше сделать вот так smile.gif

mzshit:
dw 'MZ'
times 30 db 0
times 01ch db 0
lp:
dd peshit
; times 100 db 0
peshit:
dd 'PE' ; signature byte
dw 014ch ; cpu type
dw 1 ; num of object
dd 0ffffffffh ; time/data
dd 0 ; pointer to COFF table
dd 0 ; COFF table size
dw assend-ass ; NT header size
dw 0818eh ; Flags
ass:
dw 010bh ; Magic
db 0 ; link major
db 0 ; link minor
dd 0 ; size of code
dd 0 ; size of init data
dd 0 ; size of Uninit data
dd 1000h+352;+100 ; entry point RVA
dd 0 ; Base of code
dd 0 ; Base of data
dd 0400000h ; Image base
dd 1000h ; object align
dd 200h ; file align
dw 1 ; OS major
dw 0 ; OS minor
dw 0 ; user major
dw 0 ; user minor
dw 3 ; subsys major
dw 0ah ; subsys minor
dd 0 ; reserved
dd 2000h ; image size
dd codes-mzshit ; header size
dd 0 ; file chksum
dw 2 ; subsystem
dw 0 ; dll flags
dd 1000h ; stack res size
dd 1000h ; stack commit size
dd 10000h ; heap reserve size
dd 0 ; heap comit size
dd 0 ; loader flags
dd 10h ; num of RVA and size
times 22 dd 0
dd 0,0
dd 0
dd 0
dd 0,0
dd 0,0
dd 0,0
assend:

objentry:
db '.section' ;obj name max 8 char
dd 1 ; virtual size
dd 1000h ; section RVA
dd 82 ; physical size
dd 82 ; physical offset
dd 0 ; pointer to reloc
dd 0 ; pointer to linenum
dw 0 ; num of reloc
dw 0 ; num of linenum
dd 0e0000060h ; characteristic

codes:
ret
endfile:

Автор: p0s0l 15.2.2004, 13:50
Так не очень удобно... Разобрался - то же самое можно сделать, но легче:
В директиве format PE надо добавить on "имя файла заглушки". У меня так:
format PE GUI 4.0 on 'stub0.exe'
И если файл-заглушка нулевой длины, то всё ок, в результате в скомпонаванном файле "PE" будет начинаться не с 80h, а с 40h.
Интересно то, что если создавать свой файл-заглушку размером 64 байта (только дос-хэдер) и все поля выставлять в нем правильно (можно даже отрезать первые 64 байта от PE-файла, полученного способом с файлом нулевой длины), то FASM глючит при ассемблировании...

Автор: oleg1973 15.2.2004, 16:22
p0s0l
Цитата
format PE GUI 4.0 on 'stub0.exe'

ну я это и имел ввиду smile.gif
а нафига тебе все это?
лепиш самый маленький ехе?

Автор: p0s0l 16.2.2004, 12:09
Цитата
там можно свой стуб.ехе втыкат
если его 0 длинны сделать

Не сразу доперло, что ты про это и говорил...
А зачем тогда тот, второй способ ? Геморрой лишний...
Цитата
а нафига тебе все это?
лепиш самый маленький ехе?

Да, всё что можно укорачиваю.

Автор: oleg1973 16.2.2004, 13:23
p0s0l
если делать заголовок файла руками то можно еще место сэкономить
к примеру тут
times 22 dd 0
dd 0,0
dd 0
dd 0
dd 0,0
dd 0,0
dd 0,0
тут описания секций
по умолчанию втыкается
а тебе то и надо тока описание 1 секции

Автор: p0s0l 16.2.2004, 13:45
Цитата
тут описания секций
по умолчанию втыкается
а тебе то и надо тока описание 1 секции

Дак и так, у меня только 1 секция и описывается... Я не очень понял про что ты...
Или ты имеешь в виду, что вместо
dd 10h ; num of RVA and size
можно поставить
dd 02h
Т.е. будут только директории экспорта и импорта ?

Автор: oleg1973 16.2.2004, 22:12
p0s0l
именно про это
оставь тока секцию кода да и все smile.gif
можно еще с выравниванием побалватся

Автор: p0s0l 17.2.2004, 15:57
Ладно, но что-то так не получается... У тебя есть работающий пример ? А то как я делаю, пишет "error executing program"...
И еще: как описать импорт ? Ранее работавшие макросы library и import не работают...
И что с выравниванием ? В MSDN сказано, что оно не может быть меньше 512 (что и используется при ассемблировании в FASM)...

Автор: oleg1973 17.2.2004, 20:52
p0s0l
обманули в мсдн smile.gif
вот 2 файла
1) 450 байт месаджбокс выводит , должно везде работать там поиск LoadLibary в кернеле и так далее
2) 173 smile.gif байта , ниче не делает там RET стоит и все
ну и исходники весьма изврашенные smile.gif
кстати первый файл можна ужать байт на 10-20 ,там процедура у меня поиска адреса функ левенькая smile.gif

проверял на ХР
на 9х может и неработать, там дествительно выравнивание важно

Автор: p0s0l 17.2.2004, 21:50
thnx, закачал, буду пробовать!

Автор: oleg1973 18.2.2004, 14:56
p0s0l
ну че работает?

Автор: p0s0l 18.2.2004, 19:30
Ага, все работает.
Прикольно ты наворотил перекрывающиеся заголовки вперемешку с данными!
Thanx за пример!

Автор: p0s0l 19.2.2004, 18:30
Цитата
кстати первый файл можна ужать байт на 10-20 ,там процедура у меня поиска адреса функ левенькая

Ужал Hello All до 267 байтsmile.gif

Автор: oleg1973 19.2.2004, 21:11
p0s0l
крута smile.gif
на хацкер.ру подобная дисскуссия smile.gif
но они от нас далеко отстали smile.gif
я им там линк сюда оставил шас прибегут smile.gif

Автор: p0s0l 21.2.2004, 00:19
Для кучи уж пихаю последний вариант - заюзаны почти все ненужные поля хэдеров... жаль только, что вся эта интересная фишка не работает под Win9x...


Автор: Chemiker 22.2.2004, 13:29
Люди !!!

У меня файл формата PE выыодит окно с МессагеБоксом, потом звершается. В досе запускается нормально - ДОС пишет: Program too big to fit in memory. Между MZ и PE всего два байта, есть таблица импорта, а размер этого чуда всего 188 байтов !!!

Пока.

-------------------------------------
PE-188-Bytes

Автор: oleg1973 22.2.2004, 15:49
Chemiker
файл то где?smile.gif небось у нас идею спер smile.gif

Автор: Chemiker 22.2.2004, 18:21
Файлик дома, и ничего я не пёр, просто проверил одну гипотезу и она оказалась верна, с ещё одним предположением можно сделать меньше чем 166 байт (есть пока эксперементальная версия).

А пока релиз 188.

Автор: Sardar 22.2.2004, 21:18
Цитата
Для кучи уж пихаю последний вариант - заюзаны почти все ненужные поля хэдеров... жаль только, что вся эта интересная фишка не работает под Win9x...

Не качается файл... bored.gif

Автор: Serzh 22.2.2004, 22:59
Цитата(p0s0l @ 21.2.2004, 00:19)
Для кучи уж пихаю последний вариант - заюзаны почти все ненужные поля хэдеров... жаль только, что вся эта интересная фишка не работает под Win9x...

а у меня не выполняеться... sad.gif

Автор: Sardar 23.2.2004, 01:32
Весело под Win98SE окошки появляются и тут же убиваются... прога остановилась от нехватки памяти.

Автор: p0s0l 23.2.2004, 16:48
Цитата
У меня файл формата PE выыодит окно с МессагеБоксом, потом звершается. В досе запускается нормально - ДОС пишет: Program too big to fit in memory. Между MZ и PE всего два байта, есть таблица импорта, а размер этого чуда всего 188 байтов !!!

Пока

Просто задан адрес MessageBox'а ?...

Автор: p0s0l 23.2.2004, 16:54
Serzh,Sardar - вот в этом и беда, Win9x более строгие к формату файла...

Автор: p0s0l 23.2.2004, 19:25
Торможу на счет этого:
Цитата
Просто задан адрес MessageBox'а ?...

Не обратил внимания на
Цитата
есть таблица импорта

У меня пока наспех получается 195.. Покажи исходник ?

Автор: p0s0l 23.2.2004, 20:27
А хотя... не доглядел немного - вот тоже 188 байт...

Автор: Serzh 23.2.2004, 20:38
Цитата(p0s0l @ 23.2.2004, 16:54)
Serzh,Sardar - вот в этом и беда, Win9x более строгие к формату файла...

дык в том то и дело, что у меня w2k

Автор: Chemiker 24.2.2004, 11:07
Уже есть рабочая версия в 166 байт, будем ещё уменьшать. smile.gif Как быстро меня догоняют !!! Скачал ваш 188, буду смотреть. Скоро здесь свой размещю, только в текстовом виде (байты), а то я не могу файлы к сообщению цеплять.

Автор: p0s0l 25.2.2004, 07:10
Chemiker, зарегистрируйся, и при ответе в форум жми "ОТВЕТИТЬ",
тогда вроде сможешь прикреплять файлы...

Ты хоть скажи хотя бы идею, куда копать, как до 166 байт уменьшил ?

Автор: Chemiker 26.2.2004, 18:52
Потом всё увидите, буду работать по умньшению, результат наверно в конце недели.

Автор: p0s0l 26.2.2004, 19:19
Дак так не интересно... Хочется самому попробовать... sad.gif

Автор: Chemiker 27.2.2004, 11:56
Достигнут результат, наверно уже предельный, ну дальше не куда просто, размер файла 153 байта, выводит мессагебокс, есть импорт. 3 марта я помещю его сюда для всеобщего ознакомления. Пока проверялось только на XP.

153 байта !!!

Автор: p0s0l 1.3.2004, 11:48
Я понял как это сделать smile.gif Надо только поизвращаться немного...
В FileHeader'е есть поле размера OptionalHeader-а, если его уменьшить, то можно засунуть SectionHeader в OptionalHeader...

Автор: Sardar 1.3.2004, 14:11
Извините за офтоп, но по моему это полный изврат!!! biggrin.gif Выигрывая несколько байтов прога теряет переносимость между виндами. На текущем этапе ваши достижения не работают под Win98, а вдруг и на следующих версиях ничего работать не будет. И все это из-за нескольких байтoв...

Автор: Chemiker 1.3.2004, 20:40
Согласен с вами, но это уже спортивный интерес - на рекорд, чисто академическое развлечение. p0s0l, ты прав, у меня он именно там, я такой извращенец !!! Но это было не легко, кстати кроме этого ещё полно всяких ухищрений и тонкостей.

Скоро на хакер.ру выйдет статья про этот файлик.

http://www.xakep.ru

Автор: oleg1973 1.3.2004, 20:53
Chemiker
копирайты не забуть smile.gif

Автор: Chemiker 2.3.2004, 10:00
Моя статья и файлик там (как server2000):

http://www1.xakep.ru/post/21399/default.asp

Автор: p0s0l 2.3.2004, 15:09
Эх, не успел немного, хотелось до тебя выложить свой вариант...
У меня немного по-другому устроено, и вместо "MZ..PE" выводится "Hello!", но весит 152...
Хотя есть большое подозрение, что можно на 8 байт уменьшить, правда уже влом всё пересматривать...

Автор: Chemiker 2.3.2004, 17:32
Я в шоке почти, всего на один байт !!! Зато у меня MZ и PE очень близко, но придётся ещё покопать и уменьшить, мне кажется что теоретически можно скинуть ещё примерно пару байтов, но будет уже энтропия. И так близко уже.

Автор: p0s0l 2.3.2004, 22:27
Chemiker, я вообще-то имел в виду то, что пришли примерно к одному и тому же результату. Но если подумать, то тут вариантов не так уж и много, т.к. SectionHeader больше некуда впихнуть (пихал почти во все места, нигде не подходит), вот только с ImportDescriptor'ом я не сильно пробовал, а у него в конце файла выставляется хвост из 8 байт, которые вполне вероятно можно обрубить, если засунуть этот дескриптор в другое место, т.е. размер был бы 144...

Автор: 4udo 21.4.2006, 21:03
Очень рульный пост!!!!!
Только по-мимо "Hello World" можно же на Ассемблере ваять крохи и с фантастическими фичами smile 
Пример цепляю.Кстати обратите внимание на функции , господа знатоки - я искал и не нашел(нет ни импорта ни экспорта).Наверно очень плохо искал?????????............ 
Здесь и GUI , и midi и icon.Жутко интересно - как это все стряпается в 50кб??? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)