eXeL@B —› Оффтоп —› VMProtect… |
<< . 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 21 апреля 2007 19:51 · Личное сообщение · #1 Товарищем dermatolog было предложено лично(!), создать топик для побайтного разбора на CRACKLAB.RU его ВМ (чисто ради интеллектуально-спортивного интереса, сталобыть партия в шахматы, где проигравших нет) Топик расписан в такой манере, для того чтобы снять комплекс (с тех, кто неуверен, что это возможно сделать(себя тоже сюда приплюсую)) С чем предстоит столкнуться (быстрый предварительный анализ) много кода в открытом виде, хм… вполне возможен копипаст , поставим нам за это +1 шелкод неюзается, разочаровало, но нам опять +1 мусор в ВМ незначительный, сталобыть значит, его вообще нет, еще в нашу копилку +1 пермутатора/мутатора не заметил, но кто знает, может гений инженерной мысли, нам это предоставил на закуску, еще, но уже такой ?1 проверка на бряк сисфунок (первый байт 0CCh) в открытом виде, -1 VMProtect импорт вроде неизгажен - ИМХО (быстрый предварительный анализ показал - что в теле ВМ переходник спрятан в открытом виде) предстоит разобрать 48 фунок, пропарсить внутренний стек (уж очень активно юзаеццо), сделать несколько таблиц и т. д. написать статью как мне кажется это глупо, а сталобыть не реально и подсилу только нескольким людям (а попробовать всем хоццо) – ИМХО (в принципе это уже можно считать как защиту) поэтому был создан топик для неограниченного числа людей, кто захочет понять, как это работает, ну и сталобыть кто самостоятельно нароет что-нибудь интересное, сможет здесь написать и объяснить подробно об этом, для того чтобы другие уже не изучали/анализировали этот участок кода, еще +1 что потребуеццо знание ASM (средние), желательно еще несколько доп. ЯВУ умение вступать и компилировать(обязательно) сам срякмикс (сорри не удержался) скачать его можно в той теме (его мы и будем подробненько разбирать) – (комментарий) у меня сложилось впечатление, что полностью весь рабочий код прожки был покрыт VMProtect(ИМХО), но нас это не остановит… мой плагин (без него никак - ИМХО), чтобы избавиться от статик/~динамик анализа свободное время и большое желание (времени очень много, но вот свободного как всегда ну очень мало) цель восстановить оригинальный код, если потребуется перекомпилировать… !!!WARNING!!! людей страдающих головокружением просьба не беспокоиться (за смерть головой-апстол ответственности не несем) Посты с двумя словами не приветствуюцца Пока будем пытаться победить танк… палками и камнями в тазике, но кто знает, что можно найти на своем пути ради победы ;) Всем нам свойственно ошибаться, но методом проб и ошибок, сталобыть методом тыка, всегда можно добиться положительного результата… Если кто за, прошу отписаться здесь... P. S. Если да, то завтра начну первый слив инфы, которую нарыл, не супер, но кое-что имеецца (мегакультных-крЭкеров просьба не обращать на наш скромный топик никакого внимания, ну и сталобыть для себя нового ВЫ ничего не найдете…) (все это для чайнЕка(такого как я), ну и для тех, кто просто горит/загорится желанием разобрать VMProtect) Здесь приветствуется инфа от знающих людей, хотелось бы обсуждать эту ВМ в форме полностью доступной для новичков (если что где непонятно и хотелось бы подробнее, спрашивайте, такие вопросы(без них стопудофф никак) приветствуюццо, но про поиск по сайту и т. д. не забывайте…) Пссс Я не крЭкер – не ломаю ничего… Я кодер – создатель & рипер – собиратель душ (для коллекции) заюзав поиск по сайту, я заметил, что тех, кто поднимают руку на VMProtect, принижают незаслуженно, значит надо восстановить равновесие PP. S. Если все получиться и топик большинству понравиться, будет создан другой для разбора следующей ВМ, нет(!), делов-то, закрою и все… Не будет желающих(!) тоже закрою… Не спорю, всегда было трудно поднимать темы про разбор любого ВМ, но, а вдруг получиться? Надеюсь, что все это не сочтут за флуд… ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 24 апреля 2007 19:41 · Личное сообщение · #2 dermatolog пишет: это ИСПОЛНИТЕЛЬ байткода. Да-да, согласен, псссиб баааальшое за подсказку! Подведем незначительно-предварительные итоги того, что мы имеем на данный момент на паблике о фул-версии… Байт-код это на что указывает регистр “ESI”, сталобыть в нем находиться указатель на адрес в памяти, где находиться сам Байт-код, 093h - это так для примера, я уже точно не помню ;) После преобразования получается индекс смещения в таблице 10h А вот сам код (то, что я называю функой, является – ИСПОЛНИТЕЛЕМ байт-кода) Вот так выглядит ИСПОЛНИТЕЛЬ БАЙТ-КОДА в фул-версии: 0040755C NOT AH 0040755E MOV EAX,DWORD PTR SS:[EBP] 00407561 PUSHFD 00407562 LEA ESP,DWORD PTR SS:[ESP+4] 00407566 JNS 004070B6 0040756C PUSH D39FCCAC 00407571 PUSHAD 00407572 MOV EAX,DWORD PTR SS:[EAX] 00407575 CALL 0040864F 0040864F MOV DWORD PTR SS:[EBP],EAX 00408652 MOV BYTE PTR SS:[ESP],AL 00408655 PUSHFD 00408656 LEA ESP,DWORD PTR SS:[ESP+2C] 0040865A JMP 00401177 А вот так в демо-версии: 004566B4 MOV EAX,DWORD PTR SS:[EBP] 004566B7 MOV EAX,DWORD PTR SS:[EAX] 004566BA MOV DWORD PTR SS:[EBP],EAX 004566BD JMP 004560C9 Из выделенных участков кода мы видим, что код в фул-версии НЕ БЫЛ СУПЕР-ЗАМОРФЕН, так как находится в открытом виде: Сталобыть подтвержден факт того, что в фул-версии были пока(!) обнаружены два движка – это двиг самого ВМ и движка обычного ОБФУСКАТОРА… Кто не согласен с моим мнением – прошу высказаться?! (всегда готов почерпнуть новые знания…) ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 25 апреля 2007 19:13 · Личное сообщение · #3 0040FBE0 55 PUSH EBP 0040FBE1 8BEC MOV EBP,ESP 0040FBE3 6A FF PUSH -1 0040FBE5 68 D0834100 PUSH 004183D0 0040FBEA 68 58104100 PUSH 00411058 Покрываем это EP демкой, и сделаем быстрый анализ, вот результаты: (жесть, но я покрыл демкой прогу с защитой, для того чтобы пропачить ВМ и посмотреть на результаты… (результаты этого эксперимента я оставлю как великую святую тайну…)) Это как выглядит код оригинальной проги 6A FF PUSH -1 – опкод 6A А вот так это выглядит в ВМ (ДЕМО) 61 FF – байт-код ВМ 61 вот так запускается исполнитель байт-кода 0042C617 MOV AL,BYTE PTR DS:[ESI] EAX=00000061 0042C619 INC ESI ESI=0042D111 \это EIP 0042C61A MOVZX EAX,AL 0042C61D JMP NEAR DWORD PTR DS:[EAX*4+42C13F] DS:[0042C2C3]=0042C5C4 А вот это функа самого исполнителя байт-кода (Расширяет знаковый байт, до знакового двойного слова и кладет его в стек) 0042C5C4 MOV AL,BYTE PTR DS:[ESI] EAX=000000FF 0042C5C6 INC ESI ESI=0042D112 0042C5C7 CBW EAX=0000FFFF 0042C5C9 CWDE EAX=FFFFFFFF 0042C5CA SUB EBP,4 EBP=0012FFBC 0042C5CD MOV DWORD PTR SS:[EBP],EAX \здесь записывается в стек результат полученного значения 0042C5D0 JMP 0042C0D6 Продолжим дальше… Это как выглядит код оригинальной проги 68 D0834100 PUSH 004183D0 А вот так это выглядит в ВМ (ДЕМО) 5F D0834100 – байт-код ВМ 5F вот так запускается исполнитель байт-кода 0042C617 MOV AL,BYTE PTR DS:[ESI] EAX=0012FF5F 0042C619 INC ESI ESI=0042D113 0042C61A MOVZX EAX,AL EAX=0000005F 0042C61D JMP NEAR DWORD PTR DS:[EAX*4+42C13F] DS:[0042C2BB]=0042C012 А вот это функа самого исполнителя байт-кода (осуществляет чтение из памяти “ВМ” двойного слова находящегося после байт-кода и записывает в стек) 0042C012 MOV EAX,DWORD PTR DS:[ESI] EAX=004183D0 0042C014 SUB EBP,4 EBP=0012FFB8 0042C017 MOV DWORD PTR SS:[EBP],EAX \здесь записывается в стек результат полученного значения 0042C01A LEA ESI,DWORD PTR DS:[ESI+4] ESI=0042D117 0042C01D JMP 0042C0D6 А теперь посмотрим, что же у нас получается ОРИГИНАЛ 0040FBE3 6A FF \ PUSH -1 0040FBE5 68 D0834100 \ PUSH 004183D0 0040FBEA 68 58104100 \ PUSH 00411058 “ВМ” 0042D110 61 FF 0042D112 5F D0834100 0042D117 5F 58104100 Из этих результатов видно, что движок “ВМ” (ДЕМО) берет оригинальный опкод (в данном случае PUSH) проги и, сделав обычную операцию вычитания из опкода значения 09, записывает его в свое адресное пространство, а данные находящиеся после опкода просто копирует… Отсюда можно заключить что двиг “ВМ” содержит в себе обычный дизасмдлин и супер-примитивное алго вычитания, Мда… “ВПЕЧАТЛЯЕТ” просто Ах(Пиии.....)!!! (а, да чуть про копипаст не забыл…) ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 25 апреля 2007 20:02 · Личное сообщение · #4 |
|
Создано: 25 апреля 2007 21:22 · Личное сообщение · #5 |
|
Создано: 25 апреля 2007 21:50 · Личное сообщение · #6 |
|
Создано: 25 апреля 2007 22:46 · Личное сообщение · #7 |
|
Создано: 25 апреля 2007 23:05 · Поправил: Модератор · Личное сообщение · #8 |
|
Создано: 25 апреля 2007 23:31 · Поправил: sniperZ · Личное сообщение · #9 |
|
Создано: 25 апреля 2007 23:53 · Личное сообщение · #10 |
|
Создано: 26 апреля 2007 07:25 · Личное сообщение · #11 Demon666 пишет: Значит, ТЕМА никому не нужна, закрываю… Нет нет - тема очень нужная, я её читаю перед сном ) Demon666 пишет: 0040FBE3 6A FF \ PUSH -1 0040FBE5 68 D0834100 \ PUSH 004183D0 0040FBEA 68 58104100 \ PUSH 00411058 “ВМ” 0042D110 61 FF 0042D112 5F D0834100 0042D117 5F 58104100 Дак вот чтобы в байткоде не было констант в оригинальном виде есть опция "Скрывать константы" Demon666 пишет: Отсюда можно заключить что двиг “ВМ” содержит в себе обычный дизасмдлин и супер-примитивное алго вычитания Это тебе просто так пропёрло ) Если бы ты еще раз запустил компиляцию в демке, то у тебя бы был уже совсем другой "примитивный" алго. А так в целом неплохо - есть над чем поржать. |
|
Создано: 27 апреля 2007 04:14 · Личное сообщение · #12 |
|
Создано: 27 апреля 2007 07:12 · Личное сообщение · #13 |
|
Создано: 27 апреля 2007 10:03 · Личное сообщение · #14 |
|
Создано: 27 апреля 2007 10:22 · Личное сообщение · #15 |
|
Создано: 27 апреля 2007 12:00 · Личное сообщение · #16 |
|
Создано: 27 апреля 2007 12:35 · Личное сообщение · #17 |
|
Создано: 27 апреля 2007 12:44 · Поправил: WoLFeR · Личное сообщение · #18 |
|
Создано: 27 апреля 2007 13:33 · Личное сообщение · #19 |
|
Создано: 27 апреля 2007 14:06 · Личное сообщение · #20 pavka пишет: Так может проще на декомпилер скинутся? Проще написать нужный плагин и получить декомпиль нахаляву для личного пользования. Вот только кто только не начинал писать плагины, 99% забили на полпути PS: Это офтоп, потому предлагаю любые ответы на данный пост в личку или на мыло ----- Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе! |
|
Создано: 27 апреля 2007 17:24 · Личное сообщение · #21 |
|
Создано: 28 апреля 2007 01:49 · Личное сообщение · #22 WoLFeR Думаю, это может объяснить, почему он ее не дает… Посмотрим на инициализацию внутренних регистров “ВМ” (в демо - так проще для понимания написанного), интерфейс “ВМ” с реальным стеком, и сравним с фул-версией (попробуем определить уровень мутатора) Две копии, покрытые демо и их начало, после того как попадаем внутрь волшебного CALL`а 0040FBE0 PUSH EBP<-------------------------------------->0040FBE0 PUSH EBP 0040FBE1 MOV EBP,ESP<--------------------------------->0040FBE1 MOV EBP,ESP EBP=0012FFC0 0040FBE3 PUSH 0042C77F<------------------------------>0040FBE3 PUSH 0042C7CE 0040FBE8 CALL 0042C751<------------------------------>0040FBE8 CALL 0042C110 0042C751 PUSH EDX<------------------------------------->0042C110 PUSH ECX 0042C752 PUSH EBX<------------------------------------->0042C111 PUSH EBP 0042C753 PUSH EAX<------------------------------------->0042C112 PUSH EDX 0042C754 PUSH EBX<------------------------------------->0042C113 PUSH EAX 0042C755 PUSH EBP<------------------------------------->0042C114 PUSH EDX 0042C756 PUSH EDI<-------------------------------------->0042C115 PUSH EDI 0042C757 PUSHFD<---------------------------------------->0042C116 PUSH ESI 0042C758 PUSH ESI<-------------------------------------->0042C117 PUSH EBX 0042C759 PUSH ECX<------------------------------------->0042C118 PUSHFD 0042C75A PUSH 0<----------------------------------------->0042C119 PUSH 0 0042C75F MOV ESI,DWORD PTR SS:[ESP+2C] <------>0042C11E MOV ESI,DWORD PTR SS:[ESP+2C] ESI=0042C77F<---------------------------------------------> ESI=0042C7CE 0042C763 MOV EBP,ESP<--------------------------------->0042C122 MOV EBP,ESP EBP=0012FF90 0042C765 SUB ESP,0C0<---------------------------------->0042C124 SUB ESP,0C0 ESP=0012FED0 0042C76B MOV EDI,ESP<---------------------------------->0042C12A MOV EDI,ESP EDI=0012FED0 Тут сразу становиццо видно как работает движок “ВМ”, изменяется очередность записи в стек значения регистров и изменяется адресное пространство, где находиться начало кода “ВМ” Начало памяти регистров сохраняется в регистре EDI Первые 12 байт-кода “ВМ” в ее адресном пространстве, осуществляют как раз инициализацию регистров (сохраняют в выделенном адресном пространстве значение регистров) ну, чтоже посмотрим, как реализован сам интерфейс на примере: (этот исполнитель байт-кода является одним из основным механизмом в “ВМ”(демо)) (таблица – это тоже самое, что и адресное пространство просто так короче) 0042C684 AND AL,3C \ здесь байт-код превращается в индекс смещения в таблице регистров, так называемая маска (выравнивание) 0042C687 MOV EDX,DWORD PTR SS:[EBP] \ регистр EBP в “ВМ” по сути, тоже, что и ESP для стека 0042C68A ADD EBP,4 0042C68D MOV DWORD PTR DS:[EDI+EAX],EDX \ здесь происходит сохранение значения регистра в таблице регистров 0042C690 JMP 0042C12F Короче советую потресить чуть, и понаблюдать за телодвижениями в стеке, так будет легче понять мои комментарии Ну, а теперь таже функа в фул-версии (я выделил код специально, чтобы легче визуально воспринимать было) (в фул-версии алго получения индекса немного отличается, но принцип остался такимже) 004087C8 STC 004087C9 ROL AL,1 EAX=0000007F 004087CB DEC DL EDX=000000FF 004087CD BSWAP DX EDX=00000000 004087D0 MOV DL,4B EDX=0000004B 004087D2 INC DX EDX=0000004C 004087D5 DEC AL EAX=0000007E 004087D7 MOV DX,BX EDX=0000779C 004087DA DH,CL EDX=0000009C 004087DC OR DH,DH 004087DE PUSH EDI 004087DF XOR AL,0BE EAX=000000C0 004087E1 DH,AH 004087E3 SUB AL,0AC EAX=00000014 004087E5 DEC DX EDX=0000009B 004087E8 SUB DH,DH 004087EA XOR AL,97 EAX=00000083 004087EC PUSHAD 004087ED BSWAP DX EDX=00000000 004087F0 ROR AL,4 EAX=00000038 004087F3 CMC 004087F4 STC 004087F5 MOVSX DX,DL 004087F9 BT DX,6 004087FE AND AL,3C 00408801 CMC 00408802 CLC 00408803 MOV EDX,DWORD PTR SS:[EBP] 00408806 PUSHFD 00408807 CMC 00408808 TEST DH,CH 0040880A ADD EBP,4 EBP=0012FF9C 0040880D JMP 00408718 00408718 PUSHFD 00408719 PUSHFD 0040871A MOV BYTE PTR SS:[ESP+8],0AB 0040871F MOV DWORD PTR DS:[EDI+EAX],EDX 00408722 MOV BYTE PTR SS:[ESP],AL 00408725 PUSHFD 00408726 PUSH ESI 00408727 LEA ESP,DWORD PTR SS:[ESP+38] 0040872B JMP 00401177 Так, наконец, мы, подошли к тому от чего начинали %) Сам “мутатор”, вернее плоды его творений (я расставил в комментариях оригинальные команды и специально мусор убрал (от любопытных глаз), чтобы понятнее было) Это начало строго запрещается анализировать ньюбикам (смерть апстол обеспечена %)) 00401025 CALL 004080D6 004080D6 PUSHFD 00401BE4 PUSHFD 00401BE5 MOV DWORD PTR SS:[ESP+4],ESI ; PUSH ESI 00401BF1 PUSHFD; PUSHFD ; тут местами надо поменять с EDX 00401BF2 MOV DWORD PTR SS:[ESP+4],EDX; PUSH EDX 00401C03 PUSH ESP 00401C04 PUSH 1DB16FF7 00401C09 MOV DWORD PTR SS:[ESP+4],EBX; PUSH EBX 00401C0E CALL 00407817 00407817 MOV DWORD PTR SS:[ESP+4],EBP; PUSH EBP 00407820 MOV DWORD PTR SS:[ESP],ECX; PUSH ECX 00407826 PUSH EDI 0040782C CALL 00408152 00408152 MOV DWORD PTR SS:[ESP],EBX; PUSH EBX 00408156 PUSH EAX 00408159 PUSH 0 00408167 MOV ESI,DWORD PTR SS:[ESP+2C] ESI=1B992525 0040816B PUSHFD 0040816C MOV DWORD PTR SS:[ESP],EAX 00408170 XOR ESI,0EB7C5F5 ESI=152EE0D0 0040817D BSWAP ESI ESI=D0E02E15 0040818B ADD ESI,2EDE9D3C ESI=FFBECB51 00408199 NOT ESI ESI=004134AE 004081AC LEA EBP,DWORD PTR SS:[ESP+4]; MOV EBP,ESP EBP=0012F710 004081BF SUB ESP,0BC; SUB ESP,0C0 ESP=0012F650 004081CB LEA EDI,DWORD PTR SS:[ESP+1C]; MOV EDI,ESP EDI=0012F650 004081CF SUB ESP,-1C ESP=0012F650 Я думаю это сделано, для того чтобы еще на начале исследования результата работы прота отбить желание, но нас этим не победить! Отсюда видно, что есть следы “мутатора”, но с полной уверенностью сказать нельзя пока не увидим вторую копию, а пока будем считать, что это примитивный метаморф… ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 06 мая 2007 04:51 · Личное сообщение · #23 dermatolog Короче сдаюсь! Примерно по часу в день для меня очень дорого обходятся, засим декомпиль неасилю (твои EBX&BL победили)… Инфа что откопал 1) PASS: 3221666 2) Патч (срякмикс всегда будет радоваться) Адрес 0040132D Байты F77D08 (IDIV DWORD PTR SS:[EBP+8]) заманить на 6A0D5A (PUSH 0D&POP EDX) 3) Вот поэтому адресу 40507E лежит какая-то таблица, короче чет там переводит десятичные числа в шестнадцатеричные – походу это защита и покрыта ВМ (в это алго я не стал въезжать, оно к ВМ походу никакого отношения не имеет) А если аффтар говнопроги решит поблагодарить юзера за сладкие шекеля, напишет больше чем Correct password слова благодарности, а? юзер с такой защитой строк ху(Пи…) дождется месаджабокса… Импорт тоже жопа, если весь покрыть, говнопрога великим тормозом будет, если так его каждый раз юзать… единственное считаю, его пригодны только(!), это если покрывать зловредные файлики, то тогда самое оно… Потраченного общего времени на разбор ВМ чуть больше 2 дней (быстрее получиться, если постоянно сидеть без остановок разбирать) Тему оставлю пока открытой, может Crawler посоветует чего “умного”, да и Ara может че еще насчет пиздабола напишет? Пссс А вообще ПАТЧ самой ВМ – ЭТО ЖЕСТЬ!!! ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 06 мая 2007 22:13 · Личное сообщение · #24 |
|
Создано: 06 мая 2007 23:11 · Личное сообщение · #25 |
|
Создано: 07 мая 2007 03:09 · Личное сообщение · #26 sniperZ пишет: пиши ст0тью А что ты хочешь, чтобы я описал в статье тест, корректировку и дополнение функционала своего плуга чтоле? В ручную эту стековую ВМ(фул) разобрать НЕ РЕАЛЬНО!!! А вообще читайте цитату PE_Kill, которую я в этом топе постил там написаны золотые слова и неоспоримые!!! rmn пишет: Описание команд ВМ хоть выложи У меня была, мысля показать, как выглядит простой PUSH в фул-версии, но не стал пугать народ… rmn пишет: (atoi (buf) % 17 == 13) Хм… хз. подходит, но полностью неуверен, и я же написал, саму логику срякмикса не разбирал, чич-то ориентировался на результаты самой ВМ!!! rmn пишет: Сорцы ж есть Кхе… где(?) можно на оригинал взглянуть? При всем моем уважении к тебе, но ты что из команды dermatolog`а(?), если да, то залей плиз еще один запротекченый еще раз такой тест????.... ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 07 мая 2007 08:56 · Личное сообщение · #27 |
|
Создано: 07 мая 2007 15:09 · Личное сообщение · #28 Бу-ага, как-то неудачно мы с dermatolog`огом перепЕхнулись, он запротектил опенсорс, хе-хе, а я его не увидел, ЛОЛ! rmn Ага, патчил я оказывается вот это (из оригинала) 0040109B F7F9 IDIV ECX 0040109D 83FA 0D CMP EDX,0D 004010A0 75 15 JNZ SHORT 004010B7 Сейчас компильнул, точно оно(!), бля весит 28 кб, после компиляции протом 230 кб, почти в 10 раз больше делает, Лооооол!!!!... Ну, а строки шифрованные находятся элементарно – запустим тест, ставится бряк на VirtualAlloc (я уже писал, что на начало функи бряк ставить нельзя, там проверка) лучше всего на ret, нажимаем CheckPassword, сработает бряк, в регистре EAX будет указатель на выделенную память, отображаем ее в окне dump, выделяем байт 100 и breakpoint->memory, on access, ну и жмем run, сталобыть истЕна – начинаем видеть куски расшифрованных строк… (в данном случае) 00B20000 6F727245 Erro 00B20004 00000072 r... 00B20008 72726F43 Corr 00B2000C 20746365 ect 00B20010 73736170 pass ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 16 марта 2008 10:28 · Личное сообщение · #29 |
|
Создано: 16 марта 2008 16:25 · Личное сообщение · #30 |
|
Создано: 06 мая 2008 23:19 · Личное сообщение · #31 |
<< . 1 . 2 . 3 . >> |
eXeL@B —› Оффтоп —› VMProtect… |