Дублирую тебу здесь, ибо на CrackLab'e полная тишина... Доброго всем времени суток. Я не являюсь профессиональным крякером - исследую только для себя по необходимости. Посему моя проблема для кого-то может показаться тривиальной. Но я продолжу... Итак, данная программа написана на Delphi5, ни чем не запакована. Есть тривиальная антиотладка. Ограничения - 30 дней демо-срока. По нажатию на кнопке "Регистрация" (proc_addr == 0059DF38) в одноименном окне ничего особого не происходит - введенный ключ просто копируется в переменную по нестатическому адресу. Как вызывается процедура проверки ключа разбираться было влом - на тот кусок кода нет прямых ссылок. Тут нужно поставить бряк по адресу 0059F736. Мы увидим вызов процедуры (proc_addr == 004041A0), возвращающей длину строки, в данном случае длину ключа. Длина должна быть равна 27 (1Bh), посему слудующий JNZ следует (?) заNOPить, чтоб надуть проверку. Чуть ниже по тексту (конкретно, по адресу 0059F74D) идет вызов процедуры регистрации (?) (proc_addr == 00594550). Процедура должна возвратить 1-цу в регистре AL, если код верный. Так как данная процедура достаточно объемная, мне пока не удалось установить проводит ли она регистрацию или просто проверяет валидность ключа. Я, все же, склоняюсь к первому варианту, так как среди вызываемых ей подпрограмм есть такие, которые пишут что-то в реестр ("\Software\CLASSES\CLSID\{5F0AD35A-C0AE-4DC8-950C-C337E764C466}"). Собственно, помочь разобраться с этой процедурой и есть мой крик о помощи. После отработки этой "процедуры регистрации", проверяется возвращенное ей значение и выводится соответствующий MessageBox. Это пока вся инфа, что мне удалось выудить из проги. Вообщем, уверен в компитентности наших крякеров и надеюсь на помощь. Всем откликнувшимся заранее большое спасибо. Программу можно скачать на страничке http://twister.orgfree.com/other - архив называется hotel.rar (3 157 084 байт).
Twister Кажись, проверка выполняется здесь: Код (Text): CODE:0065560F mov eax, ds:pFTDM CODE:00655614 mov eax, [eax] CODE:00655616 mov eax, [eax+0FCh] ; AVLockGold:TAVLockGold CODE:0065561C mov dx, 4D2h CODE:00655620 call sub_5919A8 CODE:00655625 mov eax, ds:pFTDM CODE:0065562A mov eax, [eax] CODE:0065562C xor edx, edx CODE:0065562E call sub_59F510 CODE:00655633 test al, al CODE:00655635 jnz short loc_655645 CODE:00655637 mov eax, ds:pApplication CODE:0065563C mov eax, [eax] CODE:0065563E call TApplication@Terminate CODE:00655643 jmp short loc_65569B
Twister Вот тебе материал для анализа, твоя процедура (594550) похоже действительно проверяет валидность ключей, введенных в поле Memo: Код (Text): CODE:0059F510 sub_59F510 proc near CODE:0059F510 push ebp CODE:0059F511 mov ebp, esp CODE:0059F513 add esp, 0FFFFFFD8h CODE:0059F516 push ebx CODE:0059F517 push esi CODE:0059F518 push edi CODE:0059F519 xor ecx, ecx CODE:0059F51B mov [ebp+tmp3], ecx CODE:0059F51E mov [ebp+s1], ecx CODE:0059F521 mov [ebp+tmp1], ecx CODE:0059F524 mov [ebp+tmp2], ecx CODE:0059F527 mov [ebp+line], ecx CODE:0059F52A mov ebx, edx CODE:0059F52C xor eax, eax CODE:0059F52E push ebp CODE:0059F52F push offset loc_59F82A CODE:0059F534 push dword ptr fs:[eax] CODE:0059F537 mov fs:[eax], esp CODE:0059F53A mov [ebp+res], 0 CODE:0059F53E mov eax, ds:FTDM CODE:0059F543 mov eax, [eax+0FCh] ; AVLockGold CODE:0059F549 mov [ebp+lock1], eax CODE:0059F54C mov eax, [ebp+lock1] CODE:0059F54F call sub_5928C0 CODE:0059F554 mov eax, [ebp+lock1] CODE:0059F557 cmp byte ptr [eax+0D7h], 0 CODE:0059F55E jz short loc_59F568 CODE:0059F560 mov eax, [ebp+lock1] CODE:0059F563 call sub_591D50 CODE:0059F568 loc_59F568: CODE:0059F568 mov eax, [ebp+lock1] CODE:0059F56B cmp byte ptr [eax+0DCh], 0 CODE:0059F572 jz short loc_59F57C CODE:0059F574 mov eax, [ebp+lock1] CODE:0059F577 call sub_593C24 CODE:0059F57C loc_59F57C: CODE:0059F57C mov eax, [ebp+lock1] CODE:0059F57F cmp byte ptr [eax+0DDh], 0 CODE:0059F586 jnz short loc_59F5B0 CODE:0059F588 mov eax, [ebp+lock1] CODE:0059F58B cmp byte ptr [eax+0DBh], 0 CODE:0059F592 jnz short loc_59F5AC CODE:0059F594 mov eax, [ebp+lock1] CODE:0059F597 cmp byte ptr [eax+0DCh], 0 CODE:0059F59E jz short loc_59F5B0 CODE:0059F5A0 mov eax, [ebp+lock1] CODE:0059F5A3 cmp byte ptr [eax+0DAh], 0 CODE:0059F5AA jnz short loc_59F5B0 CODE:0059F5AC loc_59F5AC: CODE:0059F5AC mov [ebp+res], 1 CODE:0059F5B0 loc_59F5B0: CODE:0059F5B0 mov al, [ebp+res] CODE:0059F5B3 xor al, 1 CODE:0059F5B5 or bl, al CODE:0059F5B7 jz loc_59F807 CODE:0059F5BD xor ecx, ecx CODE:0059F5BF mov dl, 1 CODE:0059F5C1 mov eax, clTRegistrationForm CODE:0059F5C6 call TCustomForm@Create CODE:0059F5CB mov [ebp+registrationForm], eax CODE:0059F5CE xor eax, eax CODE:0059F5D0 push ebp CODE:0059F5D1 push offset loc_59F7EE CODE:0059F5D6 push dword ptr fs:[eax] CODE:0059F5D9 mov fs:[eax], esp CODE:0059F5DC mov eax, [ebp+lock1] CODE:0059F5DF mov edx, [eax+104h] CODE:0059F5E5 mov eax, [ebp+registrationForm] CODE:0059F5E8 mov eax, [eax+304h] ; EdlCode CODE:0059F5EE call TControl@SetText CODE:0059F5F3 mov eax, [ebp+lock1] CODE:0059F5F6 mov dl, [eax+0DAh] CODE:0059F5FC xor dl, 1 CODE:0059F5FF mov eax, [ebp+registrationForm] CODE:0059F602 mov eax, [eax+328h] ; btnOk CODE:0059F608 mov ecx, [eax] CODE:0059F60A call dword ptr [ecx+5Ch] ; SetEnabled CODE:0059F60D mov eax, [ebp+lock1] CODE:0059F610 cmp byte ptr [eax+0DAh], 0 CODE:0059F617 jz short loc_59F631 CODE:0059F619 mov eax, [ebp+registrationForm] CODE:0059F61C mov eax, [eax+324h] ; Lexpire CODE:0059F622 mov edx, offset aXUUcarUIxas ; Истек срок ознакомления CODE:0059F627 call TControl@SetText CODE:0059F62C jmp loc_59F6B7 CODE:0059F631 loc_59F631: CODE:0059F631 mov eax, [ebp+lock1] CODE:0059F634 cmp byte ptr [eax+0DBh], 0 CODE:0059F63B jz short loc_59F652 CODE:0059F63D mov eax, [ebp+registrationForm] CODE:0059F640 mov eax, [eax+324h] CODE:0059F646 mov edx, offset aSiucxasxCrXusSUtrau ; ~ _риложение зарегистрировано ~ CODE:0059F64B call TControl@SetText CODE:0059F650 jmp short loc_59F6B7 CODE:0059F652 loc_59F652: ; ~ Tегодн',0FFh,' CODE:0059F652 push offset aXuufa CODE:0059F657 call Now CODE:0059F65C mov eax, [ebp+lock1] CODE:0059F65F fsub qword ptr [eax+28h] CODE:0059F662 fadd flt_59F89C CODE:0059F668 call @TRUNC CODE:0059F66D push edx CODE:0059F66E push eax CODE:0059F66F lea eax, [ebp+tmp1] CODE:0059F672 call IntToStr1 ; Int64 CODE:0059F677 push [ebp+tmp1] CODE:0059F67A push offset aSFxa ; -й день CODE:0059F67F lea edx, [ebp+tmp2] CODE:0059F682 mov eax, [ebp+lock1] CODE:0059F685 movzx eax, word ptr [eax+0D4h] CODE:0059F68C call IntToStr2 ; Integer CODE:0059F691 push [ebp+tmp2] CODE:0059F694 push offset aFa_UcarUSXiAuuuQxSufr ; дн. ознакомительного периода ~ CODE:0059F699 lea eax, [ebp+s1] CODE:0059F69C mov edx, 5 CODE:0059F6A1 call @LStrCatN CODE:0059F6A6 mov edx, [ebp+s1] CODE:0059F6A9 mov eax, [ebp+registrationForm] CODE:0059F6AC mov eax, [eax+324h] ; Lexpire CODE:0059F6B2 call TControl@SetText CODE:0059F6B7 loc_59F6B7: CODE:0059F6B7 mov eax, [ebp+registrationForm] CODE:0059F6BA mov edx, [eax] CODE:0059F6BC call dword ptr [edx+0D8h] ; ShowModal CODE:0059F6C2 mov eax, [ebp+registrationForm] CODE:0059F6C5 cmp dword ptr [eax+234h], 6 ; ModalResult CODE:0059F6CC jnz loc_59F7C8 CODE:0059F6D2 mov eax, ds:FTDM CODE:0059F6D7 mov eax, [eax+0FCh] CODE:0059F6DD mov [ebp+lock2], eax CODE:0059F6E0 mov [ebp+n1], 0 CODE:0059F6E6 mov eax, [ebp+registrationForm] CODE:0059F6E9 mov eax, [eax+320h] ; Memo CODE:0059F6EF mov eax, [eax+208h] ; Lines CODE:0059F6F5 mov edx, [eax] CODE:0059F6F7 call dword ptr [edx+14h] ; GetCount CODE:0059F6FA mov ebx, eax CODE:0059F6FC test bx, bx CODE:0059F6FF jb short loc_59F76A CODE:0059F701 inc ebx CODE:0059F702 xor esi, esi CODE:0059F704 loc_59F704: CODE:0059F704 lea ecx, [ebp+tmp3] CODE:0059F707 movzx edx, si CODE:0059F70A mov eax, [ebp+registrationForm] CODE:0059F70D mov eax, [eax+320h] ; Memo CODE:0059F713 mov eax, [eax+208h] ; Lines CODE:0059F719 mov edi, [eax] CODE:0059F71B call dword ptr [edi+0Ch] ; Get CODE:0059F71E mov eax, [ebp+tmp3] CODE:0059F721 lea edx, [ebp+line] CODE:0059F724 call Trim CODE:0059F729 mov eax, [ebp+line] CODE:0059F72C call @LStrLen CODE:0059F731 cmp eax, 17h CODE:0059F734 jz short loc_59F743 CODE:0059F736 mov eax, [ebp+line] CODE:0059F739 call @LStrLen CODE:0059F73E cmp eax, 1Bh CODE:0059F741 jnz short loc_59F764 CODE:0059F743 loc_59F743: CODE:0059F743 push 0 CODE:0059F745 xor ecx, ecx CODE:0059F747 mov edx, [ebp+line] CODE:0059F74A mov eax, [ebp+lock2] CODE:0059F74D call sub_594550 CODE:0059F752 test al, al CODE:0059F754 jz short loc_59F764 CODE:0059F756 inc [ebp+n1] CODE:0059F75A cmp [ebp+res], 0 CODE:0059F75E jnz short loc_59F764 CODE:0059F760 mov [ebp+res], 1 CODE:0059F764 loc_59F764: CODE:0059F764 inc esi CODE:0059F765 dec bx CODE:0059F768 jnz short loc_59F704 CODE:0059F76A loc_59F76A: CODE:0059F76A cmp [ebp+n1], 0 CODE:0059F76F jnz short loc_59F78B CODE:0059F771 push 10h CODE:0059F773 mov ecx, offset aAsRasx ; Tнимание! CODE:0059F778 mov edx, offset aXqRtsiASXusRSuaaSUf ; =еправильнvй регистрационнvй код! CODE:0059F77D mov eax, ds:pApplication CODE:0059F782 mov eax, [eax] CODE:0059F784 call TApplication@MessageBox CODE:0059F789 jmp short loc_59F7A3 CODE:0059F78B loc_59F78B: CODE:0059F78B push 40h CODE:0059F78D mov ecx, offset aUcfRti ; _оздравл',0FFh,'_! CODE:0059F792 mov edx, offset aXusRSTQuiaxarQxAu ; _егистраци',0FFh,' вvполнена успешно! CODE:0059F797 mov eax, ds:pApplication CODE:0059F79C mov eax, [eax] CODE:0059F79E call TApplication@MessageBox CODE:0059F7A3 loc_59F7A3: CODE:0059F7A3 cmp [ebp+res], 0 CODE:0059F7A7 jz short loc_59F7B5 CODE:0059F7A9 mov eax, [ebp+lock2] CODE:0059F7AC cmp byte ptr [eax+0DAh], 0 CODE:0059F7B3 jz short loc_59F7B9 CODE:0059F7B5 loc_59F7B5: CODE:0059F7B5 xor eax, eax CODE:0059F7B7 jmp short loc_59F7BB CODE:0059F7B9 loc_59F7B9: CODE:0059F7B9 mov al, 1 CODE:0059F7BB loc_59F7BB: CODE:0059F7BB mov [ebp+res], al CODE:0059F7BE mov eax, [ebp+lock2] CODE:0059F7C1 call sub_5928C0 CODE:0059F7C6 jmp short loc_59F7D8 CODE:0059F7C8 loc_59F7C8: CODE:0059F7C8 mov eax, [ebp+registrationForm] CODE:0059F7CB cmp dword ptr [eax+234h], 1 ; ModalResult CODE:0059F7D2 jnz short loc_59F7D8 CODE:0059F7D4 mov [ebp+res], 1 CODE:0059F7D8 loc_59F7D8: CODE:0059F7D8 xor eax, eax CODE:0059F7DA pop edx CODE:0059F7DB pop ecx CODE:0059F7DC pop ecx CODE:0059F7DD mov fs:[eax], edx CODE:0059F7E0 push offset loc_59F7F5 CODE:0059F7E5 loc_59F7E5: CODE:0059F7E5 mov eax, [ebp+registrationForm] CODE:0059F7E8 call TObject@Free CODE:0059F7ED retn CODE:0059F7EE loc_59F7EE: CODE:0059F7EE jmp loc_40383C CODE:0059F7F3 jmp short loc_59F7E5 CODE:0059F7F5 loc_59F7F5: CODE:0059F7F5 mov dl, 1 CODE:0059F7F7 mov eax, [ebp-14h] CODE:0059F7FA call sub_595854 CODE:0059F7FF mov eax, [ebp-14h] CODE:0059F802 mov edx, [eax] CODE:0059F804 call dword ptr [edx+44h] CODE:0059F807 loc_59F807: CODE:0059F807 xor eax, eax CODE:0059F809 pop edx CODE:0059F80A pop ecx CODE:0059F80B pop ecx CODE:0059F80C mov fs:[eax], edx CODE:0059F80F push offset loc_59F831 CODE:0059F814 loc_59F814: CODE:0059F814 lea eax, [ebp+tmp3] CODE:0059F817 mov edx, 4 CODE:0059F81C call @LStrArrayClr CODE:0059F821 lea eax, [ebp+line] CODE:0059F824 call @LStrClr CODE:0059F829 retn CODE:0059F82A loc_59F82A: CODE:0059F82A jmp loc_40383C CODE:0059F82F jmp short loc_59F814 CODE:0059F831 loc_59F831: CODE:0059F831 mov al, [ebp+res] CODE:0059F834 pop edi CODE:0059F835 pop esi CODE:0059F836 pop ebx CODE:0059F837 mov esp, ebp CODE:0059F839 pop ebp CODE:0059F83A retn CODE:0059F83A sub_59F510 endp ЗЫ Я не совсем только понял - тебе нужно научиться ключ генерить или снять проверку?
crypto Это место - проверка и вызов формы регистрации (sub_59F510) при старте программы . Если пользователь давит отмену, то происходит выход (CODE:0065563E call TApplication@Terminate). Заглянув в sub_59F510, можно найти место, где именно вызывается форма: CODE:0059F6BC call dword ptr [edx+0D8h]. Но от этого толку мало - запретить появление этого надоедливого окна не проблема. А вот ниже по тексту идет вызов той самой процедуры, о которой я говорил в первом посте (именно в ней вся соль): CODE:0059F74D call sub_594550. Вчера обнаружил еще один интересный момент: в ключе реестра "\Software\CLASSES\CLSID\{5F0AD35A-C0AE-4DC8-950C-C337E764C466}" лежит параметр (называется "0"), в котором хранится ключ, подходящий для регистрации (у меня E9PLWG-GL2NGP-57UZMN-RDC8HU). При вводе этого ключа программа говорит, что регистрация прошла успешно, но триал не снимается. При удалении этого значения из реестра или его изменении, прога говорит, что триальный период закончился. Т.е., скорее всего, этот ключ является чем-то вроде "ключа на 30 дней". Хотя я могу и ошибаться... Спасибо. Я вижу это IDA. Мне для анализа Дельфовых прог приходится юзать DeDE. Где-то видел инфу, как заставить иду распозновать VCL-процедуры, но не могу найти. Поделишься? Ко времени вызова этой процедуры в Мемо уже ни чего нет. Ключ лежит, как я уже говорил, где-то далеко, по нестатическому адресу. Ну, кейген, в данном случае - это роскошь. Я краем глаза видел что там творится - из ключа убираются дефисы, из полученной строки генерится какая-то хрень аналогичной длины. Эта хрень разбивается на части. С частями тоже что-то происходит, выделяются числа какие-то... Вообщем, без травы не обойтись. Так что тут бы просто прогу отучить от триала...
Twister Могу тебе вечерком скинуть все относящиеся к сабжу тексты с распознанными VCL-процедурами. ЗЫ Чтобы снять проверку, попробуй: 1. Код (Text): CODE:0059F53A mov [ebp+res], 0 заменить на Код (Text): CODE:0059F53A mov [ebp+res], 1 2. Код (Text): CODE:0059F5B7 jz loc_59F807 заменить на Код (Text): CODE:0059F5B7 jmp loc_59F807
Лучше скинь в ЛС, плиз, инфу о том, как я могу это сделать сам. Сначала испробую свой вариант, потом, если не прокатит, буду мучать твой...
1. Загрузить дополнительные сигнатуры 2. Использовать пакет DeIDA для экспорта из DeDe Все есть в разделе инструментов на этом сайте.
crypto Итак. Подведем итоги. Твой вариант: Заменить mov [ebp+res], 0 по адресу 0059F53A на mov [ebp+res], 1 Заменить JZ по адресу 0059F5B7 на JMP При этом полность блокируется вызов окна регистрации. Так же в заголовке главного окна остается надпись "незарегистрировано" Мой вариант: Занопить JZ по адресу 0059F63B Заменить JZ на JMP по адресу 0059F617 Заменить call по адресу 0065562E на mov al, 01 При этом окно регистрации не выскакивает при старте проги, а если вызвать его из главного меню, то увидим радующую глаз надпись "зарегистрировано". В заголовке главного окна по-прежнему красуется надпись "незарегистрировано". Осталось найти, как это исправить. На изменения даты и времени оба варианта реагируют так, как и должно быть - т.е. никак. Так что как только уберу надпись из заголовка, можно будет считать задачу полностью решенной. Тут мне помогли бы распознанные ИДой VCL-процедуры. Короче говоря - большое спасибо. Жду твоего сообщения в личку... gazlan Спасибо, буду пробовать...
1. В инструментах нашел только для D2005. 2. Вообще не нашел. Ткните носом... А заодно скажите в двух словах, как все это добро заюзать.
Twister Вот тут перехлд исправь -- Код (Text): 0064B3FB 751C jnz 0064B419 на Код (Text): 0064B3FB 741C jz 0064B419 P.S. Это в событии FormShow главной формы TMainForm
Twister GMax В коде есть еще крючок: Код (Text): CODE:005A0FAA cmp byte ptr [eax+0DBh], 0 CODE:005A0FB1 jz loc_5A1E30 Поэтому jz надо забить нопами.