eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 июля!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: asmd (+4 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Программирование —› Свёртка.
<< . 1 . 2 . 3 . >>
Посл.ответ Сообщение


Ранг: 286.4 (наставник)
Статус: Участник

Создано: 2 мая 2019 17:22 New!
Цитата · Личное сообщение · #1

Тут исходный материал --> Link <--

Я взял EP модуля, обработанного вмп и вручную почистил мусор. Это мелкая тех задача, я её решу на днях(те проблема с кседом и нужно продумать алгоритмы по графам). Суть не в этом.

Исходный код:
Code:
  1. 00BBBC8F   push 7D9D0FB3
  2. 00BBBC94   call 007EDEE3
  3. 007EDEE3   push ebp
  4. 007EDEE4   mov bp,1B1E
  5. 007EDEE8   cmovpe ebp,edx
  6. 007EDEEB   pushfd
  7. 007EDEEC   push ecx
  8. 007EDEED   push ebx
  9. 007EDEEE   push edx
  10. 007EDEEF   push edi
  11. 007EDEF0   and edx,ebp
  12. 007EDEF2   sal edx,cl
  13. 007EDEF4   push eax
  14. 007EDEF5   push esi
  15. 007EDEF6   rol si,0A8
  16. 007EDEFA   mov edx,0
  17. 007EDEFF   or edi,200E1338
  18. 007EDF05   xchg eax,esi
  19. 007EDF06   push edx
  20. 007EDF07   cmp dx,ax
  21. 007EDF0A   xor ecx,edi
  22. 007EDF0C   cbw
  23. 007EDF0E   mov esi,dword ptr ss:[esp+28]
  24. 007EDF12   cmp edi,2665657B
  25. 007EDF18   xor bx,466
  26. 007EDF1D   rcl ecx,33
  27. 007EDF20   sub esi,68CC28DC
  28. 007EDF26   rol di,0DA
  29. 007EDF2A   bswap esi
  30. 007EDF2C   btc eax,9E
  31. 007EDF30   ror esi,1
  32. 007EDF32   xor esi,6B3E5C22
  33. 007EDF38   add esi,edx
  34. 007EDF3A   sal cx,cl
  35. 007EDF3D   mov ebp,esp
  36. 007EDF3F   cmp esi,3F1237C1
  37. 007EDF45   sub esp,0C0
  38. 007EDF4B   movsx eax,di
  39. 007EDF4E   sar di,2B
  40. 007EDF52   ror bx,9A
  41. 007EDF56   mov ebx,esi
  42. 007EDF58   add ah,dl
  43. 007EDF5A   mov ecx,0
  44. 007EDF5F   sub ebx,ecx
  45. 007EDF61   lea edi,dword ptr ds:[7EDF61]
  46. 007EDF67   cmova eax,ebp
  47. 007EDF6A   btc eax,0E3
  48. 007EDF6E   sub esi,4
  49. 007EDF74   rcl eax,cl
  50. 007EDF76   shld ax,si,5D
  51. 007EDF7B   shr ah,cl
  52. 007EDF7D   mov eax,dword ptr ds:[esi]
  53. 007B5029   xor eax,ebx
  54. 00CCF9CC   inc eax
  55. 00CCF9CD   cmp bp,cx
  56. 00CCF9D0   neg eax
  57. 007EB5C2   dec eax
  58. 007EB5C3   test al,ah
  59. 007EB5C5   cmp esi,695251BF
  60. 007EB5CB   bswap eax
  61. 007EB5CD   test ecx,esi
  62. 007EB5CF   clc
  63. 007EB5D0   not eax
  64. 007EB5D2   cmp sp,dx
  65. 007EB5D5   xor ebx,eax
  66. 007EB5D7   cmp di,32B8
  67. 007EB5DC   cmp esi,esi
  68. 007EB5DE   add edi,eax
  69. 00C5D7DE   push edi
  70. 00C5D7DF   ret


После удаления мусора(если контекст сбрасывается, то предыдущая цепочка cfg мусорная, те clc/cmp -> clc мусор, так как EF.CF функция утеряна).

Code:
  1. 007EDEE3   push ebp
  2. 007EDEEB   pushfd
  3. 007EDEEC   push ecx
  4. 007EDEED   push ebx
  5. 007EDEEE   push edx
  6. 007EDEEF   push edi
  7. 007EDEF4   push eax
  8. 007EDEF5   push esi
  9. 007EDEFA   mov edx,0                         ; EDX = 0
  10. 007EDF06   push edx
  11.  
  12. 007EDF0E   mov esi,dword ptr ss:[esp+28]     ; ESI = [ARG]
  13. 007EDF20   sub esi,68CC28DC                              ; ESI - X
  14. 007EDF2A   bswap esi                         ; bswap ESI
  15. 007EDF30   ror esi,1                         ; ESI >>
  16. 007EDF32   xor esi,6B3E5C22                              ; ESI xor X
  17. 007EDF38   add esi,edx               ; ESI + EDX
  18.  
  19. 007EDF3D   mov ebp,esp
  20. 007EDF45   sub esp,0C0
  21. 007EDF56   mov ebx,esi               ; EBX = ESI
  22. 007EDF5A   mov ecx,0                         ; ECX = X
  23. 007EDF5F   sub ebx,ecx               ; EBX - ECX(0)
  24. 007EDF61   lea edi,dword ptr ds:[7EDF61]     ; EDI = [N]
  25. 007EDF6E   sub esi,4                         ; ESI - 4
  26.  
  27. 007EDF7D   mov eax,dword ptr ds:[esi]               ; EAX = [ESI]
  28. 007B5029   xor eax,ebx               ; EAX xor EBX
  29. 00CCF9CC   inc eax                                       ; EAX + 1
  30. 00CCF9D0   neg eax                                       ; -EAX
  31. 007EB5C2   dec eax                                       ; EAX - 1
  32. 007EB5CB   bswap eax                         ; swap EAX
  33. 007EB5D0   not eax                                       ; ~EAX
  34. 007EB5D5   xor ebx,eax               ; EBX xor EAX
  35.  
  36. 007EB5DE   add edi,eax               ; EDI + EAX
  37. 00C5D7DE   push edi                                 ; -> EDI
  38. 00C5D7DF   ret


Этого примера более чем достаточно что бы понять всю обработку, которую необходимо выполнить.

В этом примере два блока с bswap. Это некоторая последовательность простых операций, которая известна и её нужно свернуть, те упростить.

Vamit сделал это через хардкод всех таких конструкций.

Это чистая математика, как сворачивать такие выражения, учитывая что там не просто функции, а булевый ксор и тп ?
Помогут в этом ли солверы, я их не использовал никогда ?

В простейшем случае такие блоки можно выполнить с нулевым аргументом, это без учёта условий.


Ранг: 286.4 (наставник)
Статус: Участник

Создано: 3 мая 2019 17:50 New!
Цитата · Личное сообщение · #2

Vamit

> Да пошел ты в жопу, у меня всё решено и работает в автомате

Судя по всему это станет не актуальным. Колхозить десять лет какие то макросы вм, утверждать что решение не возможно, не смотря на то что операции с константами - это просто ппц. Я услышал достаточно, не обижайтесь.

В любом случае спасибо вам за попытку помощи. Я жду ответа людей, которые могут реально дать оценку по задаче.


Ранг: 200.2 (наставник)
Статус: Участник

Создано: 3 мая 2019 17:51 New!
Цитата · Личное сообщение · #3

Vamit
Еще немного и сатсурой он объявит тебя


Ранг: 286.4 (наставник)
Статус: Участник

Создано: 3 мая 2019 17:54 New!
Цитата · Личное сообщение · #4

f13nd

Удались плз из этой темы, если у тебя нет ничего по теме.

Ранг: 120.4 (ветеран)
Статус: Участник

Создано: 3 мая 2019 18:53 New!
Цитата · Личное сообщение · #5

Бгг, конец темы немного предсказуем. Вы удивляете, серьезно, столько лет наступать на одни и теже грабли. Запомните раз и навсегда - любая тема этого пациента предназначена для самоутверждения, а уж вступать с ним в дискас в "его" теме это вообще за гранью, все кончится всегда тем что вы будете идиотами, аверами, жидами итд в зависимости от его тренда

Ранг: -11.6 (нарушитель)
Статус: Участник

Создано: 3 мая 2019 20:40 New!
Цитата · Личное сообщение · #6

difexacaw пишет:
Общее решение будет возможно если найти решение этой задачи.
И это только начало поиска. Не работал я ранее с гибридными уравнениями.


Предлагаю составить список нерешеных задач тысячелетия для difexacaw
и периодически задавать ему вопросы связаные с их решением:

1. Готов ли ваш микроскоп.
2. Видно ли через него ваше решение гибридных уравнений.

Вопросы будут добавляться по мере поступления новых нерешенных difexacaw-задач тысячелетия.


Ранг: 649.5 (!)
Статус: Участник
CyberMonk

Создано: 3 мая 2019 20:42 · Поправил: mak New!
Цитата · Личное сообщение · #7

difexacaw

Вамит старше тебя) прояви сдержанность!

