· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Сравнение паролей

Посл.отвђт Сообщенiе


Дата: Авг 31, 2004 18:32:38

Ребят пишу на асме относительно недавно! Сейчас пользуюсь масм и в качестве ide RadAsm..приспичило меня написать простенькую програмулину так сказать для поддержания своего интереса и стимулирования дальнейщего занятия програмированием на асм. Программа уже умеет скрывать трей проверять сооденение с интернетом ну и остальную смешную для людей серьёзно занимающихся программированием лабуду..вот :)теперь собственно вопрос я пользуюсь диалоговыми окнами спасибо создателю рад асма просто ограменное снимает большой груз проблем и хотелось бы мне реализовать в программе проверку пароля... т.е я создаю поле ввода говорю ему тип пароль! вобщем как мне реализовать всё это дело если можно то как после корректного ввода пароля чтоб програмулина подгружала длл с дополнительными функциями?? Зараннее благодарен!


Дата: Авг 31, 2004 21:37:35

Ну так проверяешь пароль на корректность , если ок , то грузишь длл и пользуешься дополнительными ф-циями , в чём конкретно проблемы ? :)


Дата: Авг 31, 2004 21:44:07

ага, такая проверка обходится патчем в один байт :)

если предполагается только один пароль, то неплохим ( и достаточно простым) решением может быть получение из введенного пароля ключа симметричного шифра и дальнейшее расшифрование твоей дллки, подгрузка её в память. Правда, перед подгрузкой неплохо бы проверять корректность, но, ИМХО, LoadLibrary с этим неплохо справится )

Если паролей может быть несколько, до для реализации такого же механизма потребуется приворачивать PKI, что не есть хорошо :(

еще (теоретически) можно реализовать в дллке функцию, и не экспортировать её.. а адрес шзашифровать ключом пользователея и хранить в надежном месте :) Тогда проще решить вопрос с несколькими пользователями..


Дата: Авг 31, 2004 21:49:10

Честно говоря, не совсем понял, что ты хочешь сделать...
Отвечаю как понял:
1) Определяешь момент, когда пользователь ввел пароль (например, нажал на кнопку);
2) Получаешь текст EditControl'a и сравниваешь с правильным паролем;
3) Если пароль правильный, вызываешь LoadLibrary и при необходимости GetProcAddress


Дата: Сен 1, 2004 02:12:19

flankerx:А куда ДЛЛ разшифровывать?


Дата: Сен 1, 2004 06:12:03

гм, во временный файл...


Дата: Сен 1, 2004 12:22:12

TerroSufix
Начинающему написать серьезный крипто алгоритм, который не будет ломаться элементарным патчем или даже руками, весьма сложно, на мой взгляд, поэтому советую автору будущей программы задуматься над этим и сделать свои выводы. Я лично ничего против такой программы не имею, пусть пишет, научиться немножко с паролями работать...


Дата: Сен 1, 2004 17:38:34

его никто и не уговаривает писать криптоалгоритм.. ИМХО, их уже достаточно достойных набралось :) Просто нужно грамотно использовать.


Дата: Сен 1, 2004 17:51:27

Xen0 Я наверно не совсем ясно изъясняюсь :( Проблема в том что я СОВСЕМ начинающий :) Я пытался делать каким образом... создавал поле для пароля создавал чтоо то вроде pass db "pass",0
воот.. а когда в самой функции делал чтоо то вроде
.if eax==IDC_BATON
invoke getdlgitemtext,тыры пыры,addr iPass точно не помню как там называется фун
.elseif pass==iPass
тогда подгружаем библиотеки!???
а он выдаёт ошибку мол немогу сравнивать такие штуки или что тот в этом роде...а до алгоритмов криптования мне я думаю ОЧЕНЬ далеко :)


Дата: Сен 1, 2004 19:27:39

видно что начинающий :) по трем одинаковым постам :)))

тексты нельзя в асьме сравнивать так, как ты написал :)
на то он и asm, надо либо писать свою ф-ции для сравнения,
либо воспользоваться готовой, например lstrcmp:

invoke lstrcmp, addr pass, addr iPass
.if eax == 0
; здесь если строки одинаковые
.else
; здесь соответственно, если не одинаковые.
.endif

