_ ______________________ _ \ \\ _\ /_ // / ______ | __ | ______ \_ \_|_ / \ __ ___ __|_\_ \ / /_ \/ \/ \/ \ / _/ / /____/ / /__/\__\ _ /_/ _/____/___ \______________\__/_/__\___/_________/ wPx| /___/ | | TEAM-53.TUTORiALS.14 | !_ _! (____________________) [ iNLiNE PATCHiNG ASPROTECT 2 ] by lord_Phoenix / REVENGE INTRO: Вот недавно понадобилось сделать инлайн-патч для аспра. Почитав статью Alex’а, я сразу понял, что сделаю по-своему и понеслась.… Все будет «проделано» над InlineMe.exe, который вы найдете рядом со статьей. Слишком подробным объяснений не будет, так что жду ваших вопросов ;) TOOLS: - OllyDbg – отличный отладчик (можно использовать и SoftIce - большой разницы нет) - Hex Workshop – удобный hex-editor (можно использовать WinHex) - LordPE – pe-editor (можно использовать PeTools) START: Ну что ж начнем… Краткий экскурс(не очень то и подробный) в «начальную» работу ASProtect. Сначала идет 4 «слоя»-цикла расшифровки кода, причем каждый такой «слой» расшифровывает следующий. На 4-ом «слое» (прям Сумрак какой-то) происходит выделение памяти, с помощью VirtualAlloc. Дальнейшая расшифровка следующих «слоев» происходит в этой выделенной памяти. В конце концов ASProtect проверяет целостность файла, распаковывает/расшифровывает код защищенной программы, проверяет целостность памяти и т.д. Более информативная – «научная» выдержка из статьи «Исследование полиморфного движка ASProtect 1.23», wirepuller: Первичный распаковщик Наверное, нет смысла приводить его код. Принцип работы и внешний вид кода остается тем же. Общий смысл происходящего - для борьбы с отладкой (конкретнее с программными точками останова) в файле секции (причем как секции исходной программы, так и добавленные защитой) хранятся в зашифрованном виде и в пригодной для исполнения форме появляются только в памяти после распаковки. Для затруднения дизассемблирования алгоритма распаковки применяются мусорные инструкции и переходы (Условные, безусловные, вызовы функций. Насколько они внешне не похожи на обычные переходы мы видели) по адресам, которые дизассемблер не распознает как адреса начала инструкций. Заключение После прохождения всех циклов распаковки секций ASProtect'а начинается основная часть работы - расшифровка кода защищенной программы. Идея инлайн-патча состоит в последовательной передаче управления от тела аспра нашему коду и обратно, в конце концов «обойдя» проверку CRC, мы сможем пропатчить код программы. Сначала ASProtect расшифровывает 4 не динамических «куска» своего кода, причем 1-й расшифровывает 2-й, 3-й – 4-й. На данном этапе наша задача – после расшифровки каждого «куска» передавать управление нашему коду, а он будет изменять код только что расшифрованного «куска» и возвращать управление. Первое что мы сделаем - добавим немного «места» в InlineMe.exe для кода нашего патча. Открываем файл в LordPE, жмем Sections и изменяем Raw Size секции .adata на 1000h. Теперь открываем файл в HWS и идем в его конец, жмем Ctrl+Ins (или в конт. меню – Insert), вводим 1000h в Number of bytes, а в Fill with the following hex byte – 90h, жмем Ok и сохраняем изменения. Теперь ASProtect будет ругаться на CRC, но ничего, грузим файл в OllyDbg. Жмем Alt+M, секция .adata в памяти: Memory map, item 21 Address=00424000 Size=00001000 (4096.) Owner=InlineMe 00400000 Section=.adata Type=Imag 01001002 Access=R Initial access=RWE Follow in dump -> 00424000 Запускаем файл, и ищем в окне дампа наши 90h, у меня начинаются здесь - 00424CCC. Как видите, ASProtect затер CCCh байтов. Наш патч будет начинаться с 00424CCC. Теперь нам надо найти переход с первого во второй расшифрованный код. Трассируем до такого места: 00405158 81FB 3CF8FFFF CMP EBX,-7C4 0040515E 0F85 1E000000 JNZ InlineMe.00405182 00405164 66:81E1 EE8B AND CX,8BEE 00405169 E9 2B000000 JMP InlineMe.00405199 Выделенный переход мы заменим прыжком на код нашего патча. Нам надо будет поменять JMP 00405199 на JMP 00424CCC (пока не меняем, чтобы нормально трассировать код и дописывать патч). Дальше, ставим бряк на 405169. Брякнулись, трассим до: 00405226 48 DEC EAX 00405227 0F85 0C000000 JNZ InlineMe.00405239 0040522D E9 2A000000 JMP InlineMe.0040525C Вот этот прыжок мы должны изменить из нашего патча. Пишем первый «кусок» нашего кода: 00424CCC C705 2D524000 E9>MOV DWORD PTR DS:[40522D],1FAA9E9 00424CD6 -E9 BE04FEFF JMP InlineMe.00405199 Здесь мы меняем только что расшифрованный прыжок в теле аспра на прыжок в патч и возвращаем управление. Продолжаем… 004052D8 81FA B8F9FFFF CMP EDX,-648 004052DE 0F85 18000000 JNZ InlineMe.004052FC 004052E4 66:B9 2504 MOV CX,425 004052E8 E9 26000000 JMP InlineMe.00405313 Дописываем патч: 00424CDB C705 E8524000 E9>MOV DWORD PTR DS:[4052E8],1F9FDE9 00424CE5 -E9 2906FEFF JMP InlineMe.0040525C След. «слой»: 004053FD 81FF D8FAFFFF CMP EDI,-528 00405403 0F85 0D000000 JNZ InlineMe.00405416 00405409 E9 25000000 JMP InlineMe.00405433 След. часть патча: 00424CEA C705 09544000 E9>MOV DWORD PTR DS:[405409],1F8EBE9 00424CF4 -E9 1A06FEFF JMP InlineMe.00405313 И последний «слой» приводит нас сюда (запомните адрес): 00405433 E8 00000000 CALL InlineMe.00405438 00405438 5D POP EBP 00405439 5B POP EBX Дальше пойдет «динамическая» часть. ASProtect выделяет память, используя VirtualAlloc, и уже в этой динамически выделенной памяти продолжает расшифровку своего кода. Ставим бряк на VirtualAlloc. Брякнулись здесь: 004054DC 68 00100000 PUSH 1000 004054E1 FFB5 08040000 PUSH DWORD PTR SS:[EBP+408] 004054E7 6A 00 PUSH 0 004054E9 FF95 F0030000 CALL DWORD PTR SS:[EBP+3F0] 004054EF 8985 CC010000 MOV DWORD PTR SS:[EBP+1CC],EAX Скролим ниже до такого кода: 004055EF 53 PUSH EBX 004055F0 68 00800000 PUSH 8000 004055F5 6A 00 PUSH 0 004055F7 56 PUSH ESI 004055F8 FF95 F4030000 CALL DWORD PTR SS:[EBP+3F4] 004055FE 68 00000000 PUSH 0 00405603 C3 RETN Здесь в EDI лежит адрес выделенной памяти. Сделаем здесь прыжок в наш патч. 00424CF9 C705 F0554000 E91>MOV DWORD PTR DS:[4055F0],1F713E9 00424D03 -E9 5AFBFDFF JMP InlineMe.00405433 Трассируем до такого места, обдумываем и дописываем патч: 009000F3 68 00800000 PUSH 8000 009000F8 6A 00 PUSH 0 009000FA 50 PUSH EAX 009000FB FF95 7D294400 CALL DWORD PTR SS:[EBP+44297D] Этот код всегда находится от начала выделенной памяти на 400F3h (в EDI у меня было 008C0000h, а 008C0000h+400F3h=9000F3h). Теперь надо бы запомнить значение EDI, восстановить затертый код, изменить только что расшифрованный переход и вернуть управление: 00424D08 893D FC4F4200 MOV DWORD PTR DS:[424FFC],EDI 00424D0E C705 F0554000 68>MOV DWORD PTR DS:[4055F0],800068 00424D18 C787 F3000400 68>MOV DWORD PTR DS:[EDI+400F3],424D2E68 00424D22 C687 F8000400 C3 MOV BYTE PTR DS:[EDI+400F8],0C3 00424D29 -E9 C208FEFF JMP InlineMe.004055F0 424FFC – здесь будем хранить адрес выделенной памяти, это последний dword в нашем «месте» под патч. Дальше трассируем до такого кода: 009005C1 61 POPAD 009005C2 75 08 JNZ SHORT 009005CC 009005C4 B8 01000000 MOV EAX,1 009005C9 C2 0C00 RETN 0C 009005CC 68 00000000 PUSH 0 009005D1 C3 RETN Дописываем патч: 00424D2E 60 PUSHAD 00424D2F A1 FC4F4200 MOV EAX,DWORD PTR DS:[424FFC] 00424D34 C780 F3000400 68>MOV DWORD PTR DS:[EAX+400F3],800068 00424D3E C680 F8000400 6A MOV BYTE PTR DS:[EAX+400F8],6A 00424D45 C780 C1050400 68>MOV DWORD PTR DS:[EAX+405C1],424D6968 00424D4F 66:C780 C5050400>MOV WORD PTR DS:[EAX+405C5],0C300 00424D58 05 F3000400 ADD EAX,400F3 00424D5D A3 644D4200 MOV DWORD PTR DS:[424D64],EAX 00424D62 61 POPAD 00424D63 68 00000000 PUSH 0 00424D68 C3 RETN Теперь нам надо найти проверку целостности файла. Убираем все бряки и ставим бряк на MapViewOfFileEx и F9. Первый раз брякнемся в uxtheme.dll, жмем F9 еще раз. Брякнулись здесь: 008ED400 6A 00 PUSH 0 008ED402 6A 00 PUSH 0 008ED404 6A 00 PUSH 0 008ED406 6A 04 PUSH 4 008ED408 A1 58A58F00 MOV EAX,DWORD PTR DS:[8FA558] 008ED40D 50 PUSH EAX 008ED40E A1 D4278F00 MOV EAX,DWORD PTR DS:[8F27D4] 008ED413 8B40 08 MOV EAX,DWORD PTR DS:[EAX+8] 008ED416 FFD0 CALL EAX 008ED418 8BD8 MOV EBX,EAX 008ED41A 57 PUSH EDI 008ED41B E8 4B010000 CALL 008ED56B Call EAX – вызов MapViewOfFileEx. Здесь мы провернем такой трюк – после MapViewOfFileEx прыгнем на наш код, «обратим» все наши изменения в файле и вернем управление. В итоге ASProtect получит в памяти оригинал и с CRC все будет нормально. Push 4 надо изменить на Push 1, чтобы мы смогли сделать изменения в загруженном в память файле. Дописываем патч: 00424D69 60 PUSHAD 00424D6A A1 FC4F4200 MOV EAX,DWORD PTR DS:[424FFC] 00424D6F C780 C1050400 61>MOV DWORD PTR DS:[EAX+405C1],B8087561 00424D79 66:C780 C5050400>MOV WORD PTR DS:[EAX+405C5],1 00424D82 C680 07D40200 01 MOV BYTE PTR DS:[EAX+2D407],1 00424D89 C780 18D40200 68>MOV DWORD PTR DS:[EAX+2D418],424DAD68 00424D93 66:C780 1CD40200>MOV WORD PTR DS:[EAX+2D41C],0C300 00424D9C 05 C1050400 ADD EAX,405C1 00424DA1 A3 A84D4200 MOV DWORD PTR DS:[424DA8],EAX 00424DA6 61 POPAD 00424DA7 68 00000000 PUSH 0 00424DAC C3 RETN Теперь найдем след. «место» чтобы сделать там переход в последнюю часть патча. И это «место» - процедура проверки целостности памяти, в этот момент программа уже распакована и расшифрована - можно патчить. Найти процедуру проверки памяти можно поставив бряк на доступ к памяти на адрес из оригинальной программы и потом долго трассить код ASProtect. Я же упрощу вам все немного – найти эту процедуру можно и по сигнатуре - 5356575583C4D8. Вот она: 008EE13C 53 PUSH EBX 008EE13D 56 PUSH ESI 008EE13E 57 PUSH EDI 008EE13F 55 PUSH EBP 008EE140 83C4 D8 ADD ESP,-28 008EE143 A1 9C278F00 MOV EAX,DWORD PTR DS:[8F279C] 008EE148 C600 D2 MOV BYTE PTR DS:[EAX],0D2 008EE14B B2 01 MOV DL,1 008EE14D A1 F4B08D00 MOV EAX,DWORD PTR DS:[8DB0F4] 008EE152 E8 F9CFFEFF CALL 008DB150 008EE157 8BF0 MOV ESI,EAX 008EE159 E8 7EE7FFFF CALL 008EC8DC 008EE15E 8BD8 MOV EBX,EAX 008EE160 A1 E0278F00 MOV EAX,DWORD PTR DS:[8F27E0] 008EE165 8B00 MOV EAX,DWORD PTR DS:[EAX] 008EE167 8946 04 MOV DWORD PTR DS:[ESI+4],EAX 008EE16A A1 04278F00 MOV EAX,DWORD PTR DS:[8F2704] 008EE16F 8B00 MOV EAX,DWORD PTR DS:[EAX] 008EE171 33D2 XOR EDX,EDX 008EE173 8950 04 MOV DWORD PTR DS:[EAX+4],EDX 008EE176 A1 F0278F00 MOV EAX,DWORD PTR DS:[8F27F0] 008EE17B 8B00 MOV EAX,DWORD PTR DS:[EAX] 008EE17D 8B00 MOV EAX,DWORD PTR DS:[EAX] 008EE17F 8B15 04278F00 MOV EDX,DWORD PTR DS:[8F2704] 008EE185 8B12 MOV EDX,DWORD PTR DS:[EDX] Смещение от начала выделенной памяти – E17Fh. Сейчас нам надо «обойти» проверку CRC, в процедуре проверки вставить прыжок в последнюю часть патча и вернуть управление. Обход проверки CRC – установим в загруженном в память файле размер секции .adata в pe-header’е в 0, а также восстановим измененный прыжок в первом «слое» аспра (по адресу 00405169). Код: 00424DAD C680 99020000 00 MOV BYTE PTR DS:[EAX+299],0 00424DB4 C780 690D0000 E9>MOV DWORD PTR DS:[EAX+D69],2BE9 00424DBE 60 PUSHAD 00424DBF A1 FC4F4200 MOV EAX,DWORD PTR DS:[424FFC] 00424DC4 66:C780 1CD40200>MOV WORD PTR DS:[EAX+2D41C],14B 00424DCD C780 18D40200 8B>MOV DWORD PTR DS:[EAX+2D418],E857D88B 00424DD7 C680 07D40200 04 MOV BYTE PTR DS:[EAX+2D407],4 00424DDE C780 7FE10200 68>MOV DWORD PTR DS:[EAX+2E17F],424E0268 00424DE8 66:C780 83E10200>MOV WORD PTR DS:[EAX+2E183],0C300 00424DF1 05 18D40200 ADD EAX,2D418 00424DF6 A3 FD4D4200 MOV DWORD PTR DS:[424DFD],EAX 00424DFB 61 POPAD 00424DFC 68 00000000 PUSH 0 00424E01 C3 RETN Теперь последняя часть патча – восстановить код, затертый прыжком в патч из пред. слоя, и собственно пропатчить код только что расшифрованной программы. Эта статья не про распаковку и поиск нагов. Так что самостоятельно дойдите до OEP, используя спец. скрипт для OllyScript или же используйте старый добрый метод исключений. Вот собственно OEP: 00401000 >/$ B8 01000000 MOV EAX,1 00401005 |. 83F8 00 CMP EAX,0 00401008 |. 74 13 JE SHORT InlineMe.0040101D 0040100A |. 6A 00 PUSH 0 0040100C |. 68 2A304000 PUSH InlineMe.0040302A ; ASCII "Remove me.." 00401011 |. 68 17304000 PUSH InlineMe.00403017 ; ASCII "Remove this nag ;P" 00401016 |. 6A 00 PUSH 0 00401018 |. E8 71010000 CALL InlineMe.0040118E ; MessageBoxA Я уж сильно не старался «защитить» наг и сделал все без всяческих изощрений. Нам надо просто изменить байт по адресу 401008 с 74h на EBh. Последняя часть патча: 00424E02 60 PUSHAD 00424E03 33D2 XOR EDX,EDX 00424E05 8A15 FE4F4200 MOV DL,BYTE PTR DS:[424FFE] 00424E0B 80C2 03 ADD DL,3 00424E0E A1 FC4F4200 MOV EAX,DWORD PTR DS:[424FFC] 00424E13 C780 7FE10200 8B>MOV DWORD PTR DS:[EAX+2E17F],2704158B 00424E1D 66:8990 83E10200 MOV WORD PTR DS:[EAX+2E183],DX 00424E24 C605 08104000 EB MOV BYTE PTR DS:[401008],0EB 00424E2B 05 7FE10200 ADD EAX,2E17F 00424E30 A3 374E4200 MOV DWORD PTR DS:[424E37],EAX 00424E35 61 POPAD 00424E36 68 00000000 PUSH 0 00424E3B C3 RETN OUTRO: Если хотите – можете «отсечь» лишние NOP’ы в конце файла, чтобы уменьшить его размер, но тогда не забудьте уменьшить и размер .adata, а также подкорректировать код изменяющий размер .adata в памяти при проверке CRC. Спасибо за чтение этой статьи, надеюсь, что у вас все получилось, и вы чему-то научились ;) Все вопросы мне в аську – 657146, или на мыло – lord.Phoenix.revenge@gmail.com. Greetz: [Ru]Ban.OK!, 1nn0$/100, 4kusN!ck, ALe}{, AlexWolf, Amenesia, bLaCk-eYe, deroko, DOLTON, Drean, EGOiST, Funbit, Gelios, Grim Fandango, LeNgHoSt, MC707, Mercyful, Mr.Clumsy, n0thing, NCR, NG, N'JOY, nOT!, PlainTeXT, sanniassin, Skitz0, SofT MANiAC, sotona, Will Rite, Zer0, Zoom and many other positive ppl ;) Ps. См. приложение =) __ Best regardz… Date: 26.03.2006 © lord_Phoenix, 2006 Приложение 1 – «Код инлайн-патча с комментариям» 00424CCC C705 2D524000 E9>MOV DWORD PTR DS:[40522D],1FAA9E9 ; «вписываем» прыжок в 2-ую часть патча 00424CD6 -E9 BE04FEFF JMP InlineMe.00405199 ; возвращаем управление 00424CDB C705 E8524000 E9>MOV DWORD PTR DS:[4052E8],1F9FDE9 ; «вписываем» прыжок в 3-ую часть патча 00424CE5 -E9 7205FEFF JMP InlineMe.0040525C ; возвращаем управление 00424CEA C705 09544000 E9>MOV DWORD PTR DS:[405409],1F8EBE9 ; «вписываем» прыжок в 4-ую часть патча 00424CF4 -E9 1A06FEFF JMP InlineMe.00405313 ; возвращаем управление 00424CF9 C705 F0554000 E9>MOV DWORD PTR DS:[4055F0],1F713E9 ; «вписываем» прыжок в 5-ую часть патча 00424D03 -E9 2B07FEFF JMP InlineMe.00405433 ; возвращаем управление 00424D08 893D FC4F4200 MOV DWORD PTR DS:[424FFC],EDI ; сохраняем адрес выделенной памяти 00424D0E C705 F0554000 68>MOV DWORD PTR DS:[4055F0],800068 ; восстанавливаем затертый код 00424D18 C787 F3000400 68>MOV DWORD PTR DS:[EDI+400F3],424D2E68 ; «вписываем» прыжок в 6-ую часть патча 00424D22 C687 F8000400 C3 MOV BYTE PTR DS:[EDI+400F8],0C3 00424D29 -E9 C208FEFF JMP InlineMe.004055F0 ; возвращаем управление 00424D2E 60 PUSHAD 00424D2F A1 FC4F4200 MOV EAX,DWORD PTR DS:[424FFC] 00424D34 C780 F3000400 68>MOV DWORD PTR DS:[EAX+400F3],800068 ; восстанавливаем 00424D3E C680 F8000400 6A MOV BYTE PTR DS:[EAX+400F8],6A ; затертый код 00424D45 C780 C1050400 68>MOV DWORD PTR DS:[EAX+405C1],424D6968424D2E68 ; «вписываем» прыжок в 7-ую часть патча 00424D4F 66:C780 C5050400>MOV WORD PTR DS:[EAX+405C5],0C300 00424D58 05 F3000400 ADD EAX,400F3 00424D5D A3 644D4200 MOV DWORD PTR DS:[424D64],EAX ; меняем нижестоящий push 0 на push xxxxxx, где xxxxxx – адрес возврата 00424D62 61 POPAD 00424D63 68 00000000 PUSH 0 ; возвращаем управление 00424D68 C3 RETN 00424D69 60 PUSHAD 00424D6A A1 FC4F4200 MOV EAX,DWORD PTR DS:[424FFC] 00424D6F C780 C1050400 61>MOV DWORD PTR DS:[EAX+405C1],B8087561 ; восстанавливаем затертый код 00424D79 66:C780 C5050400>MOV WORD PTR DS:[EAX+405C5],1 00424D82 C680 07D40200 01 MOV BYTE PTR DS:[EAX+2D407],1 00424D89 C780 18D40200 68>MOV DWORD PTR DS:[EAX+2D418],424DAD68 ; «вписываем» прыжок в 8-ую часть патча 00424D93 66:C780 1CD40200>MOV WORD PTR DS:[EAX+2D41C],0C300 00424D9C 05 C1050400 ADD EAX,405C1 00424DA1 A3 A84D4200 MOV DWORD PTR DS:[424DA8],EAX меняем нижестоящий push 0 на push xxxxxx, где xxxxxx – адрес возврата 00424DA6 61 POPAD 00424DA7 68 00000000 PUSH 0 ; возвращаем управление 00424DAC C3 RETN 00424DAD C680 99020000 00 MOV BYTE PTR DS:[EAX+299],0 ; восстанавливаем оригинальный размер секции .adata 00424DB4 C780 690D0000 E9>MOV DWORD PTR DS:[EAX+D69],2BE9 ; восстанавливаем модифицированный первый прыжок 00424DBE 60 PUSHAD 00424DBF A1 FC4F4200 MOV EAX,DWORD PTR DS:[424FFC] 00424DC4 66:C780 1CD40200>MOV WORD PTR DS:[EAX+2D41C],14B ; восстанавливаем затертый код 00424DCD C780 18D40200 8B>MOV DWORD PTR DS:[EAX+2D418],E857D88B 00424DD7 C680 07D40200 04 MOV BYTE PTR DS:[EAX+2D407],4 00424DDE C780 7FE10200 68>MOV DWORD PTR DS:[EAX+2E17F],424E0268 ; «вписываем» прыжок в 9-ую часть патча 00424DE8 66:C780 83E10200>MOV WORD PTR DS:[EAX+2E183],0C300 00424DF1 05 18D40200 ADD EAX,2D418 00424DF6 A3 FD4D4200 MOV DWORD PTR DS:[424DFD],EAX меняем нижестоящий push 0 на push xxxxxx, где xxxxxx – адрес возврата 00424DFB 61 POPAD 00424DFC 68 00000000 PUSH 0 ; возвращаем управление 00424E01 C3 RETN 00424E02 60 PUSHAD 00424E03 33D2 XOR EDX,EDX 00424E05 8A15 FE4F4200 MOV DL,BYTE PTR DS:[424FFE] ; получаем начало адреса выделенной памяти 00424E0B 80C2 03 ADD DL,3 ; получаем затертый байт 00424E0E A1 FC4F4200 MOV EAX,DWORD PTR DS:[424FFC] 00424E13 C780 7FE10200 8B>MOV DWORD PTR DS:[EAX+2E17F],2704158B ; восстанавливаем затертый код 00424E1D 66:8990 83E10200 MOV WORD PTR DS:[EAX+2E183],DX ; восстанавливаем полученный байт 00424E24 C605 08104000 EB MOV BYTE PTR DS:[401008],0EB 00424E2B 05 7FE10200 ADD EAX,2E17F 00424E30 A3 374E4200 MOV DWORD PTR DS:[424E37],EAX 00424E35 61 POPAD 00424E36 68 00000000 PUSH 0 00424E3B C3 RETN Приложение 2 – «Код инлайн-патча для Copy-Paste Binary в OllyDbg» (специально для самых ленивых ;)) C7 05 2D 52 40 00 E9 A9 FA 01 E9 BE 04 FE FF C7 05 E8 52 40 00 E9 FD F9 01 E9 72 05 FE FF C7 05 09 54 40 00 E9 EB F8 01 E9 1A 06 FE FF C7 05 F0 55 40 00 E9 13 F7 01 E9 2B 07 FE FF 89 3D FC 4F 42 00 C7 05 F0 55 40 00 68 00 80 00 C7 87 F3 00 04 00 68 2E 4D 42 C6 87 F8 00 04 00 C3 E9 C2 08 FE FF 60 A1 FC 4F 42 00 C7 80 F3 00 04 00 68 00 80 00 C6 80 F8 00 04 00 6A C7 80 C1 05 04 00 68 69 4D 42 66 C7 80 C5 05 04 00 00 C3 05 F3 00 04 00 A3 64 4D 42 00 61 68 00 00 00 00 C3 60 A1 FC 4F 42 00 C7 80 C1 05 04 00 61 75 08 B8 66 C7 80 C5 05 04 00 01 00 C6 80 07 D4 02 00 01 C7 80 18 D4 02 00 68 AD 4D 42 66 C7 80 1C D4 02 00 00 C3 05 C1 05 04 00 A3 A8 4D 42 00 61 68 00 00 00 00 C3 C6 80 99 02 00 00 00 C7 80 69 0D 00 00 E9 2B 00 00 60 A1 FC 4F 42 00 66 C7 80 1C D4 02 00 4B 01 C7 80 18 D4 02 00 8B D8 57 E8 C6 80 07 D4 02 00 04 C7 80 7F E1 02 00 68 02 4E 42 66 C7 80 83 E1 02 00 00 C3 05 18 D4 02 00 A3 FD 4D 42 00 61 68 00 00 00 00 C3 60 33 D2 8A 15 FE 4F 42 00 80 C2 03 A1 FC 4F 42 00 C7 80 7F E1 02 00 8B 15 04 27 66 89 90 83 E1 02 00 C6 05 08 10 40 00 EB 05 7F E1 02 00 A3 37 4E 42 00 61 68 00 00 00 00 C3 Pps. Теперь точно все ;)