Vamit пишет:
Да пошел ты в жопу, у меня всё решено и работает в автомате

Никто ведь и не сомневается! У тебя отличный проект! Просто есть два пути решения, первый реверсивный(Как у тебя), второй я не знаю как назвать, я назвал его Chaos Deobfuscating хотя смысл простой "грубая трансформация", а далее ..

Первый вариант -упрощённая лента трансформации:
BinCode - PseudoCode - VMhaendlers - Polymorph - Metamorph - Antidebug - Obfuscation

Reverse engineering - обратная задача ...
Reversing - Obfuscation - Antidebug - Metaporph - Polymorph - VMHaendlers - PseudoCode - BinCode

Второй вариант, требует очень продвинутого оптимизатора, очень означает, что он умеет делать с кодом чудеса, перебирать код на части, даже если он накрыт криптованными участками (Это не миф, такой есть)
Chaos Deobfuscating "грубая трансформация" -
Code Unrolling - Code Expand - AntidebugFix - Optimizer - Analysis - Optimizer - Binary Code

Всё это сводится к теме -
Структурное программирование --> Link <--
Теорема Бёма — Якопини --> Link <--

Великая игра в трансформацию как говорят криптографы

Vamit пишет:
Обыкновенный ВМ-ый полиморф
Да как угодно назови, только суть от этого не меняется, причем у каждого типа вм он свой, независимо от того цикловая вм или безцикловая. У некоторых вм его формула постоянна, а у других вариативна.


