/\                                             ___       /\
___/ /__________                         __________\  \______\ \____
\__       _\  _((-____________________  /      /    _____\      ___/
   \     \    \     \    _     \      \/      /    ___(  /     /
    \___  \__________\___|_____/______\/______\___/     /  ___/
       /__///- -       TFT PROUDLY PRESENTS        - -\\\__\ 
          TEAM FIFTY THREE TUTORiALS PACK NUMBER NiNETEEN

Взлом компонента для Делфи TMS AdvGlowButton


Автор: kaiZer/TEAM-53
Дата: 02.09.2007

Инструменты: Delphi, OllyDbg, Hiew


Вступление.
	
AdvGlowButton - неплохой компонент в виде кнопки для среды разработки программ Delphi. Но, как и многие другие компоненты, оставляет след в программе, в которой присутствует этот компонент. Сейчас мы с этим разберемся.	


Исследование.

Устанавливаем компонент, создаем новый проект, кидаем на форму AdvGlowButton, запускаем программу. Пока все нормально. Сохраняем проект. Выходим из Delphi. Запускаем программу снова и видим, что вылетело окошко с надписью "Application uses trial version of TMS software components". Это, естественно, значит, что компонент не куплен, а просто скачан и используется в целях ознакомления с компонентом. И, если вы не купили этот компонент, то это окошко всегда будет вылетать. Плохо, что такой неплохой компонент, и портит все это окошко с плохой надписью! Будем разбираться.
Загружаем файл AdvGlowButtonPkgD7.bpl в OllyDbg. Я использовал Delphi 7, поэтому и файл *.bpl с окончанием D7. Загрузили.
Ищем в отладчике строку "Application uses trial version of TMS software components". Нашли!


003BEE44 >/$ 832D 70103C00 >SUB DWORD PTR DS:[3C1070],1
003BEE4B  |. 73 33          JNB SHORT AdvGlowB.003BEE80
003BEE4D  |. 6A 00          PUSH 0                                   ; /Title = NULL
003BEE4F  |. 68 84EE3B00    PUSH AdvGlowB.003BEE84                   ; |Class = "TApplication"
003BEE54  |. E8 F326FFFF    CALL <JMP.&user32.FindWindowA>           ; \FindWindowA
003BEE59  |. 85C0           TEST EAX,EAX
003BEE5B  |. 74 10          JE SHORT AdvGlowB.003BEE6D
003BEE5D  |. 6A 00          PUSH 0                                   ; /Title = NULL
003BEE5F  |. 68 94EE3B00    PUSH AdvGlowB.003BEE94                   ; |Class = "TAppBuilder"
003BEE64  |. E8 E326FFFF    CALL <JMP.&user32.FindWindowA>           ; \FindWindowA
003BEE69  |. 85C0           TEST EAX,EAX
003BEE6B  |. 75 13          JNZ SHORT AdvGlowB.003BEE80
003BEE6D  |> 6A 00          PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
003BEE6F  |. 68 A0EE3B00    PUSH AdvGlowB.003BEEA0                   ; |Title = "Info"
003BEE74  |. 68 A8EE3B00    PUSH AdvGlowB.003BEEA8                   ; |Text = "Application uses trial version of TMS software components"
003BEE79  |. 6A 00          PUSH 0                                   ; |hOwner = NULL
003BEE7B  |. E8 E426FFFF    CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
003BEE80  \> C3             RETN


Сейчас поясню, что здесь происходит.


1) Первая часть.

003BEE4D  |. 6A 00          PUSH 0                                   ; /Title = NULL
003BEE4F  |. 68 84EE3B00    PUSH AdvGlowB.003BEE84                   ; |Class = "TApplication"
003BEE54  |. E8 F326FFFF    CALL <JMP.&user32.FindWindowA>           ; \FindWindowA
003BEE59  |. 85C0           TEST EAX,EAX
003BEE5B  |. 74 10          JE SHORT AdvGlowB.003BEE6D

Здесь происходит поиск окна программы, написанной на Delphi с использованием компонента, который мы исследуем. Если окно программы найдено, то выскакивает окошко с надписью "Application uses trial version of TMS software components".


2) Вторая часть.

003BEE5D  |. 6A 00          PUSH 0                                   ; /Title = NULL
003BEE5F  |. 68 94EE3B00    PUSH AdvGlowB.003BEE94                   ; |Class = "TAppBuilder"
003BEE64  |. E8 E326FFFF    CALL <JMP.&user32.FindWindowA>           ; \FindWindowA
003BEE69  |. 85C0           TEST EAX,EAX
003BEE6B  |. 75 13          JNZ SHORT AdvGlowB.003BEE80

Здесь происходит поиск окна самого Delphi, если же таковое найдено, то окошко с надписью "Application uses trial version of TMS software components" не выскакивает.


3) Заключение.

