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

ВИДЕОКУРС
выпущен 4 ноября!


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

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

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

 eXeL@B —› Протекторы —› Статическая трассировка кода
<< . 1 . 2 . 3 . 4 . 5 . 6 . >>
Посл.ответ Сообщение

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

Создано: 11 декабря 2017 18:39 · Поправил: Boostyq New!
Цитата · Личное сообщение · #1

Всем привет,
Изучаю x86 драйвер, он защищен с помощью vmp
Случай достаточно простой, только некоторые функции мутированы (обфусцированы?), даже нет внешней упаковки
Для того чтобы посмотреть обфускацию целиком, нужна трасса от и до
Дебажить его у меня нет возможности, да и вообще хочу попробовать сделать это статически
Возможно идея глупая, но что если написать упрощенный процессор с обработкой нужных инструкций (операции стека, прыжки, вызовы), который бы "выполнял" код до тех пор пока не встретиться выход из функции
Правда не ясно что делать c вызовами API, stdcall мы же очищаем стек, но вот с другими соглашениями?
Дело даже не в проте, а вообще в целом
Я пыталась делать парсер конкретных команд под конкретный прот, но дело в том, что это не возможно реализовать, ибо число нелогичных приемов может быть очень большое, поэтому нужно спуститься на самый нижний уровень, для того чтобы выполнять код как сам процессор это делает
Возможно кто-то даст дельный совет, может кто-то уже делал подобное?
Так же я пыталась найти псевдо-код, как процессор выполняет команды, т.к. вмпрот любит использовать редкие команды, может у кого то есть линки?
Спасибо

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

Создано: 13 декабря 2017 06:19 New!
Цитата · Личное сообщение · #2

"Эмуляция программного кода". Там есть аттач emu.zip на исполнение инструкций.
https://exelab.ru/f/index.php?action=vthread&forum=6&topic=19688&page=0

Я не знаю как там, там C. У меня же асм и касатка (64), недоделанная. Выглядит так:
Code:
  1. procedure Test;
  2.  
  3.   procedure Message(const Value:Int64);
  4.   begin
  5.   MessageBox(GetDesktopWindow,PWideChar(IntToHex(Value,16)),PWideChar('CPU'),MB_ICONINFORMATION);
  6.   end;
  7.  
  8. var
  9. cpu : TCPU;
  10. begin
  11. cpu := TCPU.Create;
  12.  
  13. //lea rax,[rax+rbx*8-$50]
  14. cpu[RCX] := $25;
  15. cpu[RDX] := $25;
  16. cpu.Elea(RAX,QWORD_PTR(RAX,RBX,8,-$50));
  17. Message(cpu[RAX]);
  18.  
  19. //Xchg
  20. cpu[RCX] := $AA0064;
  21. cpu[RDX] := $00FFFF;
  22. cpu.Exchg(cx,dx); //xchg cx,dx
  23. Message(cpu[RCX]);
  24. Message(cpu[RDX]);
  25.  
  26. //Add
  27. cpu.Eadd(CX,IMM8(5)); //OK
  28. cpu.Eadd(CX,IMM16(5)); //OK
  29. cpu.Eadd(CX,IMM32(5)); //N.E.
  30. cpu.Eadd(CX,IMM64(5)); //N.E.
  31.  
  32. //Register Memory Value (The actual value a pointer looks at. Single slot. )
  33. cpu.Rmv[0] := $FFFFFFFFFFFFFFFF; //[rax] <= $FFFFFFFFFFFFFFFF
  34. cpu.Emov(EAX,DWORD_PTR(RAX)); //mov eax,[rax]
  35. Message(cpu[RAX]);
  36.  
  37. cpu.Free;
  38. end;