описания lstrcmp и др. ф-ций можно найти в MSDN или Win32.hlp

а вообще, все это будет работать, если ты пытаешься защититься от ламеров, т.е. если ты здесь дальше будет грузить библиотеку, защита обойдется одним байтом. да и пароль можно будет посмотреть в открытом виде. другое дело, хотя бы сделать сравнение хешей от паролей, тогда можно будет поломать, изменив условие, но пароль никто не узнает. ну а совсем хорошо, как уже предлагали, пошифровать дллку, и расшифровывать только правильным ключем. тут уж, придется выпытывать из тебя пароль :)


Дата: Сен 1, 2004 19:50:58

хотя бы сделать сравнение хешей от паролей, тогда можно будет поломать, изменив условие, но пароль никто не узнает

Ты оговаривай КАКИХ хешей. Не для всяких хешей такое условие выполняется :)


Дата: Сен 1, 2004 20:36:03 · Поправил: Funbit

volodya
Ты оговаривай КАКИХ хешей. Не для всяких хешей такое условие выполняется :)

ну в смысле, в проге хранить хеш от правильного пароля,
считать хеш от введенного пароля
и сравнивать эти 2 хеша.

это вряд ли для тебя пояснение :) для автора топика


Дата: Сен 1, 2004 23:13:41

TerroSufix В ассемблере обязательно надо следить за размерами .
32-битный процессор оперирует максимум 4 байтами (dword,dd) , т.е. 4 байта (byte,db) * 8 бит в каждом байте = 32 бита (b) .
Причем такой х-ни как ".elseif pass==iPass" он не понимает и компилятор это , так сказать , преобразует в комаду cmp .
А она , в свою очередь , понимает только 2 операнда , причём это не может быть память,память . Т.е. сравнить может либо регистр с регистром (cmp eax,ecx) , либо регистр с памятью (cmp eax,pass) , или память с непосредственным операндом размером в байт (cmp pass,'A') .
А компилятор и выдаёт ошибку т.к. ты пытаешься сравнивать операндами недопустимых размеров (cmp pass,iPass). Короче таким способом можно сравнить пароль размером в один байт (ascii символ) , и то если указать компилятору , что ты хочешь зарезервировать за словом iPass любой один байт (iPass equ 'A') .
Но , а что значит сравнить (cmp) , это значит вычесть (sub) один операнд от другого и установить флаги (биты в 0 или 1) в регистре флагов (не доступном непосредственно для программиста регистре eflags) . Тут интересен только один флаг (ZF-Zerro Flag) , т.е. если при вычитании получился ноль (типа значит операнды равны) , то установить этот флаг в 1 .
И опять же , т.к. процу этот .elseif до лампочки то компилер сгенерирует соответствующий опкод для мнемонической команды условного перехода (jz,jnz и др.) .
Если это будет "jz метка" , то значит надо "прыгнуть" (тут я уже не буду рассказывать что это значит :) на метку если установлен флаг ZF , т.е. операнды или пароли совпали .
Гы , кстати можешь так заюзать , не всякий кракер сразу поверит , что у тебя пароль в один символ и так проверяеться %)

Чтобы сравнить пароли размером в 4 байта , то можно сделать примерно так :
mov eax,iPass ; регистр eax может хранить dword
cmp eax,pass  ; cmp (sub) может сравнивать (вычитать) регистр,память
jz  совпали   ; если получился ноль (ZF=1)

Фуф , вроде не наврал особо , ну что рассказывать теперь как можно сравнивать пароли больше чем 4 байта (команды mov,movs*,cmps*,loop,add,inc,dec,j**,lods*,rep** и другие пригодяться) , и потом как хранить пароль не в открытом виде , а в немного завуалированном (пригодиться например xor) ? Или сам будешь ассемблер изучать ?


Дата: Сен 2, 2004 11:40:21

Funbit
Да у miniBB бывает глючок она залипает(вроде бы сообщение отправляет)ну я по дури три раза и жмакнул а он(miniBB) по дури 3 раза запостил :)
Спасибо я помоему это и искал
bogrus
:) Спасибо! Очень даже расширил мой взгляд на асм!


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.144