сравнить GetModuleFileName с строкой

Тема в разделе "WASM.BEGINNERS", создана пользователем freengit, 21 янв 2012.

  1. freengit

    freengit New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2012
    Сообщения:
    4
    Задача такая: программа должна узнать путь к своему исполняемому файлу, сравнить его с заданным и действовать зависимо от результата. Вот исходник:

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7.  
    8. includelib \masm32\lib\kernel32.lib
    9. include \masm32\include\user32.inc
    10. includelib \masm32\lib\user32.lib
    11.  
    12. .data
    13. MsgBoxCaption  db "Iczelion Tutorial No.2",0
    14. MsgBoxYes    db "yes",0
    15. MsgBoxNo    db "no",0
    16.  
    17. Buffer db 0
    18. Tester db "C:\test\test.exe"
    19.  
    20. .code
    21. start:
    22.  
    23. invoke GetModuleFileName, 0, addr Buffer, 17
    24.  
    25. push offset Buffer
    26. push offset Tester
    27. call lstrcmpi
    28. test eax,eax
    29. jz equals
    30. invoke MessageBox, NULL, addr Buffer, addr MsgBoxCaption, MB_OK
    31.  
    32. jmp endoftheif
    33. equals:
    34. invoke MessageBox, NULL, addr MsgBoxYes, addr MsgBoxCaption, MB_OK
    35. endoftheif:
    36.    
    37. invoke ExitProcess, NULL
    38.  
    39. end start
    сравнение работает, путь к файлу определяется, но вместе оно работать не хочет. я предполагаю, что надо по-другому задать Tester (в другом формате, добавить спец.символ или что-то в етом роде). Подскажите плз как заставить ето чудо работать правильно.
     
  2. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Код (Text):
    1. .data
    2. MsgBoxCaption  db "Iczelion Tutorial No.2",0
    3. MsgBoxYes    db "yes",0
    4. MsgBoxNo    db "no",0
    5.  
    6. Buffer db 0
    7. Tester db "C:\test\test.exe"
    У вас буфер размером в 1 байт.
    Правильно так:
    Buffer db 255 dup (0)

    Вообще, скачайте отладчик OllyDbg и выполняйте свою программу по шагам.
    Так значительно быстрее искать ошибки :)
     
  3. freengit

    freengit New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2012
    Сообщения:
    4
    спс за совет!
    но вот в чем интерес:
    invoke MessageBox, NULL, addr Buffer, addr MsgBoxCaption, MB_OK
    правильно показывает путь О_о
     
  4. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Конечно.
    Ваш буфер переполняется и перетираются данные, следующие за ним.
    Т.е. затирается часть переменной Tester
    Повторюсь. Скачайте отладчик и все вопросы уйдут сами собой :)
     
  5. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Из-за того, что Buffer имеет недостаточный размер, GetModuleFileName перетирает всё что за ним идёт, т.е. Tester.
    Еще раз зададите вопрос, предварительно не воспользовавшись отладчиком, буду жаловаться администрации, чтобы вас отсюда выпилили.
    http://ollydbg.de
    Опередили меня :)
     
  6. freengit

    freengit New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2012
    Сообщения:
    4
    1)если администрация захочет меня "выпилить", то она это и без Вас сделает. Уж кто-кто, а она все видит
    2)а что мне по-вашему делать, если я только начал изучать асм и еще не разобрался как с дебагером работать, не просто ж так я в "BEGINNERS" спрашивал?
     
  7. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    это первое, что необходимо освоить)
    http://wasm.ru/series.php?sid=17 здесь учат обращаться с отладчиком
     
  8. freengit

    freengit New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2012
    Сообщения:
    4
    а за это спасибо