Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2011, 22:43   #1
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию Ошибка сравнения

Привет всем! Помогите разобраться... Код - выводит окно регистрации с полем для ввода пароля, но почему-то всегда переходит на метку 'BAD'. Если меняю условие, то переходит на метку 'ОК' (значит сравнивает). Может "правильный" пароль (passw db '12345',0) загоняю не так? Пробовал в ASCII-коде, цифрами, латиницей/кирилицей - всё одно и тоже. Прошу Ваших советов!

Код:
format PE GUI 4.0

include 'win32axp.inc'
include 'encoding\WIN1251.INC'

ID_SLOVO = 102

.data
 slovo db 6 dup 0
 passw db '12345',0

.code
fuck:

 invoke DialogBoxParam,0,69,0,ProceduraDialoga,0

;+-+-+-+-+-+-+-+-+-+-
 mov ebx,passw
 cmp ebx,slovo
 jnz bad
;+-+-+-+-+-+-+-+-+-+-

ok:
 invoke MessageBox,0,'Спасибо за регистрацию!','Окно регистрации',MB_OK
 invoke	ExitProcess,0

bad:
 invoke MessageBox,0,'Неправильный код!','Окно регистрации',MB_OK
 invoke	ExitProcess,0


proc ProceduraDialoga,hwnddlg,msg,wparam,lparam
 push ebx
 push esi
 push edi

 cmp [msg],WM_INITDIALOG
 je Initialization
 cmp [msg],WM_COMMAND
 je Command
 cmp [msg],WM_CLOSE
 je Close
 
 xor eax,eax
 jmp Finish

Command:
 cmp [wparam],BN_CLICKED shl 16 + IDCANCEL
 je Close
 cmp [wparam],BN_CLICKED shl 16 + IDOK
 jne Initialization

 invoke GetDlgItemText,[hwnddlg],ID_SLOVO,slovo,5
 invoke EndDialog,[hwnddlg],1
 jmp Finish

Initialization:
 xor eax,eax
 inc eax

Finish:
 pop edi
 pop esi
 pop ebx
 ret

Close:
 invoke EndDialog,[hwnddlg],-1
 jmp Finish

endp

section '.rsrc' resource data readable
directory RT_DIALOG,dialogs

 resource dialogs,69,LANG_ENGLISH+SUBLANG_DEFAULT,rsrc_dialog
 dialog rsrc_dialog,'Окно регистрации',70,70,190,60,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME

 dialogitem 'STATIC','Введите код:',-1,10,10,190,8,WS_VISIBLE
 dialogitem 'EDIT','',ID_SLOVO,10,20,170,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP

 dialogitem 'BUTTON','ОК',IDOK,85,40,45,15,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
 dialogitem 'BUTTON','Отмена',IDCANCEL,135,40,45,15,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON

enddialog
.end fuck
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 18.06.2011 в 08:21.
R71MT вне форума Ответить с цитированием
Старый 18.06.2011, 11:27   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

строки сравнивает CMPS
counter вне форума Ответить с цитированием
Старый 18.06.2011, 12:26   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

...с cmps вообще не компилируется, ошибка указывает на эту строку.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 18.06.2011, 21:54   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

какой ассембелр? какая ошибка?
а написать свою процедуру сравнения строк?
может литературку почитать стоит?
counter вне форума Ответить с цитированием
Старый 19.06.2011, 09:53   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

В общем, создал такое окно. Считываю данные с Edita функцией GetDlgItemText в буфер.

Код:
	+---------------------------------+
	| Окно регистрации              Х |
	+---------------------------------+
	|                                 |
	|   Введите код:                  |
	|  +---------------------------+  |
	|  |                           |  |
	|  +---------------------------+  |
	|    +----------+ +----------+    |
	|    |    ОК    | |  Отмена  |    |
	|    +----------+ +----------+    |
	+---------------------------------+
Дальше, по нажатию ОК сравниваю данные буфера с текстовой строкой, которую поместил в секцию данных в программе. При сравнении - условие всегда НЕвыполняется.

Прогнал программу под отладчиком OllyDbg, ..вроде всё нормуль. После ввода пароля отладчик показывает такое:

Код:
00402000 > $ 6A 00          PUSH 0                                     ; +- lParam = NULL
00402002   . 68 A4204000    PUSH password.004020A4                     ; |  DlgProc = password.004020A4
00402007   . 6A 00          PUSH 0                                     ; |  hOwner = NULL
00402009   . 6A 45          PUSH 45                                    ; |  pTemplate = 45
0040200B   . 6A 00          PUSH 0                                     ; |  hInst = NULL
0040200D   . FF15 88404000  CALL DWORD PTR DS:[<&USER32.DialogBoxPar>] ; +- DialogBoxParamA

00402013   . BB 00104000    MOV EBX,password.00401000                  ;  ASCII "12345" (введённые данные)
00402018   . 81FB 0A104000  CMP EBX,password.0040100A                  ;  ASCII "12345" (прошитый пароль) 
0040201E   . 75 45          JNZ SHORT password.00402065

00402020   . 6A 00          PUSH 0
00402022   . E8 11000000    CALL password.00402038
00402027   . CE             INTO
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 19.06.2011, 11:45   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

выглядит, как-то странно. вроде сравниваются два абсолютно разных адреса, и если там стоит JNZ, то условие должно всегда выполняятся.

Но как правильно было отмечено, имеет смысл использовать CMPS, вместе LOOP, я так думаю.

Цитата:
CMPSB
For legacy mode, compare byte at address DS : (E)SI with byte at address ES : (E)DI;
For 64-bit mode compare byte at address (R|E)SI with byte at address (R|E)DI. The status flags are set accordingly.
f.hump вне форума Ответить с цитированием
Старый 19.06.2011, 13:22   #7
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

loop - это значит мотать цикл, т.е. сравнивать каждый символ отдельно чтоли?
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 19.06.2011, 14:05   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Да, цикл. Возможно стоит присмотреться к LOOPE/LOOPNE.

Даже если предположить, что в EBX лежит часть строки (что, конечно, неправда), не кажется ли вам, что EBX слегка короче чем строка?
f.hump вне форума Ответить с цитированием
Старый 19.06.2011, 23:07   #9
Silver_S
Форумчанин
 
Регистрация: 14.03.2011
Сообщений: 104
По умолчанию

Команда
Код:
mov ebx,passw
помещает в EBX указатель на участок памяти
Для правильной работы нужно написать что-то вроде
Код:
mov ebx,[passw]
cmp ebx,[slovo]

Последний раз редактировалось Silver_S; 19.06.2011 в 23:14.
Silver_S вне форума Ответить с цитированием
Старый 19.06.2011, 23:15   #10
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

скорее уж что-то вроде
Код:
mov edi,passw
mov esi,slovo
mov ecx,6
repe cmpsb
jnz bad
а перед этим сравнить длину пароля и введенной строки
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция сравнения Ksy Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 16.05.2011 13:07
Сравнения изображений ВасяСВВ Общие вопросы C/C++ 0 05.04.2011 17:17
Функция сравнения sanya94 Общие вопросы C/C++ 3 02.12.2010 22:24
Алгоритм сравнения f3nix Общие вопросы Delphi 1 16.02.2008 11:12