Как сравнить 2 строки, нужен совет!

Тема в разделе "WASM.BEGINNERS", создана пользователем mOKa, 19 ноя 2010.

  1. mOKa

    mOKa New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2008
    Сообщения:
    4
    Добрый день жители вазма, вчера полдня изучал чтение и запись в реестр, вроде разобрался, так-же разобрался с условными операторами IF ELSE, но не могу понять как мне сравнить 2 строчки ? В этом примере я читаю из ключа реестра записанный IP адрес и мне его нужно сравнить с verf, если он равен то вывести мсгбокс, если нет то вывести соответсвенно другой мсбокс. Я так понимаю надо данные через регистр как-то передавать ? подскажите правильный путь, будьте так любезны, а лучше кусочек или шаблончик кода, думаю там в пару строк всего... заранее благодарен!

    Код (Text):
    1. .386
    2. .model  flat, stdcall
    3. option  casemap:none
    4.  
    5. include \masm32\include\winmm.inc
    6. include \masm32\include\windows.inc
    7. include \masm32\include\masm32.inc
    8. include \masm32\include\user32.inc
    9. include \masm32\include\kernel32.inc
    10. include \masm32\include\advapi32.inc
    11. includelib \masm32\lib\user32.lib
    12. includelib \masm32\lib\kernel32.lib
    13. includelib \masm32\lib\masm32.lib
    14. includelib \masm32\lib\advapi32.lib
    15. includelib \masm32\lib\winmm.lib
    16. include \masm32\include\wsock32.inc
    17. includelib \masm32\lib\wsock32.lib
    18. includelib \masm32\lib\wininet.lib
    19. include \masm32\include\wininet.inc
    20.  
    21. .data?
    22. key  dd   ?
    23. buf  db  1024 dup (?)
    24.  
    25. .data
    26. SubKey    db    "SOFTWARE\Microsoft\Windows\CurrentVersion\Run",0
    27. vName     db    "Test",0 ; параметр в реестре
    28. mbCapt    db    "RegValue",0 ; заголовок окна
    29. mbCapt2    db   "ERROR",0 ; заголовок окна
    30. verf     db "10.10.20.25",0 ; с этим значением сравнить
    31. rt        dd    REG_SZ
    32. bsz       dd    sizeof buf
    33.  
    34. .code
    35. start:
    36.   invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr SubKey, 0, KEY_QUERY_VALUE, addr key
    37.   invoke RegQueryValueEx, key, addr vName, 0, addr rt, addr buf, addr bsz
    38.   .IF eax == ERROR_SUCCESS ; если есть параметр в реестре то читаем его и выводим
    39.   invoke MessageBox, NULL, addr buf, addr mbCapt, MB_OK
    40.   invoke RegCloseKey, key
    41.   invoke ExitProcess, 0
    42.   .ELSE ; если ключа нет, то выдаем ошибку
    43.   invoke MessageBox, NULL, addr buf, addr mbCapt2, MB_OK
    44.   .ENDIF
    45. ret
    46. end start
     
  2. Kaimi

    Kaimi Андрей

    Публикаций:
    0
    Регистрация:
    15 апр 2010
    Сообщения:
    120
    В masm же есть szCmp, ucCmp или CompareString, lstrcmp из винапи. Или цель - написать свою процедуру сравнения?
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Код (Text):
    1. .386
    2. .model flat, stdcall  ;32 bit memory model
    3. option casemap :none  ;case sensitive
    4. include \masm32\include\masm32rt.inc
    5. ;----------------------------------------------------------
    6. .data
    7.       _ok   db  "Password OK",0
    8.       _er   db  "Password Incor",0
    9.       pas   db  "password",0
    10.       entry db  "password1",0
    11.        
    12. .code
    13. ;----------------------------------------------------------
    14. start:
    15.     invoke szCmp,addr entry,addr pas
    16.     .if eax == 0
    17.         invoke StdOut,addr _er
    18.     .else
    19.         invoke StdOut,addr _ok
    20.     .endif
    21.           invoke    ExitProcess,0  
    22.     ret
    23. end start
     
  4. mOKa

    mOKa New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2008
    Сообщения:
    4
    таккк.. хотел попросить примерчик, уже выложили, щас потестим! Спасибо!

    Ну значит так сделал (на счет считывания в строку, можно поподробнее пожалуйста, как мне это сделать ?)

    Код (Text):
    1.   invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr SubKey, 0, KEY_QUERY_VALUE, addr key
    2.   invoke RegQueryValueEx, key, addr vName, 0, addr rt, addr buf, addr bsz
    3.  
    4.  invoke szCmp,addr verf,addr buf
    5.  .if eax == 0
    6.         invoke MessageBox, NULL, addr buf, addr mbCapt, MB_OK
    7.   .else
    8.         invoke MessageBox, NULL, addr buf, addr mbCapt2, MB_OK
    9.  .endif
    но чет один фиг не работает как надо :)
     
  5. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    mOKa
    я ошибся там , обнови страницу, исправил пост. Если eax==0 то error.
     
  6. mOKa

    mOKa New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2008
    Сообщения:
    4
    а как мне buf переделать в строку ? по ходу из-за этого и не работает :)
     
  7. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Ну смотри что у тебя в buf. Ну так например
    Код (Text):
    1.   invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr SubKey, 0, KEY_QUERY_VALUE, addr key
    2.   invoke RegQueryValueEx, key, addr vName, 0, addr rt, addr buf, addr bsz
    3. ;--------------------------------------------------------------
    4. lea edi, buf ; <<< это потом затрешь
    5. int 3 ; <<< если в edi - в Олли видно строку, то все нормально
    6. ; если адрес (ну не строку) то пишем  
    7. ; lea esi, buf
    8. ; invoke szCmp,addr verf,esi
    9. ; тыж не пишешь как buf у тебя заказан ))
    10. ;--------------------------------------------------------------        
    11.  invoke szCmp,addr verf,addr buf
    12.  .if eax == 0
    13.         invoke MessageBox, NULL, addr buf, addr mbCapt, MB_OK  
    14.   .else
    15.         invoke MessageBox, NULL, addr buf, addr mbCapt2, MB_OK
    16.  .endif
    Установил OllyDbg.
    Настроил ее как отладчик по умолчанию.
    [​IMG]
    Пересобрал сомнительный код с int 3 в exe.
    Код (Text):
    1. start:
    2. lea edi,entry
    3. int 3 ;<<<<<<<<<<<<<<<< тут остановимся в отладчике
    4.     invoke szCmp,addr entry,addr pas
    5.     .if eax == 0
    6.         invoke StdOut,addr _er
    7.     .else
    8.         invoke StdOut,addr _ok
    9.     .endif
    10.           invoke    ExitProcess,0  
    11.     ret
    12. end start
    Запустил exe.
    Выпало прерывание в OllyDbg.
    [​IMG]
    Вот теперь смотрим что у нас и где у нас, если надо правим :)
     
  8. mOKa

    mOKa New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2008
    Сообщения:
    4
    дружище!!!! шикарно разжевал, СПАСИБО ТЕБЕ ОГРОМНОЕ!!!! и про дебагер спасибо, он стоял но я сильно в него не лез :) Все заработало :)
     
  9. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    mOKa
    Поооожалста )))