1. Assembler / Говнокод #24698

    −3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    format PE GUI at 0x10000
    
    include 'win32a.inc'
    
    invoke  MessageBoxA, 0, message, caption, MB_ICONQUESTION + MB_OK
    invoke ExitProcess, 0
    
    message db "Just test.", 0
    caption db "Test.", 0
    
    data import
        library kernel32, 'KERNEL32.DLL', user32, 'USER32.DLL'
    
        import kernel32, ExitProcess, 'ExitProcess'
    
        import user32, MessageBoxA, 'MessageBoxA'
    end data

    Не пойму, чочему уменьшив базу на 1 программа перестаёт роботать, но собирается нормально. 0x10000 -- это самое маленькое значение с которым она роботать. С 0x0 какая-то ашипка на счет длл лезит.

    И ксатати, лоли дебагер почему-то не могет зогружать такие програмым.

    Запостил: yet_another_one_shit, 31 Августа 2018

    Комментарии (28) RSS

    • DWORD ImageBase
      When the linker creates an executable, it assumes that the file will be memory-mapped to a specific location in memory. That address is stored in this field, assuming a load address allows linker optimizations to take place. If the file really is memory-mapped to that address by the loader, the code doesn't need any patching before it can be run. In executables produced for Windows NT, the default image base is 0x10000. For DLLs, the default is 0x400000. In Windows 95, the address 0x10000 can't be used to load 32-bit EXEs because it lies within a linear address region shared by all processes. Because of this, Microsoft has changed the default base address for Win32 executables to 0x400000. Older programs that were linked assuming a base address of 0x10000 will take longer to load under Windows 95 because the loader needs to apply the base relocations.

      Отсюда: https://msdn.microsoft.com/en-us/library/ms809762.aspx

      Короче, маленькие адреса в Винде подо что-то зарезервированы.
      Ответить
      • По умолчанию FASM не создаёт таблицу перемещаемых данных (фиксапов/релокейшнов), поэтому экзешник во что бы то ни стало должен грузиться по фиксированному адресу. Чтобы сделать его перемещаемым, в экзешник нужно добавить строчку:
        section '.reloc' data readable discardable fixups


        Добавил... Всё равно с маленьким значением ImageBase не запускается...
        Ответить
        • Раздражает сообщение Винды: «a.exe не является приложением Win32». А какое именно поле в заголовке не понравилось, не говорит.
          Ответить
          • +100500! Сука, ну могли бы написать "программа под 64-битную винду, а у тебя 32 бита".
            Ответить
            • Даже если битность системы совпадает с битностью программы, но загрузчик Windows по какой-то причине не смог загрузить программу, выводится то же самое сообщение.
              Ответить
              • Это кто тут такой умный, а? Поссал тебе на личико.
                Ответить
              • Дык что значит "по какой-то причине"? Причины вполне конкретные, о них можно было бы сказать юзеру, если нет - так дать больше информации. Но нет, не нужно.
                Ответить
                • Ну для юзера причин всего три -- битый файл, не та платформа и не хватает дллок (желательно бы ещё показать каких).
                  Ответить
                  • Иногда ещё невозможно понять, что вызвало проблему: экзешник или какая-нибудь из дээлэлок.
                    Ответить
    • У венды шаг резервирования виртуальной памяти 64к, емнип. Поэтому первые 64к отлетают для защиты от NULL и аллокатор их никогда не юзает.
      Ответить
      • То есть можно загружаться по любому адресу начиная с 0x10000? А писать и какать там можно? И почему оля не загружает файлы с нестандартной базой?
        Ответить
        • > по любому адресу
          The preferred address of the first byte of image when loaded into memory; must be a multiple of 64K.

          > можно
          Низя, обращение к первым 64К всегда вызывает пейджфолт т.к. аллокатор туда ничего не размещает.
          Ответить
      • И почему с базой 0x0 винде ругается, что не может найти какую-то там длл?
        Ответить
        • А можно полностью ошибку?
          Ответить
          • Ну это я только вечером смогу.
            Ответить
          • Если не файл с fixed ImageBase, как в этом примере (без таблицы релокейшнов), то «Ошибка при инициализации приложения (0xc0000018). Для выхода из приложения нажмите кнопку "ОК"».

            Если добавить релокейшны и ImageBase=0, то спокойно загружается. Если же добавить релокейшны и ImageBase в диапазоне 1..FFFF (т. е. строго больше нуля, но меньше 64 К), то «не является приложением Win32».

            P.S. Вот какого хуя нельзя копировать текст из произвольного окна?
            Ответить
            • В первое предложение случайно вставил слово «не». Оно там не нужно. Вот что значит забыть проверить после редактирования.
              Ответить
            • Пробовал без релокейшенов и с базой 0x0?
              Ответить
            • Если ты про messagebox, то он целиком копируется как текст по ctrl+c
              Ответить
          • Я дурачок – это происходит толтко если ещё укозать org 0x0:

            Приложению не удалось запуститься, поскольку e run in DOS mode.$ не был найден.

            Вчера был другой текст. Какая-то хуйня с таблицей импорта из-за того что я укозал смещение.

            Если мне нужно юзать какое-то произвольно больщое непрерывное куско памяти, как это лучше делать?
            Ответить
            • > как это лучше делать
              Копулировать под 64 бита.
              Ответить
              • Я о том что программе доступно всё адресное просранство? Только хз куда её загрузчик разместит.
                Ответить
                • Ну если грубо -- то нижняя половина (на 64-битке дохуя но намного меньше половины из-за экономии транзисторов в проце) виртуального адресного пространства за вычетом начала и конца. Твою то прогу то он разместит куда попросишь, а вот всякие ntdll въебёт хуй знает куда (по вписанному в dll адресу если ASLR выключен).
                  Ответить
                  • Ну то есть лучше сразу зарезервировать большой кусок памяти? db mnogo dup(?)
                    Ответить
                    • Ну тип того, если на аллокатор не надеешься.
                      Ответить
            • С org 0: «Ошибка при инициализации приложения (0xc0000005). Для выхода из приложения нажмите кнопку "ОК"».
              Ответить
            • >> Приложению не удалось запуститься, поскольку e run in DOS mode.$ не был найден.

              А это очень похоже на то, что ты испортил какие-то заголовки. По умолчанию линкер (в данном случае он встроен в FASM) перед заголовком PE втыкает обычный досовский экзешник, который в сосноль выводит строку: «This program cannot be run in DOS mode». После строки идёт знак доллара, как того требует функция 9 DOS. Не очень удобная функция, потому что через неё нельзя вывести символ "$", но почему-то иногда ей пользуются.

              В Portable Executable для пирфоманса все смещения указываются от начала файла, а не от начала заголовка. Т. е. если указать слишком маленькие смещения (в данном случае меньше 0x80), то можно сослаться на этот самый досовский экзешник. Судя по странной строке в сообщении об ошибке, у тебя где-то в заголовок PE попало смещение 0x63.
              Ответить

    Добавить комментарий