Т.е. с цензурой сразу: esp/rsp с множителем нелегальны прям как на процессоре, все множители кроме 1/2/4/8 тоже. Всякие movzx al,qword ptr [rax], xchg rcx,cl, rex префиксы в 32-режиме не проходят. Всё фильтруется инструкциями pcmpistri из SSE4.2. Не завершенное, бросил, как работает едва помню да и дыра нашлась проверял: push al проходит.

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


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

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


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

Создано: 13 декабря 2017 13:16 New!
Цитата · Личное сообщение · #3

bizkitlimp пишет:
Я не знаю как там, там C. У меня же асм и касатка (64), недоделанная. Выглядит так:

Спасибо, очень полезно, тот что на си очень чистый по коду
Хотя я пишу на питоне, самый простой способ для меня, т.к. хочу сохранить интерактивность с идой
Пока что перешла на capstone, вместо стандартного апи иды
Кстати, задам вопрос пока тут, встретила инструкцию bswap dx в секции вмпрота, я так понимаю, что ее исполнять не нужно? В доках описано, что операнд должен быть 32-битный, а при 16-битном результат неопределен?

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

Создано: 13 декабря 2017 13:50 · Поправил: cppasm New!
Цитата · Личное сообщение · #4

Что значит исполнять не надо?
Всё там определено, просто недокументировано.
Попробуй под отладчиком исполни посмотри на результат.

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


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

Создано: 13 декабря 2017 13:58 · Поправил: Boostyq New!
Цитата · Личное сообщение · #5

cppasm пишет:
Что значит исполнять не надо?
Всё там определено, просто недокументировано.
Попробуй под отладчиком исполни посмотри на результат.

main+158 - BA 78563412 - mov edx,12345678 ; EDX 12345678
main+15D - 66 0FCA - bswap dx ; EDX 12340000
Не очень то логично == mov dx, 0000?

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

Создано: 13 декабря 2017 14:43 · Поправил: cppasm New!
Цитата · Личное сообщение · #6

На старых процах мог быть не 0.
Поведение неопределено.
Современные все в reg16 заносят 0 и всё.
На процессорах постарее (когда-то на древнем 486 проверялось, но на пентиумах вроди так же) в младшие 16 бит регистра заносится старшая часть с перевёрнутыми байтами.
Т.е. после
Code:
  1. mov edx,12345678
  2. bswap dx

может быть 12340000, а может быть 12343412.
А вообще может быть что угодно
Это скорее всего мусорный код, и результат команды в итоге не важен.
Просто его вычистить надо правильно.

Ранг: 6.3 (гость)
Статус: Участник

Создано: 13 декабря 2017 19:10 New!
Цитата · Личное сообщение · #7

unicorn попробуйте, эмулятор на основе qemu. есть биндинг на питона

примеры эмуляции тут можно посмотреть
https://github.com/unicorn-engine/unicorn/blob/master/bindings/python/sample_x86.py

примерчик
Code:
  1.  
  2. def test_i386_context_save():
  3.     print("Save/restore CPU context in opaque blob")
  4.     address = 0
  5.     code = b'\x40'  # inc eax
  6.     try:
  7.         # Initialize emulator
  8.         mu = Uc(UC_ARCH_X86, UC_MODE_32)
  9.  
  10.         # map 8KB memory for this emulation
  11.         mu.mem_map(address, 8 * 1024, UC_PROT_ALL)
  12.  
  13.         # write machine code to be emulated to memory
  14.         mu.mem_write(address, code)
  15.  
  16.         # set eax to 1
  17.         mu.reg_write(UC_X86_REG_EAX, 1)
  18.  
  19.         print(">>> Running emulation for the first time")
  20.         mu.emu_start(address, address+1)
  21.  
  22.         print(">>> Emulation done. Below is the CPU context")
  23.         print(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX)))
  24.         print(">>> Saving CPU context")
  25.         saved_context = mu.context_save()
  26.  
  27.         print(">>> Running emulation for the second time")
  28.         mu.emu_start(address, address+1)
  29.         print(">>> Emulation done. Below is the CPU context")
  30.         print(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX)))
  31.  
  32.         print(">>> CPU context restored. Below is the CPU context")
  33.         mu.context_restore(saved_context)
  34.         print(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX)))


