Программа запакована ASProtect 1.23 RC4, его я распоковал. Программа проверяет зарегистрирована она или нет по форме About, проверяет не красная ли надпись user (0FFh), и содержит ли она символы перевода строки и перевода каретки (0Ah, 0Dh). При загрузке формы пропатчил и загружаю имя юзера с этими символами. Ограничения программы только в том, что она не дает сохранить проект. Пишет что это демо версия. Строку я нашел, но проблема джамп идет только на эту ветку, без всяких вариантов. Вот кусок кода: .text:00425C4F Proj_not_saved: ; CODE XREF: sub_425B00+148j .text:00425C4F push ecx ; lpCaption .text:00425C50 push offset aNotPagesInProj ; "Not pages in project. Project is not sa"... .text:00425C55 mov eax, [ebp+var_70] .text:00425C58 call @Controls@TWinControl@GetHandle$qqrv ; Controls::TWinControl::GetHandle(void) .text:00425C5D push eax ; hWnd .text:00425C5E call MessageBoxA .text:00425C63 dec [ebp+var_50] .text:00425C66 lea eax, [ebp+var_10] .text:00425C69 mov edx, 2 .text:00425C6E call StrClr .text:00425C73 dec [ebp+var_50] .text:00425C76 lea eax, [ebp+var_NameSaveFile] .text:00425C79 mov edx, 2 .text:00425C7E call StrClr .text:00425C83 mov ecx, [ebp+var_6C] .text:00425C86 mov large fs:0, ecx .text:00425C8D jmp end .text:00425C92 ; ---------------------------------------------------------------------- ----- .text:00425C92 .text:00425C92 loc_425C92: ; CODE XREF: sub_425B00+11Cj .text:00425C92 mov eax, [ebp+var_70] .text:00425C95 mov edx, [eax+508h] ; in eax - ASCII "#none#" .text:00425C9B xor ecx, ecx .text:00425C9D mov eax, [ebp+var_70] .text:00425CA0 call sub_425990 .text:00425CA5 mov cl, 1 .text:00425CA7 mov edx, [ebp+var_NameSaveFile] .text:00425CAA mov eax, [ebp+var_70] .text:00425CAD call sub_425990 .text:00425CB2 jmp demo .text:00425CB2 ; ---------------------------------------------------------------------- ----- .text:00425CB7 db 60h ; ` .text:00425CB8 db 4Ah ; J .text:00425CB9 db 0 .text:00425CBA db 0D5h ; - .text:00425CBB db 2Fh ; / .text:00425CBC db 64h ; d .text:00425CBD db 0Ch .text:00425CBE db 0CBh ; T .text:00425CBF db 5Ch ; \ .text:00425CC0 db 0F4h ; ¯ .text:00425CC1 db 0D2h ; T .text:00425CC2 db 8Bh ; Ë .text:00425CC3 db 4 .text:00425CC4 db 0D7h ; + .text:00425CC5 db 6Bh ; k .text:00425CC6 db 34h ; 4 .text:00425CC7 db 3Dh ; = ... ... ... .text:00426080 db 0FFh .text:00426081 db 0EBh ; û .text:00426082 db 64h ; d .text:00426083 db 0DCh ; - .text:00426084 db 0EDh ; ý .text:00426085 db 4Ch ; L .text:00426086 db 0A8h .text:00426087 db 0C8h, 67h, 10h .text:0042608A ; ---------------------------------------------------------------------- ----- .text:0042608A .text:0042608A demo: ; CODE XREF: sub_425B00+1B2j .text:0042608A mov word ptr [ebp-5Ch], 0D4h .text:00426090 mov edx, offset aSorryThisFunct ; "Sorry, this function isn't available in"... .text:00426095 lea eax, [ebp-48h] .text:00426098 call Str_str_point_ .text:0042609D inc dword ptr [ebp-50h] .text:004260A0 mov eax, [eax] .text:004260A2 call @Dialogs@ShowMessage$qqrx17System@AnsiString ; Dialogs::ShowMessage(System::AnsiString) .text:004260A7 dec dword ptr [ebp-50h] .text:004260AA lea eax, [ebp-48h] .text:004260AD mov edx, 2 .text:004260B2 call StrClr .text:004260B7 dec dword ptr [ebp-50h] .text:004260BA lea eax, [ebp-4] .text:004260BD mov edx, 2 .text:004260C2 call StrClr .text:004260C7 mov ecx, [ebp-6Ch] .text:004260CA mov large fs:0, ecx .text:004260D1 .text:004260D1 end: ; CODE XREF: sub_425B00+109j .text:004260D1 ; sub_425B00+18Dj .text:004260D1 pop edi .text:004260D2 pop esi .text:004260D3 pop ebx .text:004260D4 mov esp, ebp .text:004260D6 pop ebp .text:004260D7 retn .text:004260D7 sub_425B00 endp В середине идет мусор. Ставил бряки на доступ к этому мусору - не помогло. WriteProcessMemory - не используется. Новый поток не создается. У меня такое ощущение, что это зашифрованный кусок кода. Т.к. функция открытия проекта примерно похожи по размеру. Вопрос: Как найти дешифратор функции? Или как найти ветку в коде отвечающую за сохранение проекта?
Ну, глядя на такой короткий фрагмент, можно только гипотезы высказывать. Самая разумная - смотришь код, который сразу после jmp demo следует: .text:00425CB7 db 60h ; ` .text:00425CB8 db 4Ah ; J ... очень похоже на зашифрованный фрагмент, который соб-но и сохраняет проект. Весьма вероятно, что где-то он расшифровывается (поищи адресок 425CB7, может поможет). А сам jmp demo после дешифрования надо nop -ами заменить. Было бы лучше,если бы ты приаттачил хотя бы код sub_425B00 целиком.
Одно добавление: может быть jmp demo надо не nop-ами заменить, а, скажем, подправить на другой адрес...
Поищу адресочек, хотя ида не ссылается на этот кусок, и поиск ничего не дает. Может Адрес этот вычисляется ([eax+???]),как-то так и ида не видит? В том то и загвоздка, как найти адрес расшифровщика? Присоединяю два аттача. Первый это сама функция обработки нажатия "Save", Второй это функция, где идут проверки и этот мусор, выдержка из него сверху темы. 730939732__SaveClick.doc
Ты приаттачил только _TMainForm_SaveProject1Click и помни, что максимальный размер аттача 50К! Лучше сожми.
И еще как можно изменять секцию кода, кроме как WriteProcessMemory, потому что эту функцию я не нашел в импорте, может лохо искал?
Этот мусор - закриптованый кусок кода программы (вероятно отвечает за ф-ю Save). Данный кусок расшифорвывается Аспротектом на старте программы, если имеется валидный ключ. Расшифорвать данный кусок без валидного ключа - нереально.
Выходит, что можно защитить программы. Ради интереса куплю версию зарегистрированную, посмотрю что там.
в аспре есть примеры, есть хелп. там все рассказано. аспр шифрует помеченные участки кода стойким алгоритмом (если правильно помню - IDEA, хотя это и не важно), а ключ для этого алгоритма хранится внутри лицензии. А чтобы его достать из лицензии, нужно еще и hardwareID иметь правильный, если он включен...
Chanson Еще как, если грамотно АПИ аспра используешь. можно прям в сишном коде выделять участки, которые хочешь покриптовать ессно такая защита живет до первого скарденного ключа, но от этого мало что может спасти
А возможно ли (и насколько сложно) написать кейген для проги, защищенной Аспром, если имеется один или несколько валидных ключей?