0x0c0de
25.07.2007, 18:51
[Intro типа]
Попалась мне прога TeleDesktop и решила я энто творение кодерского искусства поизучать. На полноценную статью это не тянет, но может быть, кому-нибудь будет интересно. Ну а если не будет - на то товарисчи модераторы имеются.
[Приступим]
Софтина имеет испытательный срок в 30 дней, а по истечению сего периода требуется приобрести лицензию на использование.
Захожу в программу, ввожу ключ и получаю злобное сообщение "Invalid license key".
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". Что ж. Теперь осталось узнать когда лицензия невалидна.
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 только один
00411843 . C785 D4D3FFFF 01000000 MOV DWORD PTR SS:[EBP-2C2C],1
Но до TRUE нужно еще дореверсить, а процедура оооооочень большая с использованием какого-то аццкого криптоалгоритма.
Естественно первая проверка была элементарна - в ней проверялся формат номера
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. Гут. Но вторая проверка - аццкое битоизвращение. Про остальные вообще не говорю. Тогда у меня возникла идея заменить перед самым переходов в плохую процедуру
0041184D CMP DWORD PTR SS:[EBP-2C2C],0
00411854 JNZ SHORT ptdskhos.004118A8
на
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, выводящей злобный месаг стоит прыжок, его и пропатчим.
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> ; злобный месаг
Смотрим и меняем
004121F9 MOV DWORD PTR SS:[EBP-408],3E8
00412203 JGE ptdskhos.004122E7
на
004121F9 > \C785 F8FBFFFF E8030000 MOV DWORD PTR SS:[EBP-408],3E8
00412203 . E9 DF000000 JMP ptdskhos.004122E7
И успешно проходим еще одну проверку. После этого патча удача мне опять же не улыбнулась( Прога попросила ввести старый код. Меня не так поняли) Снова ставлю брекпоинт на MessageBox (можно в принципе и на функцию #1200 из mfc42.dll).. Старый код программа просит ввести из трех мест. Все эти три проверки обходит один прыжок
004122E7 CMP DWORD PTR SS:[EBP-920],0
004122EE JE ptdskhos.00414A7C
Меняем на jmp. Запускаем....... Лицензионный ключ принят и успешно установлен)))
Done
Попалась мне прога TeleDesktop и решила я энто творение кодерского искусства поизучать. На полноценную статью это не тянет, но может быть, кому-нибудь будет интересно. Ну а если не будет - на то товарисчи модераторы имеются.
[Приступим]
Софтина имеет испытательный срок в 30 дней, а по истечению сего периода требуется приобрести лицензию на использование.
Захожу в программу, ввожу ключ и получаю злобное сообщение "Invalid license key".
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". Что ж. Теперь осталось узнать когда лицензия невалидна.
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 только один
00411843 . C785 D4D3FFFF 01000000 MOV DWORD PTR SS:[EBP-2C2C],1
Но до TRUE нужно еще дореверсить, а процедура оооооочень большая с использованием какого-то аццкого криптоалгоритма.
Естественно первая проверка была элементарна - в ней проверялся формат номера
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. Гут. Но вторая проверка - аццкое битоизвращение. Про остальные вообще не говорю. Тогда у меня возникла идея заменить перед самым переходов в плохую процедуру
0041184D CMP DWORD PTR SS:[EBP-2C2C],0
00411854 JNZ SHORT ptdskhos.004118A8
на
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, выводящей злобный месаг стоит прыжок, его и пропатчим.
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> ; злобный месаг
Смотрим и меняем
004121F9 MOV DWORD PTR SS:[EBP-408],3E8
00412203 JGE ptdskhos.004122E7
на
004121F9 > \C785 F8FBFFFF E8030000 MOV DWORD PTR SS:[EBP-408],3E8
00412203 . E9 DF000000 JMP ptdskhos.004122E7
И успешно проходим еще одну проверку. После этого патча удача мне опять же не улыбнулась( Прога попросила ввести старый код. Меня не так поняли) Снова ставлю брекпоинт на MessageBox (можно в принципе и на функцию #1200 из mfc42.dll).. Старый код программа просит ввести из трех мест. Все эти три проверки обходит один прыжок
004122E7 CMP DWORD PTR SS:[EBP-920],0
004122EE JE ptdskhos.00414A7C
Меняем на jmp. Запускаем....... Лицензионный ключ принят и успешно установлен)))
Done