хз правда что вы будете делать с системными вызовами

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

Создано: 13 декабря 2017 19:32 New!
Цитата · Личное сообщение · #8

r0lka пишет:
хз правда что вы будете делать с системными вызовами

Привет, спасибо за рекомендации
Сейчас уже тоже перешла на Capstone, все пока устраивает
Так же ворую код из того эмулятора на си
Пока есть два класса контекст и фрейм
Каждый фрейм содержит регистры (пока основные) и копию стека
Контекст же виртуальное расположение стека, уже обработанные ветви и конечный адрес слежения
При условной инструкции создается доп. фрейм и идет ответвление
Системных вызовов в моем случае нет, а там посмотрим

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

Создано: 13 декабря 2017 21:15 · Поправил: deniskore New!
Цитата · Личное сообщение · #9

r0lka пишет:
unicorn попробуйте, эмулятор на основе qemu. есть биндинг на питона

Юник еще очень сырой, для продакшена пока не годится, ошибок в нем много, ничего не исправляют, можете посмотреть на гитхабе количество нерешенных вопросов.
У меня на первом семпле с "нестандартным кодом" всё взорвалось и посыпались эксепшены.
Функционала unicorn-а не хватит для решения поставленной задачи.

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

Создано: 14 декабря 2017 13:08 New!
Цитата · Личное сообщение · #10

deniskore пишет:
Юник еще очень сырой, для продакшена пока не годится, ошибок в нем много, ничего не исправляют, можете посмотреть на гитхабе количество нерешенных вопросов.
У меня на первом семпле с "нестандартным кодом" всё взорвалось и посыпались эксепшены.
Функционала unicorn-а не хватит для решения поставленной задачи.

Ну, мой велосипед точно не лучше
Просто мне гораздо проще писать свой код, чем править чужой или переписывать чужой
Все таки пришлось добавить работу с EFLAGS, до этого я не планировала, т.к. думала, что они нужны только для условных прыжков/мувов, а оказалось, что есть инструкции которые, так же используют их
Так же обнаружилась проблема с API вызовами, при stdcall мне нужно выравнивать стек, т.е. придется эмулировать каждую используемую (фиктивно конечно), в моем случае их не много

Ранг: 6.3 (гость)
Статус: Участник

Создано: 14 декабря 2017 17:56 New!
Цитата · Личное сообщение · #11

deniskore

хз натравливать не пробовал на vmprot, но для моих задач он даже не падал прожевав приличное количество кода, гонял по коду x86 и arm

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

Создано: 14 декабря 2017 19:46 · Поправил: Boostyq New!
Цитата · Личное сообщение · #12

