/\ ___ /\ ___/ /__________ __________\ \______\ \____ \__ _\ _((-____________________ / / _____\ ___/ \ \ \ \ _ \ \/ / ___( / / \___ \__________\___|_____/______\/______\___/ / ___/ /__///- - 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 ; \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 ; \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 ; \MessageBoxA 003BEE80 \> C3 RETN Сейчас поясню, что здесь происходит. 1) Первая часть. 003BEE4D |. 6A 00 PUSH 0 ; /Title = NULL 003BEE4F |. 68 84EE3B00 PUSH AdvGlowB.003BEE84 ; |Class = "TApplication" 003BEE54 |. E8 F326FFFF CALL ; \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 ; \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. Заключение. Вот и все! Теперь окошко с назойливой надписью никогда не будет выскакивать!