_ __________ _ ______ __________ _ __________ __/ _______________ _ __/ ___ \/ ________ _ ---------. _ ___ _/__/ _____) __________ \ / \zACK | / ___/_________ __/ _______/_______\/ \ | / / / /_____ / \___ / .......... ........... /______ / __ _ /_________/ /___.::::::::::: ::::::::::::: /_________/ /_________/ __::::::_____ :::' | ::::::...... .:::' : · T · E · A · M · 5 · 3 · `:::::::::::: ..:::::::: | ::: ::: `--------------------------->> >> >> .:::::: ::: .:::::: ::: TUTORiALS.PACK.NUMBER.ELEVEN ::::::: ::: ::::::: ::: ::::::::::::: ::::::::::::: `::::::::::' `::::::::::' SoftWrap 6.1.1 Loader Создание лоадера для библиотеки Softwrap Автор......: Gabri3l / ARTeam Перевод....: NightCat / TEAM-53 Цель.......: Professor Franklins' Instant Photo Effects 2 URL........: http://www.swsoftware.com/photo_software_effects.aspx Инструменты: PEID, Ollydbg, dUP Защита.....: Softwrap 6.1.1 Введение Этот туториал создан специально для цели указанной выше. Программа "весит" 80+ мегабайт, так что не все смогут её сказать. Но, если вы всё еще хотите следовать этому тутору, но вы можете скачать XPSmoker 4.4 (http://www.xp-smoker.com). Эта программа использует такую же версию softwrap. DLL загружается по другому офсету, так что во время пропатчивания ваши офсеты будут другими, но код останется таким же. По идее метод, который я опишу должен быть универсальным и подходить ко всем программам защищённым данной версией Softwrap. Начинаем! Сперва нам нужно лишь раз запустить программу, что увидеть наг, говорящий о том, что softwrap необходимо инициализироваться до того, как программа может быть запущена. Нажмите "Next" и пускай себе запускается. Затем закройте программу. Теперь у нас ест инициализированный Softwrap и мы можем приступить к "отключению ограничений". PEID показывается, что цель упакована Softwrap. Точная версия не даётся, но если нажать на кнопку "BUY" на наг-окне, то вы увидите, что версия защиты - 6.1.1. Убиваем Softwrap: 1. загрузите photon.exe в Ollydbg (убедитесь, что вы уже запустили программу первый раз, чтобы инициализировать softwrap) 2. Вы увидите массу исключений, которые защита использует для обнаружения дебаггеров. Так что в опциях вам следует включить следующее: - Ignore Memory Access Violations in Kernel32 - INT 3 - Single Step Breaks - Integer Divison by Zero - Also, in your custom exceptions add: C000001D (ILLEGAL INSTRUCTION) 3. Всё добавили? Хорошо, теперь F9! (RUN) Через секунду появится НАГ. 4. Окей, возвращаемся в Olly и жмём PAUSE. Затем View -> Call Stack. Вы должны увидеть что-то такое: Call stack of main thread Address Stack Procedure / arguments Called from Frame 0012F3F0 77D493F5 Includes ntdll.KiFastSystemCallRet USER32.77D493F3 0012F424 0012F3F4 77D6EA24 USER32.WaitMessage USER32.77D6EA1F 0012F424 0012F428 77D5688A USER32.77D6E895 USER32.77D56885 0012F424 0012F450 77D568CC USER32.77D567D4 USER32.77D568C7 0012F44C 0012F470 77D5892D USER32.DialogBoxIndirectParamAorW USER32.77D58928 0012F46C 0012F49C 00EA355F softwrap.00F35899 softwrap.00EA3559 0012F498 0012F4B4 00EA3876 softwrap.00EA353A softwrap.00EA3871 *Вот что создаёт наг!* 0012F4D4 0012F4D8 00EA40C9 softwrap.00EA37EC softwrap.00EA40C4 0012F4D4 0012FE24 00E919B8 softwrap.00EA3A69 softwrap.00E919B3 0012FE20 0012FE58 00508B3B Includes softwrap.00E919B8 Photon.00508B39 0012FE54 0012FF9C 00506F25 ? Photon.00508A87 Photon.00506F20 5. Помните, что это стек, а следовательно то, что находится в самом верху было вызвано недавно, а вот то, что внизу нам как раз и нужно. Внизу мы и видим те функции, которые вызвали НАГ. 6. Вы можете покликать дважды по каждой строке и увидеть, что это такое. Но я сохраню ваше время. 0012F4B4 00EA3876 softwrap.00EA353A <-- Вот эта функция создаёт nag. и, как мы видим, она вызывается из 000EA3871. 7. Та что правый клик и Go-To -> Expression, вводим 000EA3871, Ok. 8. Вы должны приземлиться тут: 00EA3871 E8 C4FCFFFF CALL softwrap.00EA353A 9. Правый клик и выбираем "Analyze code". Проскрольте вверх немного и вы увидите, что этот вызов выбран Select Case'ом. Я добавил немного комментариев, чтобы вам было легче разобраться что к чему. Откуда я знаю что к чему? Нуу, я использовал старый добрый метод проб и ошибок. 00EA3843 48 DEC EAX ; переключатель (случаи 1..4) 00EA3844 74 35 JE SHORT softwrap.00EA387B ; Прыгаем на инициализацию Softwrap. 00EA3846 48 DEC EAX 00EA3847 74 28 JE SHORT softwrap.00EA3871 ; Прыгаем на Softwrap'ный Nag 00EA3849 48 DEC EAX 00EA384A 74 1B JE SHORT softwrap.00EA3867 ; Прыгаем на ошибку сервера Softwrap 00EA384C 48 DEC EAX 00EA384D 0F85 A4010000 JNZ softwrap.00EA39F7 ; Прыгаем на уничтожение программы. 00EA3853 C705 48A6ED00 01>MOV DWORD PTR DS:[EDA648],1 ; Случай 4 свича 00EA3843 *ИМЕННО ЭТОТ НАМ И НУЖЕН! ЗАПУСК ПРОГРАММЫ БЕЗ НАГА И БЕЗ ТРИАЛА* 00EA385D E8 35A1FFFF CALL softwrap.00E9D997 00EA3862 E9 90010000 JMP softwrap.00EA39F7 00EA3867 E8 46FFFFFF CALL softwrap.00EA37B2 ; Случай 3 свича 00EA3843 00EA386C E9 86010000 JMP softwrap.00EA39F7 00EA3871 E8 C4FCFFFF CALL softwrap.00EA353A ; Случай 2 свича 00EA3843 00EA3876 E9 7C010000 JMP softwrap.00EA39F7 00EA387B 56 PUSH ESI ; Случай 1 свича 00EA3843 00EA387C 6A 08 PUSH 8 10. Итак, нам всегда нужно вызывать 4-й случай. Мы не можем проcто изменить этот код, т.к. он распакован в память. Вместо этого мы перезапустим программу и поставим брейкпоинт на начало свича. 11. Данная часть нас немного смутит, т.к. мы не может поставить обычный брейкпоинт, ибо: "проверка целостности". Когда дебаггер ставит брейкпоинт, он на самом деле перезаписывает инструкцию опкодом INT3. Тогда он и понимает, что нужно приостановить исполнение, когда срабатывает INT3. Это проблема, т.к. перезапись любой части программы заставит программу задетектить дебаггер. Так что мы поставим "memory breakpoint". Он не перезаписывает никакой код. 12. Перезапустим Photon.exe в Olly. Правый клик Go-To -> Expression, вводим 00EA3843. Хм, видим ошибку, что по данному адресу памяти нету... Всё дело в том, что Softwrap DLL пока не была запущена. 13. Выбираем "Debugging Options", затем "EVENTS" и ставим галку в "Break On New Module". 14. F9(RUN) и появится окно "Executable Modules". Softwrap DLL будет выделена красным. Двойной клик по ней. Теперь вы должны находиться внутри Softwrap DLL. 15. Правый клик, Go-To -> Expression, вводим 00EA3843. Жмём "Ok" и видим вот такое: 00EA3843 11DB ADC EBX,EBX 16. Э то нормально, т.к. DLL пока не была распакована в память. Нам всё еще нужно тут прерваться. Правый клик и выбираем Breakpoint -> Memory, On Access. Теперь мы будем прерываться каждый раз ,как программа обращается к данному участку памяти. 17. Мы почти готовы к запуску программы. Снимите глаку в "Break on New Module". F9(Run). 18. Вы прервётесь тут: 00F3499B 2B6E 14 SUB EBP,DWORD PTR DS:[ESI+14] 19. Снова нажмите F9(Run). Большинство функций на которых мы прервёмся будут относятся к распаковке DLL, так что они будут писать по тому адресу, на который мы поставили брейкпоинт. 20. Продолжайте жать F9(RUN) до тех пор, пока не прерветесь на 00EA3843, который теперь изменится на DEC EAX(а был "00EA3843 11DB ADC EBX,EBX", если кто забыл - прим. NCat). 21. Теперь мы там, где нужно. Если заглянуть в EAX, то видно, что он равен 2. Если мы глянем на код, который был выше, то увидим, что СЛУЧАЙ 2 ведёт к НАГу Softwrap. Нам это нужно изменить. Меняем JE SHORT softwrap.00EA3871 на JE SHORT softwrap.00EA3853, так что теперь у нас есть СЛУЧАЙ 4: MOV DWORD PTR DS:[EDA648],1. 22. Выбираем JE SHORT softwrap.00EA3871 и жмём SPACEBAR и вводим JE SHORT softwrap.00EA3853. Ввели? Хорошо, Теперь А9(RUN)... Хехей! Загружается без НАГа! (так же работает и если триал программы исчерпан) Создание Лоадера: 2. Мы не может пропатчить программу во время запуска из-за проверки на целостность, которая замечает любые модификации. Так что нам нужно сделать лоадер, который дождётся пока проверка на целостность не завершится и только потом пропатчит код. У нас даже есть программа, которая поможет нам это сделать - DUP. 3. Откройте dUP и выберите Offset Patch. В качестве оригинального файла выберите - Photon.exe 4. Поставьте галку в "Virtual Address Mode" (это для запакованных файлов). 5. Теперь нам нужно заменить JE SHORT softwrap.00EA3871 на JE SHORT softwrap.00EA3853. У меня это офсет 00EA3847. Меняя код в Olly мы видели это: 00EA3847 74 28 JE SHORT softwrap.00EA3871 **СТАНОВИТСЯ** 00EA3847 74 0A JE SHORT softwrap.00EA3853 7. Так что в поле "Add Bytes" введите 00EA3848 в качестве офсета, а в качестве оригинального байта введите 28. В качестве пропатченного байта - 0A. **ЗАМЕТЬТЕ, ЧТО У ВАС МОГУТ БЫТЬ СОВЕРШЕННО ДРУГИЕ ОФФСЕТЫ НА ВАШЕМ КОМПЬЮТЕРЫ** 8. Нажмите "ADD". 9. Внизу есть опция "MemCheck (for Loaders)". Нам нужно найти место в памяти, куда записывается DWORD-значение ПОСЛЕ проверки на целостность. Так что мы можем создать лоадер, который будет ждать появления этого самого ДВОРДа и только тогда пропатчит код. 11. До того, как мы продолжим нам необходимо проанализировать проблему. Мы знает, где программа проверяет зарегистрированность, так что проверка на целостность должна происходить где-то раньше. Шанс на то, что проверка целостности находится сразу ПЕРЕД проверкой на зарегистрированность существует. Так что мы скорее всего сможем найти место, куда записывается DWORD прямо перед проверкой. 12. Помните, когда мы первый раз запустили программу и остановились на NAGе? Мы посмотрели в стек. Это дало нам список вызовов сработавших до того, как появился NAG. Давайте снова посмотрим в стек: Call stack of main thread Address Stack Procedure / arguments Called from Frame 0012F3F0 77D493F5 Includes ntdll.KiFastSystemCallRet USER32.77D493F3 0012F424 0012F3F4 77D6EA24 USER32.WaitMessage USER32.77D6EA1F 0012F424 0012F428 77D5688A USER32.77D6E895 USER32.77D56885 0012F424 0012F450 77D568CC USER32.77D567D4 USER32.77D568C7 0012F44C 0012F470 77D5892D USER32.DialogBoxIndirectParamAorW USER32.77D58928 0012F46C 0012F49C 00EA355F softwrap.00F35899 softwrap.00EA3559 **ЭТО УЖЕ ПОСЛЕ НАГА, ТУТ ДВОРДА НЕ БУДЕТ** 0012F498 0012F4B4 00EA3876 softwrap.00EA353A softwrap.00EA3871 **ЭТОТ СОЗДАЁТ NAG** 0012F4D4 **ТАК ЧТО В ОДНОЙ ИЗ НИЖНИХ ФУНКЦИЙ НАМ НЕОБХОДИНО НАЙТИ МЕСТО, КУДА ПИШЕТСЯ DWORD** 0012F4D8 00EA40C9 softwrap.00EA37EC softwrap.00EA40C4 0012F4D4 0012FE24 00E919B8 softwrap.00EA3A69 softwrap.00E919B3 0012FE20 0012FE58 00508B3B Includes softwrap.00E919B8 Photon.00508B39 0012FE54 0012FF9C 00506F25 ? Photon.00508A87 Photon.00506F20 13. Некоторые наверно думаю: "Что ты имеешь ввиду, когда говоришь о том, что DWORD должен быть записан в память?" Давайте объясню: В Ассемблере мы можем писать в память программы. Чтобы это сделать мы используем инструкцию MOV. Она записываем значение справа по адресу слева. Пример: MOV EAX, ECX <-Записываем значение ECX в EAX. 14. Теперь мы пишем в память используя MOV с последующим типом данных, которые мы записываем. Пример: MOV BYTE PTR DS:[401000], FF <-Записываем BYTE FF в память по адресу 401000. DS - указывает Data Segment. Людай программа в памяти Windows имеет свой собственный сегмент данных для запуска. Так что когда мы пишем DS, то даём программе понять, что данные нужно записать по адресу 401000 в сегменте данных ЭТОЙ программы. 15. Так что мы ищем "MOV DWORD PTR DS:[XXXXXXX], XXX" 16. Загрузим Photon.exe в Olly. Убедитесь, что все исключения остались, как раньше (снимите галку с "Break on New Module"). 17. F9(Run) пока не появится NAG. 18. Когда ОН появился нажмите "pause", затем VIEW -> Call Stack. 19. Вы можете найти несколько инструкций "MOV DWORD PTR DS". Но большинство их них для нас не годятся, т.к. записывают нули. Я сохраню вам некоторое время. 20. Двойной клик по вот этой строке: 0012FE58 00508B3B Includes softwrap.00E919B8 Photon.00508B39 **Почему именно этой? Ну, вообще-то можно и другою, которая будет подходить идеально, это уже на ваше усмотрение. Просто я использую то, что меня подходит.** 21. После клика вы найдёте себя где-то тут: 00E9192D >/$ 55 PUSH EBP 00E9192E |. 8BEC MOV EBP,ESP 00E91930 |. 83EC 10 SUB ESP,10 00E91933 |. 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10] 00E91936 |. FF05 887DED00 INC DWORD PTR DS:[ED7D88] 00E9193C |. 833D 887DED00 >CMP DWORD PTR DS:[ED7D88],2 00E91943 |. 53 PUSH EBX 00E91944 |. 56 PUSH ESI 00E91945 |. 57 PUSH EDI 00E91946 |. A3 20A7ED00 MOV DWORD PTR DS:[EDA720],EAX 00E9194B |. 7C 56 JL SHORT softwrap.00E919A3 00E9194D |. E8 CF670200 CALL softwrap.00EB8121 00E91952 |. 8BF0 MOV ESI,EAX 00E91954 |. C1E6 10 SHL ESI,10 00E91957 |. E8 C5670200 CALL softwrap.00EB8121 00E9195C |. 6A 10 PUSH 10 00E9195E |. 03F0 ADD ESI,EAX 00E91960 |. 33DB XOR EBX,EBX 00E91962 |. 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10] 00E91965 |. 53 PUSH EBX 00E91966 |. 50 PUSH EAX 00E91967 |. 33FF XOR EDI,EDI 00E91969 |. E8 025C0200 CALL softwrap.00EB7570 00E9196E |. 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10] 00E91971 |. 50 PUSH EAX 00E91972 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] 00E91975 |. 56 PUSH ESI 00E91976 |. E8 62FDFFFF CALL softwrap.00E916DD 00E9197B |. 83C4 18 ADD ESP,18 00E9197E |. 83F8 FF CMP EAX,-1 00E91981 |. 74 1C JE SHORT softwrap.00E9199F 00E91983 |. 6A 01 PUSH 1 00E91985 |. 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10] 00E91988 |. 50 PUSH EAX 00E91989 |. FF75 0C PUSH DWORD PTR SS:[EBP+C] 00E9198C |. E8 0DFFFFFF CALL softwrap.00E9189E 00E91991 |. 83C4 0C ADD ESP,0C 00E91994 |. 83F8 FF CMP EAX,-1 00E91997 |. 75 04 JNZ SHORT softwrap.00E9199D 00E91999 |. 0BF8 OR EDI,EAX 00E9199B |. EB 02 JMP SHORT softwrap.00E9199F 00E9199D |> 8BFE MOV EDI,ESI 00E9199F |> 8BC7 MOV EAX,EDI 00E919A1 |. EB 67 JMP SHORT softwrap.00E91A0A 00E919A3 |> 6A 01 PUSH 1 00E919A5 |. 68 4944EC00 PUSH softwrap.00EC4449 00E919AA |. 33DB XOR EBX,EBX 00E919AC |. 53 PUSH EBX 00E919AD |. FF35 8C7DED00 PUSH DWORD PTR DS:[ED7D8C] ; softwrap.00E90000 00E919B3 |. E8 B1200100 CALL softwrap.00EA3A69 ************* 00E919B8 |. E8 64670200 CALL softwrap.00EB8121 ******ВЫ ТУТ****** ************* 00E919BD |. 8BF0 MOV ESI,EAX 00E919BF |. C1E6 10 SHL ESI,10 00E919C2 |. E8 5A670200 CALL softwrap.00EB8121 00E919C7 |. 6A 10 PUSH 10 00E919C9 |. 03F0 ADD ESI,EAX 00E919CB |. E8 055C0200 CALL softwrap.00EB75D5 00E919D0 |. 6A 10 PUSH 10 00E919D2 |. 8BF8 MOV EDI,EAX 00E919D4 |. 53 PUSH EBX 00E919D5 |. 57 PUSH EDI 00E919D6 |. E8 955B0200 CALL softwrap.00EB7570 00E919DB |. 57 PUSH EDI 00E919DC |. FF75 08 PUSH DWORD PTR SS:[EBP+8] 00E919DF |. 56 PUSH ESI 00E919E0 |. E8 F8FCFFFF CALL softwrap.00E916DD 00E919E5 |. 83C4 1C ADD ESP,1C 00E919E8 |. 83F8 FF CMP EAX,-1 00E919EB |. 74 14 JE SHORT softwrap.00E91A01 00E919ED |. 57 PUSH EDI 00E919EE |. FF75 0C PUSH DWORD PTR SS:[EBP+C] 00E919F1 |. E8 16FEFFFF CALL softwrap.00E9180C 00E919F6 |. 83CB FF OR EBX,FFFFFFFF 00E919F9 |. 3BC3 CMP EAX,EBX 00E919FB |. 59 POP ECX 00E919FC |. 59 POP ECX 00E919FD |. 74 02 JE SHORT softwrap.00E91A01 00E919FF |. 8BDE MOV EBX,ESI 00E91A01 |> 57 PUSH EDI 00E91A02 |. E8 C95B0200 CALL softwrap.00EB75D0 00E91A07 |. 59 POP ECX 00E91A08 |. 8BC3 MOV EAX,EBX 00E91A0A |> 5F POP EDI 00E91A0B |. 5E POP ESI 00E91A0C |. 5B POP EBX 00E91A0D |. C9 LEAVE 00E91A0E \. C3 RETN 22. Правый клик в Olly, выбираем "Analysis -> Analyze Code". Проскрольте вверх, пока не увидите весь код, который расположен выше. 21. "Ну и?" сказали вы. "Единственный "MOV PTR DWORD DS", который я тут вижу записывает EAX." Это правильно, но мы это использовать не будем. Вместо этого мы посмотрим на инструкции выше. 22. Посмотрите на строку 00E91936: 00E91936 |. FF05 887DED00 INC DWORD PTR DS:[ED7D88] 00E9193C |. 833D 887DED00 >CMP DWORD PTR DS:[ED7D88],2 23. Инструкция INC увеличивает значение на 1. Так что "INC INC DWORD PTR DS:[ED7D88]" добавит 1 к DWORD-значению хранящемуся в ED7D88. Посмотрев на код мы видим, что увеличивается ED7D88, затем проверяется, если там "2". Так что мы может предположить, что ED7D88 сперва хранит 00000000. Затем становится 00000001 (после INC инструкции). 24. Вернёмся в dUP и в поле MemoryAddress вводим 00ED7D88, а в поле MemoryValue - 00000001. **Почему все нули? Потому что это DWORD. Каждые '00' создают BYTE, два BYTE'a = WORD, ну а 4 BYTE'а = DWORD. Так что нам нужно 8 символов** 25. Теперь нажимаем "Create Loader". 26. Запускаем нам загрузчик и... (если всё прошло хорошо) ВСЁ РАБОТАЕТ! Больше никакого nag'a. 27. Переведите системную дату и попробуйте лоадерв действии снова! Работает! Отлично, вы только что победили Softwrap! Т.к. загрузчик основан на функциях и памяти DLL, то он должен работать на всех программах защищённых этой же версией и DLL. Заключение: Я использовал эту программу лишь в качестве демонстрации пропатчивания Softwrap. Если программа вам нравится и вы ей пользуетесь, то купите её! Если есть какие-либо предложения, комментарии или поправки, то пишите мне: Gabri3l2003[at]yahoo.com