Так, вот первые результаты
Все очень сыро, команд добавила больше, чем есть в логе, но многое не тестировала
Лог трассировки простой функции, нужно очень многое исправлять
Code:
  1. Python>traceBegin(0x00010656, 0x0001065C)
  2.  
  3. [loc_00010656]
  4. 0x00010656: push       eax                              // EAX=>0x0; ESP<=0xEFE01FFC; S32(0xEFE01FFC)<=0x0;
  5. 0x00010657: call       0x10486                          // ESP<=0xEFE01FF8; S32(0xEFE01FF8)<=0x1065C; EIP<=0x10486;
  6.  
  7. [loc_00010486]
  8. 0x00010486: mov        edi, edi                         // EDI=>0x0; EDI<=0x0;
  9. 0x00010488: push       ebp                              // EBP=>0x0; ESP<=0xEFE01FF4; S32(0xEFE01FF4)<=0x0;
  10. 0x00010489: mov        ebp, esp                         // ESP=>0xEFE01FF4; EBP<=0xEFE01FF4;
  11. 0x0001048b: movzx      eax, byte ptr [ebp + 8]          // EBP=>0xEFE01FF4; S8(0xEFE01FFC)=>0x0; EAX<=0x0;
  12. 0x0001048f: add        eax, eax                         // EAX=>0x0; EAX=>0x0; EAX<=0x0;
  13. 0x00010491: test       byte ptr [ebp + 8], 0x80         // EBP=>0xEFE01FF4; S8(0xEFE01FFC)=>0x0; CF<=0; AF<=0; OF<=0; SF<=0; ZF<=1; PF<=1;
  14. 0x00010495: je         0x1049a                          // ZF=>1; EIP<=0x10497;
  15.  
  16. [loc_00010497]
  17. 0x00010497: xor        eax, 0x1b                        // EAX=>0x0; EAX<=0x1B; CF<=0; AF<=0; OF<=0; SF<=0; ZF<=0; PF<=1;
  18. 0x0001049a: pop        ebp                              // S32(0xEFE01FF4)=>0x0; ESP<=0xEFE01FF8; EBP<=0x0;
  19. 0x0001049b: ret        4                                // S32(0xEFE01FF8)=>0x1065C; ESP<=0xEFE02000; EIP<=0x1065C;
  20.  
  21.  [loc_0001049a]
  22.  0x0001049a: pop        ebp                              // S32(0xEFE01FF4)=>0x0; ESP<=0xEFE01FF8; EBP<=0x0;
  23.  0x0001049b: ret        4                                // S32(0xEFE01FF8)=>0x1065C; ESP<=0xEFE02000; EIP<=0x1065C;

Есть функционал для угадывания прыжков, но все равно трассирует все ветви

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

Создано: 16 декабря 2017 18:02 · Поправил: Boostyq New!
Цитата · Личное сообщение · #13

Доделала все инструкции, которые встречаются в моем случае, а именно:
Code:
  1. jmp, jcc, call, ret, mov, movzx, movsx, xchg, lea, cmp, cmpxchg, add, xadd, adc, sub, sbb, inc, dec, neg, div, idiv, mul, imul, cwde, cdq, xor, not, or, and, test, aaa, aad, aam, aas, daa, das, push, pop, pushal, popal, leave, rol, ror, rcl, rcr, sal, shl, sar, shr, shld, shrd, pushfd, popfd, clc, stc, cmc, cld, std, cli, sti, sahf, lahf, salc, bsf, bsr, bt, btc, btr, bts, bswap

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

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


Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 16 декабря 2017 18:12 · Поправил: difexacaw New!
Цитата · Личное сообщение · #14

Boostyq

Покажу вам пример, я линк показывал, не знаю доступны ли аттачи на рох без авторизации.

