Авторские статьи Исследование защиты TeleDesktop.

Discussion in 'Статьи' started by 0x0c0de, 25 Jul 2007.

  1. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    [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
     
    #1 0x0c0de, 25 Jul 2007
    Last edited: 26 Jul 2007
    8 people like this.
  2. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    супер. в следующий раз можно снять видео...

    ЗЫ что за джамп Jge?=)
     
  3. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    jge==прыжок если больше или равно
     
  4. Hellsp@wn

    Hellsp@wn Elder - Старейшина

    Joined:
    29 Apr 2007
    Messages:
    401
    Likes Received:
    153
    Reputations:
    48
    хех не всё раскрыто =) как ты вышла на этот код:

    Code:
    004121F9   MOV DWORD PTR SS:[EBP-408],3E8 
    00412203   JGE ptdskhos.004122E7
    и почему это именно то что нам нужно? Просто не совсем понятно для какого уровня статья, если для новичков, то надо всё писать =)
     
  5. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    Бес праблем=) Отредактировала.

    Но аццкое крипто неасилила, жаль(
     
    #5 0x0c0de, 25 Jul 2007
    Last edited: 26 Jul 2007
    1 person likes this.
  6. GoreMaster

    GoreMaster Elder - Старейшина

    Joined:
    28 May 2007
    Messages:
    119
    Likes Received:
    32
    Reputations:
    4
    Лучше бы написала статью по закейгениванию этой проги. =)
    В остальном норм для новичков.
    P.s.: где-то я видел это аццкое крипто О_о
    P.P.S.: дай линк на софт =)
     
    #6 GoreMaster, 25 Jul 2007
    Last edited: 25 Jul 2007
  7. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    GoreMaster, крипто, что в фрагменте-это не то крипто. Завтра, если буду на форуме, дам линк или залью на обменник.
    PS Там хитрая манипуляция с регистрами. В частности, второй прыжок на плохой месаг - именно такая фигня(
     
    1 person likes this.
  8. taha

    taha Elder - Старейшина

    Joined:
    20 Aug 2006
    Messages:
    399
    Likes Received:
    330
    Reputations:
    251
    Так... мда... как ни крути, а тема является статьёй (хоть и не очень большой)
    переношу в соответсвующий раздел