Полиморф это и означает, для меня это ясность .. а ясность для проектменеджмента решающий фактор успеха, да и можно применить технику для полиморфного кода) как ты применил эмулятор

а у других вариативна
Это ложная вариативность она базируется на вложенных трансформациях. Я не просто привёл пример с графом в пдф, так как через такой метод формула становится статичной, а все операции можно разделить на простые превращения. Я говорю без наезда, что это возможно и реально .. но к твоей технике не имеет отношения)

у меня всё решено Это не аргумент когда хочется разобрать логику ... т.к. difexacaw задался вопросом, возможно ли построить абстрактный уровень декомпиляции, при этом я считаю, что он в точку определил основную суть атаки на NAND логику.

Оптимизация логических гейтов классическая задача инженерного искусства, общим решением для любой вм будет "грубая трансформация" через оптимизатор, в который встроены две компоненты - это Code Unrolling + Code Expand и Универсальный решатель НАНД логики, в таком случае это даже упрощает задачу, т.к. грубый перебор оптимизации превращается в элегантный набор инструментов.

Вот банальный пример из книги Nabila Abdessaied, Rolf Drechsler (auth.) - Reversible and Quantum Circuits_ Optimization and Complexity Analysis-Springer International Publishing (2016), там не всё полезно, но суть понятна ..


Логика решателя должна быть такой -
1. разбиение на простые логические операции
2. Построение графа операций
3. Оптимизация - Применение правил симплификации (Упрощение)
4. Проверка на конечную законченную оптимизацию и финализация ...

Сам граф будет выглядеть примерно так (взято из книги Martin Kumm (auth.) - Multiple Constant Multiplication Optimizations for Field Programmable Gate Arrays-Springer Vieweg (2016))


В итоге операции типа
Code:
  1. (a ~& a ~& 0EDCBA987 ~& (a ~& 12345678) ~& (a ~& a ~& 0EDCBA987 ~& (a ~& 12345678))) + b ~& (a ~& a ~& 0EDCBA987 ~& (a ~& 12345678) ~& (a ~& a ~& 0EDCBA987 ~& (a ~& 12345678))) + b