Это цикл эмуляции ветвлений и исполнения(ядро визора, цикл динамической эмуляции(dye")).

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

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

В случае дин эмуляции нужен только дизасм длин и простой декодер MRM

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

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

Создано: 16 декабря 2017 18:22 New!
Цитата · Личное сообщение · #15

Boostyq
зачем свой велосипед с нуля писать, если уже полно написанных?
difexacaw
зачем нужно это дрочево если есть DBI? их гоняют тысячи людей и там все отлажено в отличие от твоих постоянно глохнущих моторов?


Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 16 декабря 2017 18:30 · Поправил: difexacaw New!
Цитата · Личное сообщение · #16

SegFault

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

Ранг: 0.0 (гость)
Статус: Участник

Создано: 16 декабря 2017 18:40 New!
Цитата · Личное сообщение · #17

difexacaw пишет: Стандарт дби не предназначено для реалтайм задач

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

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

Создано: 16 декабря 2017 18:44 New!
Цитата · Личное сообщение · #18

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


Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 16 декабря 2017 18:45 New!
Цитата · Личное сообщение · #19

shellstorm

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

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

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

Создано: 16 декабря 2017 18:47 New!
Цитата · Личное сообщение · #20

SegFault пишет:
зачем свой велосипед с нуля писать, если уже полно написанных?

Мотивация в повышении собственных навыков
На данный момент, когда я лучше знаю команды асмы, вижу какие инструкции имеют смысл, а какие мусор, и что если исключить их влияние на флаги, то их можно убирать
В то же время, я не представляю как сделать это автоматически, даже забыв про автоматику, для того чтобы это сделать руками мне нужна полная трасса функции, т.е. грубо говоря есть обфусцированная функция, и весь код который там может выполнится нужно вытащить оттуда, чтобы например скормить иде и она уже нормально проанализировала
Между делом спрошу людей которые шарят в вмпроте, как так получилось, что лишь некоторые функции обфусцированы? У меня есть 3 версия вмп и там есть опция мутация, но как я понимаю, это совсем другое. При том другие файлы защищены по полной программе
Но вы, SegFault, убедили меня, если есть какой то инструмент, который позволит мне выполнить это легко и статически, то я буду очень рада


Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 16 декабря 2017 18:49 · Поправил: difexacaw New!
Цитата · Личное сообщение · #21

SegFault

Я не писал гипервизоры и вообще их не обсуждаю, да вы просто в понятиях путаетесь из за не знания и не понимания.

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

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

Создано: 16 декабря 2017 18:51 New!
Цитата · Личное сообщение · #22

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


Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 16 декабря 2017 19:02 · Поправил: difexacaw New!
Цитата · Личное сообщение · #23

SegFault

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

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

Создано: 16 декабря 2017 19:07 New!
Цитата · Личное сообщение · #24

difexacaw пишет:
Во первых мало у кого есть новые камни

единственный дельный коммент, но рано или поздно будут у всех
По остальному - эта хардварная срань как раз и была придумана для риал тайма, так что ей похер на межкольцевые переключиния. Ну чтобы более понятно было - sysenter/syscall это хардварное ускорение int 2e, в три раза быстрее прерывания стало. То же самое с хардварной трассировкой.

Ранг: 0.0 (гость)
Статус: Участник

Создано: 16 декабря 2017 19:09 New!
Цитата · Личное сообщение · #25

difexacaw пишет: всё равно профайл просядет в сотни раз

Сам не пользовался еще, но интел обещает среднее проседание исполнения на 15%


Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 16 декабря 2017 19:14 New!
Цитата · Личное сообщение · #26

shellstorm

Без смены мода

SegFault

Ну возьми блокнот потрассируй, сними профайл. Зачем вы лезете в тему где ничего не понимаете, просто что бы нагадить.. тогда придётся обратиться к модерам.

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

Создано: 16 декабря 2017 19:20 New!
Цитата · Личное сообщение · #27

difexacaw
наркоман чтоле? блокнот трассируется на бранчтрейсинге легко, обнови свой пентиум2!


Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 16 декабря 2017 19:58 New!
Цитата · Личное сообщение · #28

SegFault

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

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

Создано: 16 декабря 2017 20:06 New!
Цитата · Личное сообщение · #29

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


Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 16 декабря 2017 20:09 · Поправил: difexacaw New!
Цитата · Личное сообщение · #30

SegFault

Вас удалят за спам, я уже написал в соотв. тему. Твою дикость ты покажи где то есчо, но тут это не уместно. Таких ка ты нужно лечить, в сети это невозможно. Поэтому вас можно только удалять, как заразу.

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

Создано: 16 декабря 2017 20:11 New!
Цитата · Личное сообщение · #31

difexacaw
слился даун, побежал стучать модерам, правильно, аргументировать то нечем! Вышло, что ты пилил свое гуано ввиде очередного мотора, а всё это в железе давно есть. Обидно, понимаю.
<< . 1 . 2 . 3 . 4 . 5 . 6 . >>
 eXeL@B —› Протекторы —› Статическая трассировка кода

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

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