![]() |
eXeL@B —› Вопросы новичков —› Как определить алгоритм проверки рег. номера |
Посл.ответ | Сообщение |
|
Создано: 08 октября 2011 03:00 · Личное сообщение · #1 Здраствуйте. У меня возникла проблема с поиском алгоритма проверки регистрационного номера в програме, которая находится в аттаче. Я нашел место где считывается код: 0047769C >/. 55 PUSH EBP ; <-TfmEnterKey@edCDKeyKeyPress 0047769D |. 8BEC MOV EBP,ESP 0047769F |. 6A 00 PUSH 0 004776A1 |. 53 PUSH EBX 004776A2 |. 8BD9 MOV EBX,ECX 004776A4 |. 33C0 XOR EAX,EAX 004776A6 |. 55 PUSH EBP 004776A7 |. 68 EF764700 PUSH <->System.@HandleFinally;> 004776AC |. 64:FF30 PUSH DWORD PTR FS:[EAX] 004776AF |. 64:8920 MOV DWORD PTR FS:[EAX],ESP 004776B2 |. 8A03 MOV AL,BYTE PTR DS:[EBX] 004776B4 >|. E8 FFB7F8FF CALL <system.UpCase> ; ->System.UpCase(Char):Char; 004776B9 |. 8803 MOV BYTE PTR DS:[EBX],AL 004776BB |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4] 004776BE |. 8A13 MOV DL,BYTE PTR DS:[EBX] 004776C0 >|. E8 97CFF8FF CALL <system.@LStrFromChar> ; ->System.@LStrFromChar(String;String;Char); 004776C5 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 004776C8 |. BA 04774700 MOV EDX,<aQp2awes7d3f8_1> 004776CD >|. E8 A6D3F8FF CALL <system.@LStrPos> ; ->System.@LStrPos; 004776D2 |. 85C0 TEST EAX,EAX 004776D4 |. 75 03 JNZ SHORT <loc_4776D9> 004776D6 |. C603 00 MOV BYTE PTR DS:[EBX],0 004776D9 >|> 33C0 XOR EAX,EAX 004776DB |. 5A POP EDX 004776DC |. 59 POP ECX 004776DD |. 59 POP ECX 004776DE |. 64:8910 MOV DWORD PTR FS:[EAX],EDX 004776E1 |. 68 F6764700 PUSH <loc_4776F6> 004776E6 >|> 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4] 004776E9 >|. E8 86CDF8FF CALL <system.@LStrClr> ; ->System.@LStrClr(void;void); 004776EE \. C3 RETN Но на этом всё. Подскажите хотя бы направление. ![]() ![]() |
|
Создано: 08 октября 2011 10:21 · Поправил: neomant · Личное сообщение · #2 Поздравляю, вы нашли обработчик нажатия клавиши в полях ввода кода активаци продукта. Обратите внимание на это: Code:
----- Следуй за белым кроликом ![]() |
|
Создано: 08 октября 2011 10:59 · Личное сообщение · #3 |
|
Создано: 08 октября 2011 15:44 · Личное сообщение · #4 neomant пишет: Это проверка на допустимость вводимого символа. Это уже многое даёт. Возвращайтесь из этой функции. Если символ допустим, он где-то будет добавляться к общему коду, после чего код будет проходить проверку. В вашем случае я бы поступал именно так или ориентировался на активацию кнопки "Далее". Спасибо за ответ, но как я понимаю в самом обработчике TfmEnterKey@edCDKeyKeyPress активация кнопки не происходит. Там есть только функции: 1. 004776A7 |. 68 EF764700 PUSH <->System.@HandleFinally;> 2. 004776B4 >|. E8 FFB7F8FF CALL <system.UpCase> ; ->System.UpCase(Char):Char; - я так понял что это функция перевода символов в верхний регистр; 3. 004776C0 >|. E8 97CFF8FF CALL <system.@LStrFromChar> ; ->System.@LStrFromChar(String;String;Char); - перевод символов в строку; 4. 004776CD >|. E8 A6D3F8FF CALL <system.@LStrPos> ; ->System.@LStrPos; - проверка символа на принадлежность его к символам строки QP2AWES7D3F8YH1JKT5LZXC4VRBUN69M 5. 004776E9 >|. E8 86CDF8FF CALL <system.@LStrClr> ; ->System.@LStrClr(void;void); - функция очистки строки. Я думал что проверка рег. номера и активация кнопки должна вызыватся из обработчика TfmEnterKey@edCDKeyKeyPress, потому что кнопка не активируется если полностью введенный номер неверный. То-есть я хочу сказать что кнопка "далее" не активна даже когда вводится полностью номер а не один символ. Я также думаю что активация кнопки должна происходить где-то здесь: 004693E4 >/. 55 PUSH EBP 004693E5 |. 8BEC MOV EBP,ESP 004693E7 |. 83C4 F8 ADD ESP,-8 004693EA |. 56 PUSH ESI 004693EB |. 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX 004693EE |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX 004693F1 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8] 004693F4 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 004693F7 |. E8 C0CFFDFF CALL <Controls.TWinControl.CMEnabledChanged> ; EnableWindow 004693FC |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 004693FF |. 66:BE B1FF MOV SI,0FFB1 00469403 |. E8 E8A4F9FF CALL <system.@CallDynaInst> 00469408 |. 5E POP ESI 00469409 |. 59 POP ECX 0046940A |. 59 POP ECX 0046940B |. 5D POP EBP 0046940C \. C3 RETN Но как узнать при каких условиях? Заранее благодарен за помощь. ![]() |
|
Создано: 08 октября 2011 18:20 · Личное сообщение · #5 А может здесь? Code:
![]() |
|
Создано: 08 октября 2011 20:15 · Личное сообщение · #6 |
|
Создано: 08 октября 2011 23:55 · Личное сообщение · #7 Code:
Тут и Code:
Думаю нужены Бряки ! Далее изучай защиту ! ![]() |
|
Создано: 12 октября 2011 01:57 · Личное сообщение · #8 |
|
Создано: 12 октября 2011 02:49 · Личное сообщение · #9 |
|
Создано: 12 октября 2011 12:03 · Личное сообщение · #10 - загрузили число с плавающей точкой из восьмибайтового массива (в eax указатель) в xmm0 - вычитаем из xmm0 flt_4718EC, xmm0 результат вычитания - сверяем xmm0 с flt_4718F0 - сбросили статус в AX - загрузили биты ... дальше по идее должен идти условный прыжок ![]() |
|
Создано: 12 октября 2011 12:19 · Личное сообщение · #11 Вообще F... инструкции работают со стеком ST регистров, а не с xmm регистрами. ![]() |
|
Создано: 12 октября 2011 16:00 · Личное сообщение · #12 drone пишет: - загрузили число с плавающей точкой из восьмибайтового массива (в eax указатель) в xmm0- вычитаем из xmm0 flt_4718EC, xmm0 результат вычитания- сверяем xmm0 с flt_4718F0- сбросили статус в AX- загрузили биты...дальше по идее должен идти условный прыжок Большое спасибо за информацию. Да действительно дальше идет условный переход, просто я его что-то опустил. Просто в этом месте у меня программа идет по ложной ветке. ![]() |
|
Создано: 14 октября 2011 17:09 · Личное сообщение · #13 С защитой более менее разобрался. Но там есть несколько проверок, которые влияют на результат: 1) 004711DC |. 3B45 E8 CMP EAX,DWORD PTR SS:[EBP-18] 004711DF |. 74 0F JE SHORT <loc_4711F0> 2) 0047189B |. DD00 FLD QWORD PTR DS:[EAX] 0047189D |. D825 EC184700 FSUB DWORD PTR DS:[<flt_4718EC>] 004718A3 |. D81D F0184700 FCOMP DWORD PTR DS:[<flt_4718F0>] 004718A9 |. DFE0 FSTSW AX 004718AB |. 9E SAHF 004718AC |. 76 0C JBE SHORT <loc_4718BA> 3) 004719A2 >|> 8845 F3 MOV BYTE PTR SS:[EBP-D],AL 004719A5 |. 807D F3 00 CMP BYTE PTR SS:[EBP-D],0 004719A9 |. 75 0F JNZ SHORT <loc_4719BA>. Я смог подобрать рег номер чтобы удовлетворить первое условие: PCName=SCHOOL-1 LicID=CR-11111111 ActivationKey=RQQQ-QQR-QQQY Но другая проверка почему-то при таких условиях ведет программу по "ложному следу". Я так понимаю что при вводе ActivationKey здесь 004715DC |. E8 5331F9FF CALL <system.@LStrLen> 004715E1 |. 83F8 0B CMP EAX,0B проходит проверка на ввод всех символов; Далее идет прыжок 004715E4 |. 74 0F JE SHORT <loc_4715F5> по которому программа вычисляет некую сумму из вводимой строки по такому алгоритму: "сумма" ="сумма"*20+"номер символа в эталонной строке" Еталонная строка: (ASCII "QP2AWES7D3F8YH1JKT5LZXC4VRBUN69M") Далее в функцию 00471857 |. E8 00F9FFFF CALL <_Unit57.sub_0047115C> передается эта сумма и PCName=SCHOOL-1 LicID=CR-11111111. Внутри этой функции два раза вызывается функция CALL <_Unit57.sub_00470DE8> аргументами первый раз есть наша "сумма" и имя компьютера, результат записывается в ту же "сумму", а второй раз аргументами есть наша "сумма" и LicID и опять результат сохраняется в пременную "сумма". А дальше я запутался. Помогите разобратся, пожалуйста, или найти рег номер на PCName=SCHOOL-1 LicID=CR-11111111. ![]() |
|
Создано: 14 октября 2011 17:56 · Личное сообщение · #14 |
|
Создано: 14 октября 2011 19:39 · Личное сообщение · #15 |
|
Создано: 14 октября 2011 22:18 · Личное сообщение · #16 |
![]() |
eXeL@B —› Вопросы новичков —› Как определить алгоритм проверки рег. номера |
Эта тема закрыта. Ответы больше не принимаются. |