Сворачиваются в
Code:
  1. (a ^ 12345678) - b

как это сделано у китайских друзей ... потом применяется оптимизатор и всё ВМка в ж...пе

Поэтому друзья, пожалуйста не ругайтесь, конкретика + попытка понять оппонента сделает форум читабильным, никто не требует решений без ошибок или идеальных размышлений.

Всем мир! Писс ...

| Сообщение посчитали полезным: dma, lx60, difexacaw, DenCoder, Orlyonok, Williams



Ранг: 286.4 (наставник)
Статус: Участник

Создано: 4 мая 2019 17:30 · Поправил: difexacaw New!
Цитата · Личное сообщение · #8

mak

> Вамит старше тебя) прояви сдержанность!

Верно, просто он столь уверен в своём инструменте, что ничего не хочет слушать и всё считает невозможным. А это не так.

Я пытался найти два дока на которые вы ссылаетесь, но во первых они не доступны(один есть у гугла), а во вторых это инфа вроде бы как по железу(логические матрицы ?). Важно что хоть кто то не считает решение невозможным

Я тут подумал над алгоритмами. Получается вот что.

Изначально мне было не ясно как саму чистку реализовать, те я думал как связать cfg и dfg. Это было ошибкой. Некоторая функция зависит от предыдущей, те связать обратными ссылками нельзя. Инструкция может быть процедурой(те частью её).

Механизм получается прост. Для текущей инструкции определяется изменяемый контекст. Далее парсим cfg от текущего места и определяем что все части контекста не использованы и при этом небыло завершения процедур. Если это так, то инструкцию удаляем и перезапускаем скан. Так будет удалён весь не связанный мусор.

Далее функции. Всякая функция константы является константой. Тогда определяем что инструкция использует константу, выполняем функцию(операцию) и заменяем ей(новой константой) текущую операцию, после чего перезапускаем скан.

После множества итераций код будет свёрнут.

При этом придётся использовать наследование в памяти. Эту часть есчо нужно проработать.

| Сообщение посчитали полезным: mak



Ранг: 296.9 (наставник)
Статус: Участник

Создано: 5 мая 2019 09:27 New!
Цитата · Личное сообщение · #9

difexacaw пишет:
Всякая функция константы является константой.


мысли сходятся...

Добавлено спустя 24 минуты
Кстати, ещё в 2004 я над этим работал... В электричках записывал мысли в блокнотик )
И если б не безденежье, если б не бабы, то уже сейчас было бы об этом смешно говорить. Извините сразу - похоже на самохвальство, но сказанное мной - правда. А так великие помехи этому - 2005, 2006 - 2015, Заказы в 2016, 2017-2018, периодически "ненормальные" друзья... В конце концов главная помеха, что я это ещё не сделал 15 лет назад - я сам!!! Не надо было менять приоритеты...


Ранг: 649.5 (!)
Статус: Участник
CyberMonk

Создано: 5 мая 2019 11:24 · Поправил: mak New!
Цитата · Личное сообщение · #10

difexacaw пишет:
это инфа вроде бы как по железу(логические матрицы ?)

Да!

difexacaw пишет:
Я пытался найти два дока на которые вы ссылаетесь, но во первых они не доступны(один есть у гугла)

Вот линк на коллекцию книг 265.2 MB - --> Link <--
Мне нужен был быстрый пример, я взял что было под рукой, эти техники применяют чаще в железе .. В папке Logic Gates - лежат обе книги.

Вдобавок - --> Link <--
Switching Theory: Insight through Predicate Logic
Randy H. Katz, Gaetano Borriello - Contemporary Logic Design-Prentice Hall (2004)


difexacaw пишет:
Механизм получается прост. Для текущей инструкции определяется изменяемый контекст. Далее парсим cfg от текущего места и определяем что все части контекста не использованы и при этом небыло завершения процедур. Если это так, то инструкцию удаляем и перезапускаем скан. Так будет удалён весь не связанный мусор.

Да.

difexacaw пишет:
Далее функции. Всякая функция константы является константой. Тогда определяем что инструкция использует константу, выполняем функцию(операцию) и заменяем ей(новой константой) текущую операцию, после чего перезапускаем скан.

