![]() |
eXeL@B —› Вопросы новичков —› crackme и генерация ключа |
Посл.ответ | Сообщение |
|
Создано: 21 сентября 2008 16:24 · Личное сообщение · #1 00401310 |> /803E 00 /CMP BYTE PTR DS:[ESI],0 00401313 |. |74 15 |JE SHORT CRACKME4.0040132A 00401315 |. |8A06 |MOV AL,BYTE PTR DS:[ESI] 00401317 |. |02C1 |ADD AL,CL 00401319 |. |32C1 |XOR AL,CL 0040131B |. |F6F3 |DIV BL 0040131D |. |66:C1E8 08 |SHR AX,8 00401321 |. |04 41 |ADD AL,41 00401323 |. |8807 |MOV BYTE PTR DS:[EDI],AL 00401325 |. |47 |INC EDI 00401326 |. |46 |INC ESI 00401327 |. |41 |INC ECX 00401328 |.^\EB E6 \JMP SHORT CRACKME4.00401310 0040132A |> C607 00 MOV BYTE PTR DS:[EDI],0 0040132D |. 33C0 XOR EAX,EAX 0040132F |. 83F9 00 CMP ECX,0 00401332 |. 74 1A JE SHORT CRACKME4.0040134E 00401334 |. 68 84324000 PUSH CRACKME4.00403284 ; /String2 = "NHB" 00401339 |. 68 84314000 PUSH CRACKME4.00403184 ; |String1 = "1234321" 0040133E |. E8 A1000000 CALL <JMP.&KERNEL32.lstrcmpA> ; \lstrcmpA 00401343 |. 83F8 00 CMP EAX,0 00401346 |. 74 04 JE SHORT CRACKME4.0040134C 00401348 |. 33C0 XOR EAX,EAX 0040134A |. EB 02 JMP SHORT CRACKME4.0040134E 0040134C |> 8BC1 MOV EAX,ECX 0040134E |> 5F POP EDI 0040134F |. 5E POP ESI 00401350 |. C9 LEAVE 00401351 \. C2 0400 RETN 4 Знающие люди помогите разобраться, имеем данный код программы, начинающийся по адресу 00401310 и заканчивая 00401328 вроде бы тута генирируется ключ программы на основе имени, но если мы имеем имя Ami то как видим не правильный серийник ( 1234321 ) сравнивается с NHB, то при вводе его получается всё зарегестрировано, но при использовании другого имени и кода оно так же сверяется но уже не подходит, перечитал кучу имеющихся туториалов, и руководство по ассму но ни как не могу вот это понять, помогите пожалуйста кто чем может, только для таких как я поподробнее если моно спс. (olly всё делал и доки по оли тоже читал но что то туго идёт как то) ![]() |
|
Создано: 21 сентября 2008 16:29 · Личное сообщение · #2 |
|
Создано: 21 сентября 2008 17:59 · Поправил: Amido · Личное сообщение · #3 малясь не то вы правы 00401310 |> /803E 00 /CMP BYTE PTR DS:[ESI],0 00401313 |. |74 15 |JE SHORT CRACKME4.0040132A 00401315 |. |8A06 |MOV AL,BYTE PTR DS:[ESI] 00401317 |. |02C1 |ADD AL,CL 00401319 |. |32C1 |XOR AL,CL 0040131B |. |F6F3 |DIV BL 0040131D |. |66:C1E8 08 |SHR AX,8 00401321 |. |04 41 |ADD AL,41 00401323 |. |8807 |MOV BYTE PTR DS:[EDI],AL 00401325 |. |47 |INC EDI 00401326 |. |46 |INC ESI 00401327 |. |41 |INC ECX 00401328 |.^\EB E6 \JMP SHORT CRACKME4.00401310 0040132A |> C607 00 MOV BYTE PTR DS:[EDI],0 0040132D |. 33C0 XOR EAX,EAX 0040132F |. 83F9 00 CMP ECX,0 00401332 |. 74 1A JE SHORT CRACKME4.0040134E 00401334 |. 68 84324000 PUSH CRACKME4.00403284 ; /String2 = "NHB" 00401339 |. 68 84314000 PUSH CRACKME4.00403184 ; |String1 = "1234321" 0040133E |. E8 A1000000 CALL <JMP.&KERNEL32.lstrcmpA> ; \lstrcmpA 00401343 |. 83F8 00 CMP EAX,0 00401346 |. 74 04 JE SHORT CRACKME4.0040134C 00401348 |. 33C0 XOR EAX,EAX 0040134A |. EB 02 JMP SHORT CRACKME4.0040134E 0040134C |> 8BC1 MOV EAX,ECX 0040134E |> 5F POP EDI 0040134F |. 5E POP ESI 00401350 |. C9 LEAVE 00401351 \. C2 0400 RETN 4 00401334 |. 68 84324000 PUSH CRACKME4.00403284 ; /String2 = "NHB"- вроде бы правильный серийник 00401339 |. 68 84314000 PUSH CRACKME4.00403184 ; |String1 = "1234321" - мой который ввёл 0040133E |. E8 A1000000 CALL <JMP.&KERNEL32.lstrcmpA> ; \lstrcmpA - вроде бы как бы сравнение двух строк идущих выше (String2 String1) Соответственно вопрос к знающим людям если при вводе в качестве имени используем Ami то при сравнение строк string2 и string1 видим сравнение неправильного серейного номера с NHB пробуем и радость получаем то что хотели верную регистрацию, но при вводе другого имени и сравнение его с помощью того что выше получаем фиг с маслом, вот и вопрос как же вычмсляется данный ключ на основе другого имени. Просьба не пинать так как только учусь и вот это дается с трудом вычисление серийного номера на основе имени уже на первых парах, и еще раз извините если что не так. p/s Если не трудно и можно поподробнее с раскоментированы строчкми для начинающих или объяснение как оно генерируется. p.p.s спс еще раз за прочтение сего опуса и за отнятое у вас время на таких как мы только начинающих сее деяние и творение в исследование программ. ![]() ![]() |
|
Создано: 21 сентября 2008 18:10 · Поправил: tempread · Личное сообщение · #4 |
|
Создано: 21 сентября 2008 20:19 · Поправил: tempread · Личное сообщение · #5 Amido но при вводе другого имени и сравнение его с помощью того что выше получаем фиг с маслом, Пароль вычисляется из логина в блоке: Code:
Ответил на вопрос? ![]() ![]() |
|
Создано: 21 сентября 2008 20:56 · Личное сообщение · #6 Code:
А если поставить вот сюда брэкпоинт 0040133E |. E8 A1000000 CALL <JMP.&KERNEL32.lstrcmpA> ; \lstrcmpA И нажать на выполнение крекми то получим желаемый рез-тат помоему быстрее или я не прав малясь ![]() |
|
Создано: 21 сентября 2008 21:46 · Личное сообщение · #7 |
|
Создано: 21 сентября 2008 21:50 · Поправил: coderess · Личное сообщение · #8 И нажать на выполнение крекми то получим желаемый рез-тат помоему быстрее или я не прав малясь Если тебя интересует именно получения ключа, то такое дествие является правильным, иначе же разбирается блок находящийся выше и пишется кейген. В действительности же, блок выше вычесляет серийный номер по введенному имени, а WinAPI функция lstrcmp сравнивает сгенерированный номер с введенным тобой, если ты ставишь бряк на неё, то видишь её аргументы. //Опоздал я ----- Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes ![]() |
|
Создано: 21 сентября 2008 22:30 · Личное сообщение · #9 Да не вроде не опоздал честно я туп как пробка но познания есть и желание есть, охото хоть чему то научиться и будущая специальность вроде бы как то этого требует. Code:
ВОТ вроде бы так или где то ошибся при написании коментариев в этом чуде. ![]() |
|
Создано: 21 сентября 2008 22:52 · Поправил: tempread · Личное сообщение · #10 Amido Обрати внимание на следующее - в общем случае,что бы получить нормальный пароль из логина,нужно что бы символы пароля были буквенно-числовые. Иначе пароль получится такой,что его с клавы и набрать то нельзя будет ![]() Поэтому константа 0x1a(живет в bl), сложение al и числа 0x41(по адресу 401321) - это не произвольные числа. Как ты верно подметил, 0x41 - это сивол 'A'. А теперь вспоминаем, что в ASCII таблице именно с этого символа начинаются алфавитные символы... 0x1a - это количество букв в английском алфавите... Дальше уже ясен алгоритм крекми? ![]() |
|
Создано: 22 сентября 2008 10:13 · Личное сообщение · #11 tempread Обрати внимание на следующее - в общем случае,что бы получить нормальный пароль из логина,нужно что бы символы пароля были буквенно-числовые Че то крэкми splish ломал, так там на выходе ключ получается следующего содержания: 1 при чем: - HEX(1) - HEX(2) - HEX(3) - HEX(4) ----- Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes ![]() |
![]() |
eXeL@B —› Вопросы новичков —› crackme и генерация ключа |