Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Исследование защиты TeleDesktop. (https://forum.antichat.xyz/showthread.php?t=45324)

0x0c0de 25.07.2007 18:51

Исследование защиты TeleDesktop.
 
[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

Piflit 25.07.2007 19:16

супер. в следующий раз можно снять видео...

ЗЫ что за джамп Jge?=)

0x0c0de 25.07.2007 19:19

jge==прыжок если больше или равно

Hellsp@wn 25.07.2007 19:47

хех не всё раскрыто =) как ты вышла на этот код:

Код:

004121F9  MOV DWORD PTR SS:[EBP-408],3E8
00412203  JGE ptdskhos.004122E7

и почему это именно то что нам нужно? Просто не совсем понятно для какого уровня статья, если для новичков, то надо всё писать =)

0x0c0de 25.07.2007 19:52

Бес праблем=) Отредактировала.

Но аццкое крипто неасилила, жаль(

GoreMaster 25.07.2007 20:31

Лучше бы написала статью по закейгениванию этой проги. =)
В остальном норм для новичков.
P.s.: где-то я видел это аццкое крипто О_о
P.P.S.: дай линк на софт =)

0x0c0de 25.07.2007 21:46

GoreMaster, крипто, что в фрагменте-это не то крипто. Завтра, если буду на форуме, дам линк или залью на обменник.
PS Там хитрая манипуляция с регистрами. В частности, второй прыжок на плохой месаг - именно такая фигня(

taha 26.07.2007 06:03

Так... мда... как ни крути, а тема является статьёй (хоть и не очень большой)
переношу в соответсвующий раздел


Время: 17:33