|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 20, 2003 17:48:11 Доброе время суток! Простите, снова возникла проблема и снова обращаюсь к Вам. Нужно сравнить строки. Например, имеется строка от пользователя - из формы и строка из реестра или из секции .data. Как правильно сравнить строку любой длины. Я могу только сравнить первую цифру\букву, но дальше ничего не получается (f как быть с регистром). Один человек дал исходник: ; Mov ESI, OFFSET buffer Mov EDI, OFFSET original @@comp: ;отсюда начинаем сравнение Mov AL,[ESI] Cmp AL,00h ;конец? Jz @@ ; куда прыгать???? Cmp AL,[EDI] ;одинаково? Jnz @@ ; куда прыгать???? Inc ESI Inc EDI Jmp @@comp ; - комментарии мои. В чём грабли? Подскажите. Куда "прыгать"? А есть ли другие варианты? Помогите с исходным кодом сравнения строк. Может быть Вы подскажите другие варианты для моего случая. Я пишу программу, где пользователь вводит пароль, а как его обработать не знаю. Заранее спасибо! 1990 |
|
|
Дата: Авг 20, 2003 17:53:21 Можно сделать проще и хранить не пароли, а их хеш. Пользователь вводит свой пароль, считаем хеш, сравниваем с имеющимся. Можно тот же CRC32 взять. В случае побуквенного сравнения подобрать такой пароль - дело 1 минуты. А исходник явно с ошибками написан, особенно инструкции, вроде "jz @@", плюс сама имея не оптимальная. |
|
|
Дата: Авг 20, 2003 18:02:00 Немного не точно указал - @@ - это начало, например @@error и т.д. Извините, за неточность! |
|
|
Дата: Авг 20, 2003 18:09:39 Если строки имеют одинаковую длину то можно так: Mov ESI, OFFSET buffer Mov EDI, OFFSET original @@comp: ;отсюда начинаем сравнение Mov AL,byte ptr [ESI] Cmp AL,byte ptr [EDI] ;одинаково? Jnz @@exit ; не равны. Выходим. Cmp AL,00h ; коли достигли конца Jz @@exit ; то выходим из цыкла Inc ESI Inc EDI Jmp @@comp @@exit: или так Mov ESI, OFFSET buffer Mov EDI, OFFSET original repe cmpsb или посмотри описание функции lstrcmp |
|
|
Дата: Авг 20, 2003 19:29:02 IMHO, the CompareString function compares two character strings, using the locale specified by the given identifier as the basis for the comparison. int CompareString( LCID Locale, // locale identifier DWORD dwCmpFlags, // comparison-style options LPCTSTR lpString1, // pointer to first string int cchCount1, // size, in bytes or characters, of first string LPCTSTR lpString2, // pointer to second string int cchCount2 // size, in bytes or characters, of second string ); |
|
|
Дата: Авг 21, 2003 11:16:34 Вы что, прикалываетесь? Есть такая комманда "cmps". Поэлементно сравнивает две строки. |
|
|
Дата: Авг 22, 2003 10:29:03 А как использовать cmps? Если я пытаюсь сравнить регистры, то ничего не выходит cmps EDI,ESI В чём грабли? |
|
|
Дата: Авг 22, 2003 13:43:56 1990 cmps EDI,ESI Приехали!!! А что написано в мануале??? Посмотрите пожалуста. cmps сравнивает массив байт/слов/двойных слов источника [esi], с приёмником в [edi] Длинна массива в ecx. Используется в связке с rept Это команда без операндов. ЧИТАЙТЕ МАНУАЛЫ |
|
|
Дата: Авг 22, 2003 17:52:46 Спасибо! Понял наконец в чём фича. Всё исправил. А вот интересно, как это работать с паролями с помощью хэш и т.д. Посвятите по поводу нетрадиционных механизмов защиты "вводимого" пароля? Может быть, подкините исходник особо сложного механизма. Заранее спасибо! |
|
|
Дата: Авг 22, 2003 18:18:56 1990 Вот особо сложный -- криптование логина и пароля между собой.. А алгоритм можешь и сам придумать, на основе существующих :) |
|
|
Дата: Авг 22, 2003 21:22:01 Подкиньте ресурсы или исходные коды с примерами шифрования. А алгоритм придумать смогу, если увижу работающую структуру. |
|
|
Дата: Авг 24, 2003 13:44:44 Сравнение двух строк без учета регистра CmpStrI proc str1 equ dword ptr [ebp+08] str2 equ dword ptr [ebp+12] push ebp mov ebp, esp push esi push edi push ebx xor eax, eax xor edx, edx xor ebx, ebx mov esi, str1 mov edi, str2 new_loop: mov al, [esi] mov dl, [edi] inc esi inc edi cmp al, dl je b_equ sub al, dl @@: neg al js @B cmp al, 'a'-'A' je new_loop inc ebx jmp CSI_end b_equ: test al, al jnz new_loop CSI_end: mov eax, ebx pop ebx pop edi pop esi mov esp, ebp pop ebp ret 8 CmpStrI endp Если имеется длина какой-либо строки, то процедура сравнения двух строк без учета регистра выглядит так: CmpStrI proc str1 equ dword ptr [ebp+08] len equ dword ptr [ebp+12] str2 equ dword ptr [ebp+16] push ebp mov ebp, esp push esi push edi push ebx xor eax, eax xor edx, edx xor ebx, ebx mov esi, str1 mov edi, str2 mov ecx, len and ecx, 0FFh inc ecx new_loop: dec ecx jz CSI_end mov al, [esi] mov dl, [edi] inc esi inc edi sub al, dl jz new_loop @@: neg al js @B cmp al, 'a'-'A' je new_loop inc ebx jmp CSI_end CSI_end: mov eax, ebx pop ebx pop edi pop esi mov esp, ebp pop ebp ret 12 CmpStrI endp |
|
|
Дата: Авг 24, 2003 18:10:55 Спасибо большое, Android! Я обязательно воспользуюсь Вашим примером! Большое спасибо! |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.067 |