Сейчас на форуме: bartolomeo, -Sanchez- (+4 невидимых) |
eXeL@B —› Вопросы новичков —› Помогите разобраться со взломом регистрации |
Посл.ответ | Сообщение |
|
Создано: 08 апреля 2006 22:44 · Личное сообщение · #1 Имеется кусок тода который сравнивает введенный мною текст с чем то и выдает соответственно результат 0043DD68 |. PUSH 50 ; /Count = 50 (80.) 0043DD6A |. PUSH RIP.00570A08 ; |Buffer = RIP.00570A08 0043DD6F |. PUSH 3E9 ; |ControlID = 3E9 (1001.) 0043DD74 |. PUSH EBX ; |hWnd 0043DD75 |. CALL DWORD PTR DS:[<&USER32.GetDlgItemTe>; \GetDlgItemTextA 0043DD7B TEST EAX,EAX 0043DD7D |. JNZ SHORT RIP.0043DD8D 0043DD7F |. MOV BYTE PTR DS:[570A08],AL 0043DD84 |. POP EDI 0043DD85 |. POP ESI 0043DD86 |. POP EBX 0043DD87 |. MOV ESP,EBP 0043DD89 |. POP EBP 0043DD8A |. RETN 10 0043DD8D |> MOV EDI,RIP.00570A08 ; ASCII "tyuoio" 0043DD92 |. OR ECX,FFFFFFFF 0043DD95 |. XOR EAX,EAX 0043DD97 |. XOR ESI,ESI 0043DD99 |. REPNE SCAS BYTE PTR ES:[EDI] 0043DD9B |. NOT ECX 0043DD9D |. DEC ECX 0043DD9E |. MOV DWORD PTR SS:[ESP+10],0 0043DDA6 |. MOV DWORD PTR SS:[ESP+18],0 0043DDAE |. MOV DWORD PTR SS:[ESP+1C],0 0043DDB6 JE RIP.0043DEA4 0043DDBC |> MOV AL,BYTE PTR DS:[ESI+570A08] 0043DDC2 |. MOV DL,BYTE PTR DS:[ESI+570A09] 0043DDC8 |. MOVSX ECX,AL 0043DDCB |. MOV DWORD PTR SS:[ESP+14],ECX 0043DDCF |. PUSH EDX 0043DDD0 |. FILD DWORD PTR SS:[ESP+18] 0043DDD4 |. PUSH EAX 0043DDD5 |. FADD DWORD PTR SS:[ESP+18] 0043DDD9 |. FSTP DWORD PTR SS:[ESP+18] 0043DDDD |. CALL RIP.0043DCE0 0043DDE2 |. ADD ESP,8 0043DDE5 |. MOV EDI,RIP.00570A08 ; ASCII "tyuoio" 0043DDEA |. OR ECX,FFFFFFFF 0043DDED |. XOR EAX,EAX 0043DDEF |. INC ESI 0043DDF0 |. FADD QWORD PTR SS:[ESP+18] 0043DDF4 |. REPNE SCAS BYTE PTR ES:[EDI] 0043DDF6 |. FSTP QWORD PTR SS:[ESP+18] 0043DDFA |. NOT ECX 0043DDFC |. DEC ECX 0043DDFD |. CMP ESI,ECX 0043DDFF |. JB SHORT RIP.0043DDBC 0043DE01 |. FLD DWORD PTR SS:[ESP+10] 0043DE05 |. FCOMP DWORD PTR DS:[483320] 0043DE0B |. FSTSW AX 0043DE0D |. TEST AH,40 0043DE10 JE RIP.0043DEA4 0043DE16 |. FLD QWORD PTR SS:[ESP+18] 0043DE1A |. FSUB QWORD PTR DS:[483318] 0043DE20 |. FABS 0043DE22 |. FCOMP QWORD PTR DS:[483310] 0043DE28 |. FSTSW AX 0043DE2A |. TEST AH,1 0043DE2D JE SHORT RIP.0043DEA4 0043DE2F |. PUSH 0 ; /Style = MB_OK|MB_APPLMODAL 0043DE31 |. PUSH RIP.004953E8 ; |Title = "Thank you for registration!" 0043DE36 |. PUSH RIP.004953CC ; |Text = "RIP has been registered!!!" 0043DE3B |. PUSH EBX ; |hOwner 0043DE3C |. CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA 0043DE42 |. MOV EDI,RIP.00570A08 ; ASCII "tyuoio" 0043DE47 |. OR ECX,FFFFFFFF 0043DE4A |. XOR EAX,EAX 0043DE4C |. REPNE SCAS BYTE PTR ES:[EDI] 0043DE4E |. NOT ECX 0043DE50 |. SUB EDI,ECX 0043DE52 |. MOV EAX,ECX 0043DE54 |. MOV ESI,EDI 0043DE56 |. MOV EDI,RIP.0049F8EC ; ASCII "fghfgh" 0043DE5B |. SHR ECX,2 0043DE5E |. REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS> 0043DE60 |. MOV ECX,EAX 0043DE62 |. XOR EAX,EAX 0043DE64 |. AND ECX,3 0043DE67 |. REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[> 0043DE69 |. MOV EDI,RIP.0049F8EC ; ASCII "fghfgh" 0043DE6E |. OR ECX,FFFFFFFF 0043DE71 |. REPNE SCAS BYTE PTR ES:[EDI] 0043DE73 |. NOT ECX 0043DE75 |. PUSH ECX ; /BufSize 0043DE76 |. MOV ECX,DWORD PTR DS:[49FA50] ; | 0043DE7C |. PUSH RIP.0049F8EC ; |Buffer = RIP.0049F8EC 0043DE81 |. PUSH 1 ; |ValueType = REG_SZ 0043DE83 |. PUSH EAX ; |Reserved => 0 0043DE84 |. PUSH RIP.004953C8 ; |ValueName = "Key" 0043DE89 |. PUSH ECX ; |hKey => 6C 0043DE8A |. CALL DWORD PTR DS:[<&ADVAPI32.RegSetValu>; \RegSetValueExA 0043DE90 |. PUSH 1 ; /Result = 1 0043DE92 |. PUSH EBX ; |hWnd 0043DE93 |. CALL DWORD PTR DS:[<&USER32.EndDialog>] ; \EndDialog 0043DE99 |. XOR EAX,EAX 0043DE9B |. POP EDI 0043DE9C |. POP ESI 0043DE9D |. POP EBX 0043DE9E |. MOV ESP,EBP 0043DEA0 |. POP EBP 0043DEA1 |. RETN 10 0043DEA4 |> PUSH 30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL 0043DEA6 |. PUSH RIP.004953A8 ; |Title = "You have entered invalid code." 0043DEAB |. PUSH RIP.0049538C ; |Text = "Invalid registration code!" 0043DEB0 |. PUSH EBX ; |hOwner 0043DEB1 |. CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA 0043DEB7 |> POP EDI ; Default case of switch 0043DD44 Для чего нужны команды test ah,1 и test ah,40? Текст fghfgh я ввел для пробы |
|
Создано: 09 апреля 2006 12:41 · Личное сообщение · #2 ilyuha пишет: Для чего нужны команды test ah,1 и test ah,40? Test выполняет инструкцию and без возврата результата. Если результат был бы равен нулю, то поднимается флаг Z. Например у тебя test'уется ah(второй байт eax-a справа) с 40. 40h = 01000000b ah = x1xxxxxxb //7-ой бит должен быть равен единице(числа от 40h до 7Fh) для того чтобы флаг Z был равен нулю. в test ah, 1 аh должен быть не чётным числом. ЗЫ. ax это два правых байта еах-а т.е. ah и аl вместе. |
|
Создано: 09 апреля 2006 13:59 · Личное сообщение · #3 Первый TEST AH,40 я прошел, там производится суммирование кодов набранных символов символов и сравнивается с числом 2203. у меня получилось что код должен быть 19 символов минимум (19 букв z(код 122) только во втором условии непонятно как подсчитывается число которое потом вычитается из 897.9972606000000 и должна получиться еденица. вот тут я никак и не могу подобрать |
|
Создано: 09 апреля 2006 15:55 · Личное сообщение · #4 |
|
Создано: 09 апреля 2006 20:40 · Личное сообщение · #5 |
|
Создано: 10 апреля 2006 00:21 · Личное сообщение · #6 |
|
Создано: 10 апреля 2006 08:49 · Личное сообщение · #7 |
|
Создано: 10 апреля 2006 16:26 · Поправил: rep0A · Личное сообщение · #8 ilyuha Tы к этой проге подходишь не с той стороны. Обычно когда ты вводишь ключ проги его проверяют не до конца. Они могут проверять контрольную сумму, только первые 5 символов итд. И вот если эта проверка совпадает, то прога благодарит за регистрацию и записывает ключ в реестр. При старте она считывает его и проверяет по полной и только если ключ проходит эту проверку прога считает себя зареганой. Расскажу ход моих мыслей: При старте прога показывает окно, типа вот столько осталось до окончания триала. Понятно что этого окна в зареганой версии быть не должно. Поэтому загружаем прогу в ольку и ставим бряк на ShowWindow, брякнулись, теперь Alt+F9 (Execute till user code). Видим что появилось то окно, закрываем его и мы оказываемся в ольке. Mы видим что как минимум один прыжок перепрыгивает этот Call (по стрелке >), кликаем на 43E10A и видим что прыжок должен быть из 43E09C. Tагже мы видим что ещё один прыжок сверху может помешать прыгнуть нужному нам. Поэтому ставим бряк на 43Е083 и перезапускаем прогу. Видим что он хочет прыгнуть и поэтому нопим его, доходим по F8 до следующего прыжка. А он какраз не хочет прыгать, поэтому делаем из jnz jmp. Идём дальше по F8 и доходим до вызова по адресу 43E12D. Интересно что наш ключ передаётся этой функции. Mало ли чего нехорошего он хочет с ним натворить. Поэтому жмём на 43E121 правой мышкой->Follow in Dump->Immediate constant, выбираем в дампе(справа, снизу) первые четыре байта, жмём правок кнопкой мышки->Breakpoint->Hardware, on access->Dword и запускаем прогу по F9. Брякнулись и видим что он опять хочет поиздеваться над нашим ключиком. Mожно понажимать F8 но так как я ужасный лентяй, ставим бряк на знакомый test ah, 40 и F9. Опа, забыли убрать хардварный бряк, убираем его(Debug->Hardware breakpoints), опять F9 и мы стоим перед интересным прыжком. А что же этот прыжок перепрыгивает: какойто mov. Kак мне подсказывает моя фантазия это переменная отвечающая за зареганость. Поэтому нопим оба прыжка которые стремятся этот mov перепрыгнуть. Осталось только сохранить все изменения: Copy to executabele->All modifications, нажимаем везде да, потом в появившемся окне правой кнопкой мышки и Save file. Закрываем ольку, открываем сломанный ексешник... и ураа мы купили игру! ;) Надоже, аж минитутор написал. |
|
Создано: 10 апреля 2006 18:58 · Личное сообщение · #9 |
|
Создано: 11 апреля 2006 17:46 · Личное сообщение · #10 ilyuha Просто нажимаешь на нужное место и F2. Около адреса 43Е10А немного правее есть такая стрелка: ">". Это значит что какойто переход прыгает сюда. Если нажмёшь на 43Е10А, то увидишь адрес того перехода который может прыгать на 43E10А. Это и есть 43е09с. Вообщем я имел в виду что переход по адресу 43Е09C перепрыгивает Call Еsi(показ триального окна) и поэтому нам нужно заставить его прыгать. |
|
Создано: 12 апреля 2006 09:24 · Личное сообщение · #11 |
|
Создано: 12 апреля 2006 14:58 · Личное сообщение · #12 ilyuha пишет: перед ним нет перехода на 43е10а Ну и правильно что нет, ты не там вываливаешься. Может ты ставишь бряк на ShowWindow, потом шагаешь по F8 пока не появится окно, закрываешь его и оказываешься на 477D96. Так делать не надо. А надо так: Ставим бряк на ShowWindow, F9, брякнулись, Alt+F9, закрываем окно и мы на 43Е102. Или ты всё так и делаешь? |
|
Создано: 12 апреля 2006 17:54 · Личное сообщение · #13 Извини но что то не получается. Я делаю все в такой последовательности (сразу говорю оказывается в неправильной 1 - Search for \ intermodular calls. 2 Ставлю по f2 брейкпоинт на единственный Showwindow. 3 Запускааю по F9. запускается окно игры которое если закрыть то я просто возвращаюсь в ольку на непонятный адрес 7c90eb94 retn и все. Такое ощущение что то ли я бряк не на то ставлю то ли он не срабатывает. |
|
Создано: 12 апреля 2006 20:10 · Личное сообщение · #14 аа, теперь я понял что ты имел ввиду я не понял как именно ты ставил бряки - через коммандную строку? я тогда не врубился, какие бряки ты имеешь в виду. Бряки на апи-функции я ставлю через плагин CommandBar(он в аттаче). Вводишь в нём например bp ShowWindow и он ставит бряк где надо(в самой длл где эта функция находится). 8975_12.04.2006_CRACKLAB.rU.tgz |
eXeL@B —› Вопросы новичков —› Помогите разобраться со взломом регистрации |