маленький HelloWorld

Тема в разделе "WASM.A&O", создана пользователем badcode, 20 авг 2005.

  1. Nothing

    Nothing New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2003
    Сообщения:
    139
    Адрес:
    Russia
    Самый маленький мой hello world, занимал 2 байта: "EB 80", зато ему надо было скормить некую хитрую командную строку. :derisive:. Прыжков в 1 байт не бывает (кроме RET - но это просто выход, программа так и не напишет строку на экран), поэтому меньше сделать вроде как нельзя. Или у кого-то есть 1-байтовый вариант который реально выводит строку на экран???



    Эх помнится году так в 1992 я этим всем увлекался, коллекционировал, что-то сам писал... Было дело, надо только архивы найти... Вот например, самовыводящаяся программа из ascii-символов: VZNNXPH555750K4PP5DM3D01D0X5AC3D21D2XP559550K4

    (ввести одной строкой в .com и запустить)

    Кто сможет короче? :derisive:
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Nothing



    РулеЗЗ :) Прямо карпускулярно-волновой дуализм какой-то :)
     
  3. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Nothing

    WinXP - из под cmd не работает, из под command работает, и добавляет значек в конец <font size=9>☻</font><!--size-->. Весьма впечатляет однако.
     
  4. GPcH

    GPcH Member

    Публикаций:
    0
    Регистрация:
    2 авг 2004
    Сообщения:
    136


    Может расскажешь как такой скомпилял? Или руками сделал в hiew?
     
  5. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Тот на 133 не пашет под NT2k (после user32 надо .dll добавить), в аттаче чей-то на 188 - кажется везде работает



    [​IMG] 216448326__HELLO_imp4.ASM
     
  6. badcode

    badcode New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2005
    Сообщения:
    13
    Адрес:
    Russia
    2GPcH

    в Hex Workshop (там есть классная фича - просмотр структур)



    bogrus

    пытался добавить, без увеличения размера не получается :dntknw:
     
  7. badcode

    badcode New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2005
    Сообщения:
    13
    Адрес:
    Russia
    bogrus

    Получиось :) работает?

    правда, пришлось урезать сообщение...

    P.S. пока код писал, столкнулся с проблемой:

    почему

    jmp [xxxxx];

    не заменяет

    call [xxxxx];

    ret;

    ? не пойму, вроде должно же работать..ю

    [​IMG] _780209599__HelloW.exe
     
  8. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Работает :), ты имеешь ввиду jmp [MessageBox] почему не заменяет?
     
  9. badcode

    badcode New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2005
    Сообщения:
    13
    Адрес:
    Russia
    да. пробовал, message не появляется, ошибка вылазит
     
  10. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Стек "ломается", если запушить ещё адрес возврата перед вызовом MessageBox, то параметры в стеке станут на свои места и все сработает, типа такого:
    Код (Text):
    1.             push    0
    2.             mov     eax,Hi
    3.             push    eax
    4.             push    eax
    5.             push    0
    6.             push    @f
    7.             jmp     [MessageBox]
    8. @@:         ...     ; ret
    Но это фигня ещё больше места займет, если RET надо сократить, то 3 байта можно получить таким способом (2B это у тебя расстояние от Hi, который уже в eax до MessageBox):
    Код (Text):
    1. 0040004E         FF50 2B                  CALL    [EAX+2B]
    2. 00400051         90                       NOP
    3. 00400052         90                       NOP
    4. 00400053         90                       NOP
    5. 00400054         C3                       RETN
     
  11. badcode

    badcode New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2005
    Сообщения:
    13
    Адрес:
    Russia
    Точно! что-то я сглупил :)
     
  12. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Совет: ради супер маленького размера надо написать программу на машинных кодах :)
     
  13. lamer19

    lamer19 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2006
    Сообщения:
    24
    Печать строки "Hello World!" в 16 байт без использования командной строки
    Если нельзя использовать командную строку то надо использовать переменные среды окружения
    В окружении устанавливаем ручками в командном интерпретаторе
    set 0=Hello World!
    и выводим его следующим кодом 16 байт!
    Код (Text):
    1. .model tiny
    2. .radix 16
    3. .286
    4. .Code
    5. org 2c
    6. Envir   label   word
    7. .Startup
    8.     mov ax,Envir
    9.     push    ax
    10.     pop ds
    11.     mov si,3
    12. NextChar:
    13.     lodsb
    14.     int 29h
    15.     test    al,al
    16.     jnz NextChar
    17. @@Ret:
    18.     ret
    19. end
    С уважухой Андрей Бертыш
    :)
     
  14. lamer19

    lamer19 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2006
    Сообщения:
    24
    Но на этом трюки не исчерпываются! :)
    Можно дожать до 13 байт превратив переменную окружения в строку вида
    "Hello World!$"
    и изменив программу
    Код (Text):
    1. C:\>debug
    2. -a100
    3. 0B28:0100 push [2c]
    4. 0B28:0104 pop ds
    5. 0B28:0105 mov si,2a
    6. 0B28:0108 mov ah,9
    7. 0B28:010A int 21
    8. 0B28:010C ret
    9. 0B28:010D
    Правда в таком варианте размера программа утрачивает своё главное свойство - правдоподобие :dntknw:
    Но и это ещё не всё
    Можно не использовать командную строку и переменные среды окружения
    у нас остается резерв для трюков в лице расширения операционной системы
    Вешаем свой обработчик на загрузчик EXEC который при условии отсутствия командной строки может выполнять следующие действия
    Класть в psp строку вида "Hello World!$" настраивая на неё DX и помещая в регистр ah,9
    вся программа печатающая эту строку
    Код (Text):
    1. int 21h
    2. ret
    3 байта
    Класть тем же образом в момент загрузки программы в некое psp по смещению 0 код печатающий "Hello World!$"
    вот вся программа в результате которой на экране появляется строка "Hello World!"
    Код (Text):
    1. ret
    1 байт
    Туда же
    операционная система расширяется таким образом что если ей передают программу размером в 0 байт без парамеров командной строки, то надо вывести на экран строку вида "Hello World!"
    Код приводить не буду :)
     
  15. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Андрей Бертыш
    Вы на год сообщения #32 посмотрите:)
     
  16. lamer19

    lamer19 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2006
    Сообщения:
    24
    :dntknw:
    Опоздал, но хохма с 16 байтами все равно хорошая :)