Получается, что если окно Delphi запущено и/или окно программы с запущенным Delphi, то назойливое окошко выскакивает, если же Delphi не запущен, то при запуске программы будет вылетать окошко.


Я проверил, что файл *.bpl не участвует в отображении назойливого окошка. Но что же может быть тогда? Я поискал и нашел в файле AdvGlowButton.dcu строку "Application uses trial version of TMS software components". Это очень хорошо! Сразу скажу, что именно его придется патчить.
В OllyDbg этот файл открыть не получится, но получится в Hiew. Открываем. Нажимаем F4 и выбираем режим "Hex", далее жмем F7, переходим к "ASCII" и вводим либо нашу строку, либо часть ее. Найдено! Затем жмем F4 и выбираем "Decode". Чуть выше будет нужный нам код.


¦ 00012407: 684000                       push        00040 ;' @'
¦ 0001240A: 0000                         add         [bx][si],al
¦ 0001240C: E80000                       call        00001240F --?1
¦ 0001240F: 0000                        1add         [bx][si],al
¦ 00012411: 85C0                         test        ax,ax
¦ 00012413: 7410                         je          000012425 --?2
¦ 00012415: 6A00                         push        0
¦ 00012417: 685000                       push        00050 ;' P'
¦ 0001241A: 0000                         add         [bx][si],al
¦ 0001241C: E80000                       call        00001241F --?3
¦ 0001241F: 0000                        3add         [bx][si],al
¦ 00012421: 85C0			 test	     ax,ax
¦ 00012423: 7513			 jne	     000012438 --?1
¦ 00012425: 6A00			 push	     0
¦ 00012427: 685C00			 push	     0005C ;' \'
¦ 0001242A: 0000			 add	     [bx][si],al
¦ 0001242C: 686400			 push	     00064 ;' d'
¦ 0001242F: 0000			 add	     [bx][si],al
¦ 00012431: 6A00			 push	     0
¦ 00012433: E80000			 call	     000012436 --?2
¦ 00012436: 0000			 2add	     [bx][si],al
¦ 00012438: C3				 1retn


Этот код аналогичен тому, который был получен с помощью OllyDbg. Сейчас объясню, что и где патчить.


1) Первая часть.

¦ 00012411: 85C0                         test        ax,ax
¦ 00012413: 7410                         je          000012425 --?2

Здесь происходит поиск окна программы, написанной на Delphi с использованием компонента, который мы исследуем. Если окно программы найдено, то выскакивает окошко с надписью "Application uses trial version of TMS software components".
Заменяем "je 000012425" на "jmp 000012415", т.е. в любом случае программа будет прыгать на адрес и 000012415 и там уже проверяется на наличие Delphi. Но и это еще не все!


2) Вторая часть.

¦ 00012421: 85C0			 test	     ax,ax
¦ 00012423: 7513			 jne	     000012438 --?1

Здесь происходит поиск окна самого Delphi, если же таковое найдено, то окошко с надписью "Application uses trial version of TMS software components" не выскакивает.
Здесь заменяем "jne 000012438" на "jmp 000012438", т.е. программа в любом случае будет прыгать на адрес 000012438.


Заключение.

Вот и все! Теперь окошко с назойливой надписью никогда не будет выскакивать!