Ассемблер и Си для Хакера #3. Как уменьшить размер *.EXE файла.

Поделиться
HTML-код
  • Опубликовано: 24 дек 2024

Комментарии • 34

  • @-wx-78-
    @-wx-78- 9 месяцев назад +8

    Можно не вызывать ExitProcess а просто вернуться (с помощью ret в асме), это ещё изрядно подрежет размер. Хотя в старых виндах (XP точно) такой трюк иногда оставлял программу в памяти: Kernel32!BaseThreadInitThunk после возврата функции потока вызывает ExitThread - а винда в дополнение к основному потоку создаёт ещё штук пять для своих нужд, они и заставляли процесс не завершаться. 😉
    18:18 А релоки-то зачем? /FIXED и забыть про них.
    Pelles C обскакал MASM потому что последний использует invoke и стандартный трамплин, например из User32.Lib:
    call _MessageBoxA@16

    _MessageBoxA@16:
    jmp [__imp__MessageBoxA@16]; имп находится в Import Address Table
    а Pelles C делает call [__imp__MessageBoxA@16] напрямую.
    В принципе можно отгрызть ещё нимношка если грохнуть Import Lookup Table в импорте и перетащить IAT к Import Directory Table (она начинается с нужного IAT нуля, так как ILT уже нет), но это ручками.
    Помнится один товарищ изгалялся ради компактного PE, код и данные совал в его заголовки. Было весело.

    • @firststepsforward
      @firststepsforward  9 месяцев назад

      ExitProcess - да, так и есть. В ролике на тему диалогового окна об этом будет.

  • @theflameflare
    @theflameflare 4 месяца назад

    Разъёб, обожаю такие видосы и статьи, которые по сути не предоставляют какого-то фундаментального знания, но дают знание о том, что это знание существует)

    • @firststepsforward
      @firststepsforward  4 месяца назад

      Спасибо за понимание всей глубины наших глубин!

  • @iliyak469
    @iliyak469 2 месяца назад

    Когда автор упомянул, что линковщик ассемблера - чисто консольная утилита, у меня настроение махом подскочило, хотя я сижу на python.😅😅

    • @firststepsforward
      @firststepsforward  2 месяца назад

      Линкеры везде консольные... Не врубился в шутку юмора. Винда тоже с консолью старается дружить. Один PowerShell чего стоит.
      Это всё конечно не полноценный терминал, но хоть что-то.
      Благодарю за интерес к каналу!

    • @iliyak469
      @iliyak469 2 месяца назад

      Но что касается терминала, я сижу в командных терминалах ОС, то есть готовыми сборками, где консоль есть, не пользуюсь.

    • @firststepsforward
      @firststepsforward  2 месяца назад

      WSL опять-таки, если уж на то пошло...

  • @AMith-lv2cv
    @AMith-lv2cv 10 месяцев назад +1

    🔥просто шик

  • @IVAR-uq6qz
    @IVAR-uq6qz 10 месяцев назад +1

    👍👍👍

  • @madeinussr1983
    @madeinussr1983 4 месяца назад

    Линковщики были переименованы. В видео LINK.EXE весит 852 кб, LINK1.EXE 462 кб (10:30), а в сборке с сайта наоборот. А в папке Linkers снова как в видео. Где верно?

    • @firststepsforward
      @firststepsforward  4 месяца назад

      В сборке, которую Вы скачали: FASM64\masm32\BIN\LINKERS
      ead.me - там всё подробно написано и правильно. Там же лекция- справочник.

  • @norskiy9765
    @norskiy9765 19 дней назад

    А у меня при запуске мелкой программы происходит ошибка при запуске приложения(0xc0000018), из-за чего может такое возникнуть? Пишу на Винде 7

    • @firststepsforward
      @firststepsforward  19 дней назад

      Если вы про SmallestProg.tpl, то поиграйтесь с настройками Linker: ALIGN:16. Увеличивайте значение, но чтобы было кратно 4-м. Размер будет немного больше, но надёжность вырастет.

  • @igorchesnokov482
    @igorchesnokov482 8 месяцев назад

    4096 - это не для процессора, это размер кластера на диске 4 килобайта (минимальная область на диске для хранения информации). Это чтобы файл быстрее грузился

    • @firststepsforward
      @firststepsforward  8 месяцев назад +2

      Благодарю.

    • @igorchesnokov482
      @igorchesnokov482 8 месяцев назад +3

      @firststepsforward , а выравнивание по процессору - это по разрядности его регистров (8,16,32,64) - это то, как поля структур данных размещаются в памяти. Это тоже необходимо для ускорения обработки данных, чтобы процессор загрузил только то, что ему надо и не вычленял свои данные из набора. Например, если у тебя выравнивание по разрядности 64, то даже поле в структуре данных, объявленное, как байт будет занимать в памяти 8 байт - чтобы сразу эти 8 байт (64 бит) загрузить в регистр процессора и больше не возиться с ними. А ещё полезнее, когда процессор записывает обратно данные в правильно выровненную структуру. Тогда ему не надо перед записью в память загружать имеющиеся в ней данные объединять со своими данными. Но это все относится к компилятору C/C++. А ассемблере такое выравнивание надо делать самому, руками.

  • @КириллИванов-м8м
    @КириллИванов-м8м 10 месяцев назад

    Жжёшь!

  • @СергейРатников-к4ч
    @СергейРатников-к4ч 9 месяцев назад

    У меня проект билдится с предупреждениями:
    LINK2 : warning LNK4108: /ALIGN specified without /DRIVER or /VXD; image may not run
    LINK2 : warning LNK4078: multiple ".text" sections found with different attributes (40000040)
    Но при запуске EXE вылетает окно с ошибкой:
    "Ошибка при запуске приложения (0xc0000018).
    Пробовал на 3х разных компах под Win7. Везде одинаково.
    Подскажите пожалуйста, что не так?

    • @firststepsforward
      @firststepsforward  9 месяцев назад +1

      Пробуйте в Project options проекта изменять значение ALIGN:16 в сторону увеличения на кратное 16 или попробуйте другим линкером (возможно 3 варианта: LINK.EXE, LINK1.EXE, LINK2.EXE).
      Если проект делали на основе SmallestPtog.tpl, то в текстовом файле проекта будут кой-какие подсказки.
      Два предупреждения (warning) при сборке проекта с такими настройками будут вываливаться всегда.
      Не обращайте внимания на предупреждения, только на ошибки.
      В общем - поиграйте с настройками.
      В Windows 7 не тестировал. У меня стоит Windows 10 LTSC x64. и Windows 11 21H2 x64

    • @СергейРатников-к4ч
      @СергейРатников-к4ч 9 месяцев назад

      @@firststepsforward Спасибо большое!
      Смена линкера не помогла, но с ALIGN:48 сработало. Размер файла конечно больше получился: 1024.

    • @firststepsforward
      @firststepsforward  9 месяцев назад

      Ок!

  • @SonicegorsanCode
    @SonicegorsanCode 5 месяцев назад

    6:25 Автор настолько увлёкся урезанием и сокращением, что обрезал последнее поле с "Make", где "Готово" нажимается :D

  • @creepymuffin2351
    @creepymuffin2351 6 месяцев назад

    Судя по всему команда jmp аналогична goto из других языков и ассемблеров

    • @firststepsforward
      @firststepsforward  6 месяцев назад

      Да. Точнее будет: goto аналогична jmp. При организации семантики Си именно как обеспечение возможности сохранить функции jmp, добавили goto .

  • @avismax
    @avismax 9 месяцев назад

    Шрифты меньше надо делать...

  • @jirzemli3061
    @jirzemli3061 10 месяцев назад

    скинули лишнее, никакого "ажирения" :)

    • @firststepsforward
      @firststepsforward  10 месяцев назад +2

      "Я просто беру камень и отсекаю всё лишнее..." ;)