В точку

DenCoder пишет:
Кстати, ещё в 2004 я над этим работал... В электричках записывал мысли в блокнотик )
И если б не безденежье, если б не бабы, то уже сейчас было бы об этом смешно говорить. Извините сразу - похоже на самохвальство, но сказанное мной - правда. А так великие помехи этому - 2005, 2006 - 2015, Заказы в 2016, 2017-2018, периодически "ненормальные" друзья... В конце концов главная помеха, что я это ещё не сделал 15 лет назад - я сам!!! Не надо было менять приоритеты...


Двойной инсайт

Ранг: 67.5 (постоянный)
Статус: Участник

Создано: 5 мая 2019 13:18 New!
Цитата · Личное сообщение · #11

difexacaw пишет:
Механизм получается прост

Что правда? Помнится в index.php?action=vthread&forum=13&topic=24981 я озвучила это самое решение
Помнится ты еще раздавал мне там глупые советы, видимо практика от теории далека
А насчет вамита тебе лучше ему не хамить, потому что этот чел писал декомпиль си, не только вм
И в отличии от тебя если он что-то говорит, значит это уже реализовано и работает

| Сообщение посчитали полезным: DenCoder



Ранг: 286.4 (наставник)
Статус: Участник

Создано: 5 мая 2019 13:56 · Поправил: difexacaw New!
Цитата · Личное сообщение · #12

Boostyq

Это очевидный механизм, использовался есчо задолго до тебя для свёртки обработчиков исключений. Та твоя тема хз о чём, тоесть не определена задача и ты сама не знаешь что решаешь. Теже флаги например - ксед всю эту инфу возвращает как и регистры, зачем велосипед изобретать.

{ Атач доступен только для участников форума } - 29.png


Ранг: 200.2 (наставник)
Статус: Участник

Создано: 5 мая 2019 14:05 New!
Цитата · Личное сообщение · #13

Че спорить-то, он вечером может искать как свернуть (A^B)+C в одно действие, с утра переобуться и заявить, что это глупость, которую он даже не собирался делать. А все, кто говорил, что это глупость - просто за ним повторяют.


Ранг: 286.4 (наставник)
Статус: Участник

Создано: 5 мая 2019 14:09 New!
Цитата · Личное сообщение · #14

f13nd

Вначале нужно доказать что свернуть нельзя, сколько можно повторять. А если будет A*B + C; инструкция к примеру разложена на микро операции и отморфлена, тогда по твоему функция не обратима, глупость.


Ранг: 200.2 (наставник)
Статус: Участник

Создано: 5 мая 2019 14:14 New!
Цитата · Личное сообщение · #15

difexacaw пишет:
тогда по твоему функция не обратима

А что, (A^B)+C необратима?


Ранг: 286.4 (наставник)
Статус: Участник

Создано: 5 мая 2019 14:19 New!
Цитата · Личное сообщение · #16

f13nd

Понятия не имею. Дело не в конкретной функции, это первая взятая выборочно. Нужно как то решать произвольные функции, если свернуть можно, то значит свёртывается, иначе остаётся как есть. Как это сделать пока никто не сказал. То что можно свернуть и ксор в данном случае, так это потому что функция от константы.


Ранг: 200.2 (наставник)
Статус: Участник

Создано: 5 мая 2019 14:25 New!
Цитата · Личное сообщение · #17

difexacaw пишет:
Как это сделать пока никто не сказал.

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

Ранг: 140.7 (ветеран)
Статус: Участник

Создано: 5 мая 2019 14:31 New!
Цитата · Личное сообщение · #18

difexacaw пишет:
Нужно как то решать произвольные функции

Но зачем? Ведь компилятор дерматолога - это не сферический конь в вакууме. Он морфит исходник по конечному набору шаблонов. Нужно только их вычислить и...


Ранг: 286.4 (наставник)
Статус: Участник

Создано: 5 мая 2019 14:35 · Поправил: difexacaw New!
Цитата · Личное сообщение · #19

rmn

Я не говорил что задача по вмп, я просто его взял для примера. Хотя нужно было взять другой пример, нейтральный", что бы некоторые не волновались..

Ранг: 140.7 (ветеран)
Статус: Участник

