? Commandbar & MessageBox

Тема в разделе "WASM.BEGINNERS", создана пользователем Wardrag, 4 авг 2010.

  1. Wardrag

    Wardrag New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2010
    Сообщения:
    10
    Меня вот что интересует - что особенного делает плагин CommandBar с этим ? ? MessageBoxA.Выдаёт какой-то адрес во всех системах счисления часто используемых.
    При переходе по адресу я попадаю на инструкции сохранения регистров и пушев в стек(я так понял,это параметры для меседжбокса - их всего 4).
    Также Олька грит,что функция находится в модуле USER32.DLL.Жамкаю CTRL+N,пытаюсь найти её в этом модуле,и облом - её там нет и не было,а написано же CALL USER32.MessageBoxExA(хотя такой функции я не знаю - есть MessageBoxA),зато если жамкнуть CTRL+N в главном модуле проги,то увижу только один вызов MessageBoxA,и никаких тут MessageBoxExA.Тоже находится в юзер32.длл.Так что я делаю неправильно и почему такой результат ?! Не могу понять.


    И ещё: Что делает функция Find references to import при клике правой кнопке по апишной функции,предварительно вызвав CTRl+N ?



    ЗЫ: прога обычный крэкми крухэда(самый первый)
     
  2. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    Wardrag
    какая-то каша, простите.
    выложите прогу и задайте конкретный вопрос(по такому-то адресу, такая-то функция и тд и тп)
    собсно несколько предварительных ответов:

    команда ?MessageBoxA позволяет Вам узнать адрес начала этой функции.

    hex адрес должен быть.

    смотрите лучше или прогу в студию

    это просто расширенная функция. для 32-битных систем

    какого результата хотите добиться?

    находит ссылки на функцию в программе.
     
  3. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    что-то мертво тут
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.890
  5. Wardrag

    Wardrag New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2010
    Сообщения:
    10
    Ээ,да ладно,походу глюк какой-то был.Я думал,в теме никто вообще не ответит(два дня прошло ж).За отеты спасибки: )

    Тогда такие вопросы чисто по коду:

    1)_OK dw 'O','K',0 - _OK это переменная,но что в результате этого ей будет присвоено ? запись _OK dw 'something',0 я ещё понимаю из масм.

    2) Num2 equ $-MessageText1 - что за $- и зачем оно здесь? Судя по всему,какая-то константа : (

    3) call _imp__MessageBoxIndirectW@4 Зачем тут символы подчеркивания? Это как-то связано со стандартом передачи параметров ? (Просто я по умолчанию юзал стдколл всегда)

    4) push MB_ICONASTERISK or MB_OK - разъясните,пожалуйста,что сюда идёт в стек ? два параметра ? один ? один из двух ?!


    Строго не судите,я масм ещё мало знаю
     
  6. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    Wardrag
    Masm, Nasm.. на первых порах не так важно, хотя на вкус и цвет и тд и тп.
    Зачем dw 'O','K',0???
    Лучше db 'O','K',0, че память-то расходовать?
    db 'O','K',0 тоже, что и db 'OK',0 что тут сложного?

    исходничек бы.. ну могу Вам сказать что $ вычисляет позицию начала строки. Если то что хранится в MessageText1 находится перед Num2 equ $-MessageText1, то Num2 будет содержать размер символьного массива MessageText1. ок?

    stdcall это лишь соглашение о передаче аргументов и "кто выравнивает стек". Подчеркивания это просто "хороший стиль". Знаю, что Вы это знаете. У Вас, вероятно, вопрос:"шо это за функа такая _imp__MessageBoxIndirectW@4?" Может это просто своя определенная в программе функа?

    MB_ICONASTERISK и MB_OK это аргументы, которые задают стиль Вашего окошка, так? Ну значит операция push MB_ICONASTERISK or MB_OK заносит в стек оба параметра)
    это всё равно, что
    push MB_ICONASTERISK
    push MB_OK
    только оптимизировано немножко.

    Всегда пожалуйста. А вообще, пользуйтесь отладчиком и всё станет понятно.
     
  7. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Neonix
    Разве?
    Почему-то мне всегда казалось (непонятно почему), что инструкция push MB_ICONASTERISK or MB_OK
    занесёт в стек одно число равное MB_ICONASTERISK or MB_OK.
    А пара команд
    push MB_ICONASTERISK
    push MB_OK
    занесёт в стек по отдельности 2 числа.
    т.е. в первом случае esp уменьшится на 4, и в стеке будет находиться число MB_ICONASTERISK or MB_OK,
    а во втором случае esp уменшится на 8, и в стеке будут отдельно находиться 2 числа:
    MB_OK и MB_ICONASTERISK.
     
  8. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    qwe8013
    да, полностью согласен. но результат-то будет один и тот же? просто оптимизация, я говорил это.
    это просто ясная аналогия, которую я провел.
     
  9. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    2Neonix
    что ты куришь, какая аналогия между одним двордом и двумя? Впрочем я тебя понял, но это объяснять так нельзя. А показать на примере, как упаковываются битовые флаги в дворд с помощью логической операции ИЛИ.
     
  10. Neonix

    Neonix New Member

    Публикаций:
    0
    Регистрация:
    2 май 2009
    Сообщения:
    839
    izl3sa
    объясняю как могу. парень два дня ждал пока ему кто-нибудь ответит. это я к тому, что не обсёром надо заниматься, а делом(обьяснить непонятное в данном случае).

    P.S. я курю только табак Wings Light.
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.890
    Так исходник в посте #4 смотрите внимательнее...
    Wardrag
    я так понял эти вопросы ко мне, как к автору этого
    1)_OK dw 'O','K',0 - _OK это переменная,но что в результате этого ей будет присвоено ? запись _OK dw 'something',0 я ещё понимаю из масм.
    _OK -- unicode строка, предназначенная для SoftModalMessageBox -- unicode-символ латинской буквы это слово содержащее в первом байте 0, а во втором байте ASCII-кодировку соответствующего символа, в FASM можно прямо писать du 'something',0 а в MASM или через dw 's','o','m','e','t','h','i','n','g',0 или пользоваться макросом
    Код (Text):
    1. unicode     macro page,string,zero
    2.         irpc c,<string>
    3.         db '&c', page
    4.         endm
    5.         ifnb <zero>
    6.         dw zero
    7.         endif
    8. endm
    unicode 0, <something>,0 а вот dw 'something',0 MASM не скомпилирует и выдаст ошибку "constant value too large"
    2) Num2 equ $-MessageText1 - что за $- и зачем оно здесь? Судя по всему,какая-то константа
    $ - получить текущий адрес, конструкция "Num2 equ $-MessageText1" после строки MessageText1 позволяет получить в переменную Num2 количество байт в строке MessageText1
    3) call _imp__MessageBoxIndirectW@4 Зачем тут символы подчеркивания? Это как-то связано со стандартом передачи параметров ? (Просто я по умолчанию юзал стдколл всегда)
    В тексте нет упоминания об inc-файлах за исключением windows.inc, а вот в user32.lib функция MessageBoxIndirectW выглядит именно так, кроме того, использование формы _imp__MessageBoxIndirectW@4 позволяет сделать код чуть короче (а почему короче смотри здесь)
    4) push MB_ICONASTERISK or MB_OK - разъясните,пожалуйста,что сюда идёт в стек ? два параметра ? один ? один из двух ?!
    В windows.inc константа MB_ICONASTERISK определена как 40h, а MB_OK равно 0
    MB_ICONASTERISK or MB_OK = 40h именно это число и передается push в качестве параметра