[Intro типа] Попалась мне прога TeleDesktop и решила я энто творение кодерского искусства поизучать. На полноценную статью это не тянет, но может быть, кому-нибудь будет интересно. Ну а если не будет - на то товарисчи модераторы имеются. [Приступим] Софтина имеет испытательный срок в 30 дней, а по истечению сего периода требуется приобрести лицензию на использование. Захожу в программу, ввожу ключ и получаю злобное сообщение "Invalid license key". Code: 0040E8DE . 83BD DCE0FFFF 14 CMP DWORD PTR SS:[EBP-1F24],14 0040E8E5 . 74 34 JE SHORT ptdskhos.0040E91B 0040E8E7 . 6A 00 PUSH 0 0040E8E9 . 6A 00 PUSH 0 0040E8EB . 68 D42A4400 PUSH ptdskhos.00442AD4 ; ASCII "Invalid license key" 0040E8F0 . E8 3DC10200 CALL <JMP.&MFC42.#1200> ; месаг 0040E8F5 . C645 FC 00 MOV BYTE PTR SS:[EBP-4],0 Здесь,очевидно, сравнивается количество введенных символов с 14h.Если не равно - выводится злобный месаг. Отлично. Теперь по крайней мере известна длина ключа - 20 символов. Ввожу "12345678901234567890" и получаю вердикт от программы "Invalid license". Что ж. Теперь осталось узнать когда лицензия невалидна. Code: 0041184D CMP DWORD PTR SS:[EBP-2C2C],0 00411854 JNZ SHORT ptdskhos.004118A8 00411856 PUSH 0 00411858 PUSH 0 0041185A PUSH ptdskhos.00442A98 ; ASCII "Invalid license." 0041185F CALL <JMP.&MFC42.#1200> Оля дала неутешительный ответ - на этот код ссылаются 8 прыжков(((( Это означает 8 проверок, а 8 проверок это плохо. Немного покопавшись в коде мне стало ясно, что дворд по адресу [EBP-2C2C] - это флаг регистрации: если FALSE - регистрация неуспешна, TRUE -успешна. FALSE к этой переменной присваивается 8 раз, а TRUE только один Code: 00411843 . C785 D4D3FFFF 01000000 MOV DWORD PTR SS:[EBP-2C2C],1 Но до TRUE нужно еще дореверсить, а процедура оооооочень большая с использованием какого-то аццкого криптоалгоритма. Естественно первая проверка была элементарна - в ней проверялся формат номера Code: 00410E44 . 8B8D D8D3FFFF MOV ECX,DWORD PTR SS:[EBP-2C28] ; тут адрес лицензионного ключа 00410E4A . 0FBE51 04 MOVSX EDX,BYTE PTR DS:[ECX+4] ; пятый символ должен быть "-" 00410E4E . 83FA 2D CMP EDX,2D 00410E51 . 75 1E JNZ SHORT ptdskhos.00410E71 00410E53 . 8B85 D8D3FFFF MOV EAX,DWORD PTR SS:[EBP-2C28] ; тут адрес лицензионного ключа 00410E59 . 0FBE48 09 MOVSX ECX,BYTE PTR DS:[EAX+9] ;десятый символ должен быть "-" 00410E5D . 83F9 2D CMP ECX,2D 00410E60 . 75 0F JNZ SHORT ptdskhos.00410E71 00410E62 . 8B95 D8D3FFFF MOV EDX,DWORD PTR SS:[EBP-2C28]; ; тут адрес лицензионного ключа 00410E68 . 0FBE42 0E MOVSX EAX,BYTE PTR DS:[EDX+E] ;пятнадцатый символ должен быть "-" 00410E6C . 83F8 2D CMP EAX,2D 00410E6F . 74 0F JE SHORT ptdskhos.00410E80 00410E71 > C785 D4D3FFFF 00000000 MOV DWORD PTR SS:[EBP-2C2C],0 ; если неправильный формат- присваиваем FALSE и в плохую процедуру 00410E7B . E9 CD090000 JMP ptdskhos.0041184D Из этого следует, что формат номера - xxxx-xxxx-xxxx-xxxxx. Гут. Но вторая проверка - аццкое битоизвращение. Про остальные вообще не говорю. Тогда у меня возникла идея заменить перед самым переходов в плохую процедуру Code: 0041184D CMP DWORD PTR SS:[EBP-2C2C],0 00411854 JNZ SHORT ptdskhos.004118A8 на Code: 0041184D > \FF85 D4D3FFFF INC DWORD PTR SS:[EBP-2C2C] 00411853 . 90 NOP 00411854 . /75 52 JNZ SHORT ptdskhos.004118A8 Смысл этой манипуляции в следующем. Переменная-флаг будет равна нулю, так как вводимый код неверен, поэтому инкрементом мы сделаем ее ненулевой.Когда переменная становится TRUE, jnz на это реагирует и срабатывает и ... 8 проверок обошли. Но программа так просто сдаваццо не хотела и выдала мне сообщение "This license can be installed on no more than 500 machine(s). Do you want to continue?". Не хочу на 500 машин лицензию. Малова-то будет) Ставим бряк на конец MessageBox-> вываливаемся в mfc42.dll, а из нее в код программы. Прям перед вызовом функции #1200 из mfc42.dll, выводящей злобный месаг стоит прыжок, его и пропатчим. Code: 004121F9 MOV DWORD PTR SS:[EBP-408],3E8 00412203 JGE ptdskhos.004122E7 00412209 MOV ECX,0B 0041220E MOV ESI,ptdskhos.00442A68 ; ASCII "This license can be installed on no more than " 00412213 LEA EDI,DWORD PTR SS:[EBP-1324] 00412219 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] 0041221B MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI] ; а дальше формирование злобной строки 0041221D MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 0041221E MOV ECX,0EE 00412223 XOR EAX,EAX 00412225 LEA EDI,DWORD PTR SS:[EBP-12F5] 0041222B REP STOS DWORD PTR ES:[EDI] 0041222D STOS BYTE PTR ES:[EDI] 0041222E PUSH 0A ; /radix = A (10.) 00412230 LEA EDI,DWORD PTR SS:[EBP-1324] ; | 00412236 OR ECX,FFFFFFFF ; | 00412239 XOR EAX,EAX ; | 0041223B REPNE SCAS BYTE PTR ES:[EDI] ; | 0041223D NOT ECX ; | 0041223F ADD ECX,-1 ; | 00412242 LEA EAX,DWORD PTR SS:[EBP+ECX-1324] ; | 00412249 PUSH EAX ; |string 0041224A MOV ECX,DWORD PTR SS:[EBP-408] ; | 00412250 PUSH ECX ; |value 00412251 CALL DWORD PTR DS:[<&MSVCRT._itoa>] ; \_itoa 00412257 ADD ESP,0C 0041225A MOV EDI,ptdskhos.00442A40 ; ASCII " machine(s). Do you want to continue?" 0041225F LEA EDX,DWORD PTR SS:[EBP-1324] 00412265 OR ECX,FFFFFFFF 00412268 XOR EAX,EAX 0041226A REPNE SCAS BYTE PTR ES:[EDI] 0041226C NOT ECX 0041226E SUB EDI,ECX 00412270 MOV ESI,EDI 00412272 MOV EBX,ECX 00412274 MOV EDI,EDX 00412276 OR ECX,FFFFFFFF 00412279 XOR EAX,EAX 0041227B REPNE SCAS BYTE PTR ES:[EDI] 0041227D ADD EDI,-1 00412280 MOV ECX,EBX 00412282 SHR ECX,2 00412285 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] 00412287 MOV ECX,EBX 00412289 AND ECX,3 0041228C REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 0041228E PUSH 0 00412290 PUSH 4 00412292 LEA EAX,DWORD PTR SS:[EBP-1324] 00412298 PUSH EAX 00412299 CALL <JMP.&MFC42.#1200> ; злобный месаг Смотрим и меняем Code: 004121F9 MOV DWORD PTR SS:[EBP-408],3E8 00412203 JGE ptdskhos.004122E7 на Code: 004121F9 > \C785 F8FBFFFF E8030000 MOV DWORD PTR SS:[EBP-408],3E8 00412203 . E9 DF000000 JMP ptdskhos.004122E7 И успешно проходим еще одну проверку. После этого патча удача мне опять же не улыбнулась( Прога попросила ввести старый код. Меня не так поняли) Снова ставлю брекпоинт на MessageBox (можно в принципе и на функцию #1200 из mfc42.dll).. Старый код программа просит ввести из трех мест. Все эти три проверки обходит один прыжок Code: 004122E7 CMP DWORD PTR SS:[EBP-920],0 004122EE JE ptdskhos.00414A7C Меняем на jmp. Запускаем....... Лицензионный ключ принят и успешно установлен))) Done
хех не всё раскрыто =) как ты вышла на этот код: Code: 004121F9 MOV DWORD PTR SS:[EBP-408],3E8 00412203 JGE ptdskhos.004122E7 и почему это именно то что нам нужно? Просто не совсем понятно для какого уровня статья, если для новичков, то надо всё писать =)
Лучше бы написала статью по закейгениванию этой проги. =) В остальном норм для новичков. P.s.: где-то я видел это аццкое крипто О_о P.P.S.: дай линк на софт =)
GoreMaster, крипто, что в фрагменте-это не то крипто. Завтра, если буду на форуме, дам линк или залью на обменник. PS Там хитрая манипуляция с регистрами. В частности, второй прыжок на плохой месаг - именно такая фигня(
Так... мда... как ни крути, а тема является статьёй (хоть и не очень большой) переношу в соответсвующий раздел