Создано: 5 мая 2019 15:10 New!
Цитата · Личное сообщение · #20

difexacaw
Да любой морфер/вм возьми, везде будет в принципе одно и то же. Когда ты вручную разбираешь такой код, то ты никакие графы в уме не оптимизируешь. Ты просто (через N часов ) видишь шаблоны компиля. Мусорные шаблоны сразу удаляешь, шаблоны морфера сразу приводишь в исходный вид.


Ранг: 286.4 (наставник)
Статус: Участник

Создано: 5 мая 2019 15:13 New!
Цитата · Личное сообщение · #21

rmn

Вы предлагаете колхозить как у вамита, те определять эти самые шаблоны. Мне такое решение не нужно.

Ранг: 44.8 (посетитель)
Статус: Участник

Создано: 5 мая 2019 16:01 New!
Цитата · Личное сообщение · #22

Индий я смотрю на вас напали овощи довайте я вам помогу
просто скомпелируйте очередной мотор и объявите что вмпрот повержен
вы же так победили уже все протекторы

| Сообщение посчитали полезным: dma



Ранг: 286.4 (наставник)
Статус: Участник

Создано: 5 мая 2019 16:06 · Поправил: difexacaw New!
Цитата · Личное сообщение · #23

SegFault

> вы же так победили уже все протекторы

Я решил общим способом задачу определения EP. Никто из вас это сделать не смог(и Vamit тоже кстате со своим рабочим инструментом только для вмп).

> просто скомпелируйте очередной мотор и объявите что вмпрот повержен

Разберусь и с этим, всему своё время. И на вмп свет клином не сошёлся как бы.

Ранг: 67.5 (постоянный)
Статус: Участник

Создано: 5 мая 2019 16:06 New!
Цитата · Личное сообщение · #24

difexacaw пишет: зачем велосипед изобретать
В этом и есть беда, от того что ты возьмешь готовый сорс ты не узнаешь, что знает автор
Хотя вангую даже со всем готовым ты нихрена не напишешь


Ранг: 286.4 (наставник)
Статус: Участник

Создано: 5 мая 2019 16:09 New!
Цитата · Личное сообщение · #25

Boostyq

Я говорил что мне нужен чей то сурец?
Типичный дефектный ход мыслей бабы.

Ранг: 140.7 (ветеран)
Статус: Участник

Создано: 5 мая 2019 16:17 New!
Цитата · Личное сообщение · #26

difexacaw пишет:
Я решил общим способом задачу определения EP

Где релиз Ultimate OEP Finder'а то?


Ранг: 200.2 (наставник)
Статус: Участник

Создано: 5 мая 2019 16:19 New!
Цитата · Личное сообщение · #27

rmn пишет:
Где релиз Ultimate OEP Finder'а то?

Ты што, на слово не можешь поверить?


Ранг: 286.4 (наставник)
Статус: Участник

Создано: 5 мая 2019 16:20 · Поправил: difexacaw New!
Цитата · Личное сообщение · #28

rmn

А зачем это нужно. Что бы вы говном лили очередной раз - увы.

Добавлено спустя 1 минуту
f13nd

> Ты што, на слово не можешь поверить?

Сацура всегда был не адекватом, темы на васм не достаточно ?
И я тебе говорил не писать в мои темы.

Ранг: 140.7 (ветеран)
Статус: Участник

Создано: 5 мая 2019 16:24 New!
Цитата · Личное сообщение · #29

difexacaw
Так если оно реально работает, кто ж его говном поливать будет? Юзать будем и восхвалять автора


Ранг: 200.2 (наставник)
Статус: Участник

Создано: 5 мая 2019 16:43 New!
Цитата · Личное сообщение · #30

difexacaw пишет:
И я тебе говорил не писать в мои темы.

На колени и умоляй.

Ранг: 120.4 (ветеран)
Статус: Участник

Создано: 5 мая 2019 16:50 New!
Цитата · Личное сообщение · #31

Много написали, я не понял - стадия с маглами уже была, или мы сразу перескачили на овощей? Уже упоминался убердвиг уничтоживший всех аверов?
<< . 1 . 2 . 3 . >>
 eXeL@B —› Программирование —› Свёртка.
Эта тема закрыта. Ответы больше не принимаются.

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS