VMWare cache trouble

Тема в разделе "WASM.RESEARCH", создана пользователем hcwarper, 10 янв 2025.

  1. hcwarper

    hcwarper New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2025
    Сообщения:
    6
    Парни, доброго времени суток!
    Есть нетривиальный вопрос.
    Может кто-то сталкивался с подобной проблемой?
    Патчу из драйвера программу при её запуске.
    Через PsSetLoadImageNotifyRoutine.
    Всё работает .
    Почему я так делаю , да потому что программа весьма жёстко отслеживает свою целостность.
    Программа стартует и работает.
    Закрываю программу , запускаю снова и она не стартует.
    Потому что не проходит проверка целостности.
    Под отладчиком видно, что патч , сделанный мною из драйвера, остаётся на месте.
    Байты не оригинальные , а мои )
    То есть или система кэширует состояние программы или что-то другое.
    После ребута компа опять всё нормально работает.
    Рабочая среда WIN 10-11 на VMWare.
    Программа накрыта последним SDK Codemeter.
    Как "это" отключить ?
     
  2. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    184
    Не пробовал отследить, что именно вызывает блокировку после повторного запуска приложения?
     
  3. hcwarper

    hcwarper New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2025
    Сообщения:
    6
    Закрываю программу , запускаю снова и она не стартует.
    Потому что не проходит проверка целостности.
    Под отладчиком видно, что патч , сделанный мною из драйвера, остаётся на месте.
    Это не блокировка, а программа проверяет свою целостность.
    И так , как программа пытается запуститься в "патченом" виде, то в ход вступает фича CodeMeter защитного шелла и креш.
     
  4. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.476
    Адрес:
    Россия, Нижний Новгород
    Она действительно его кэширует, что не подтягивать каждый раз образ с диска - за это отвечает служба Superfetch.
    Попробуй его отключить: msconfig -> Службы -> Сними галочку с SysMain -> Ребутнись.
     
  5. hcwarper

    hcwarper New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2025
    Сообщения:
    6
    В том всё и дело, что я ранее это "нагуглил" , остановил сервис Sysmain, "вычеркнул" из автостарта.
    И никаких улучшений.
    Возможно это вообще какая-то новая фича SDK (защитного конверта) CodeMeter.
    Ранее такого не было.
    Второй минус это мощнейший антиаттач , антидебаг. Никакие плагины не работают. Не для x64Dbg , не для IDA.
    И вишенкой на торте - отличный обфускатор.
    Приношу извинения, что не дал сразу все расклады.
     
  6. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.476
    Адрес:
    Россия, Нижний Новгород
    Вообще, у тебя проблема из-за того, что когда ты патчишь память, у тебя не срабатывает Copy-on-Write.
    Скорей всего ты патчишь чем-то типа MmMapLockedPagesSpecifyCache/MmMapIoSpaceEx, и дальше пишешь прямо в полученное отображение - поэтому и портится общий кэш.
    Чтобы такого не происходило, надо патчить именно в юзермодных страничках, не переотображая их в ядро - через ZwProtectVirtualMemory, благо он экспортируется, начиная с десятки.
    Но здесь есть другой нюанс: насколько помню, в контексте Ps-каллбэка у тебя залочено адресное пространство процесса, поэтому ZwProtect ты там сделать скорей всего не сможешь (не уверен, надо попробовать).
    Чтобы это обойти, можно придумать что-то или с таймерами, чтобы патчить чуть-чуть позже, когда лок будет снят, или попробовать отправить процессу normal kernel APC, в которой уже сможешь пропатчить.

    Также можно попробовать сложный путь: сделать минифильтр, который на IRP_MJ_READ при чтении файла приложения будет отклонять FastIO, чтобы всегда идти "длинным" путём через чтение с диска.

    Также можно попробовать вытолкнуть файл из кэша: посмотреть куда-то в направлении CcUninitializeCacheMap, передав ему PFILE_OBJECT твоего образа (который можно получить через PsReferenceProcessFilePointer, передав ему PEPROCESS).
    Насчёт выталкивания кэша просто пальцем в небо - не знаю, к чему это приведёт, может оно вообще не связано с тем кэшем, где у тебя сидит процесс.
     
  7. Ahimov

    Ahimov Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    71
    Интересная стратегия - вы там патчите, мы проверяли тупо(kpp), а теперь загрузим из кэша и что бы обойти нужно пол ядра перелопатить".. Cc* апи это вообще кернел дно и черный ящик. Анстаб у таких метод абсолютный :sarcastic:
     
  8. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.476
    Адрес:
    Россия, Нижний Новгород
    Нууу, всё-таки не пол ядра. Просто сама по себе задача "пропатчить что-то в процессе из ядра" - не такая простая, как кажется.
    А насчёт Cc - да, согласен, это больше апи для разработки файловых систем, но можно попробовать - вдруг что-то получится.
     
  9. Ahimov

    Ahimov Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    71
    HoShiMin

    Это тривиальная проблема патчей, крэклаб тьюм и все такое. Защита палит патч, но по причине соотв. скилла пытаются повесить поверх патч. В юзер это после долгой возни с отладчиком кое как да и работает. Но вот в ядре такое не катит..

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

    Обход защиты к примеру вмп именно такой. Может в юзер для начала порешить ?
     
  10. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    219
    В папке WinDbg есть утилита "GFlags", флагами в которой можно отследить процесс загрузки образа в память (апи и прочее). Не помешает просмотреть её логи, может найдётся что-нибудь интересное.
     
  11. hcwarper

    hcwarper New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2025
    Сообщения:
    6
    Драйвер-фильтр попробовать стоит конечно.
    --- Сообщение объединено, 11 янв 2025 ---
    Легко сказать , не глядя на программу...
    Обфускатор у CodeMeter не на коленке сделан.
    Как пример - сервис CodeMeter "весил" 6-7 мегабайт , которые превратились в 40 мегабайт.
    Думаете они добавили нового функционала в таком количестве?
    --- Сообщение объединено, 11 янв 2025 ---
    Программа , "накрытая" защитным конвертом CodeMeter проверяет Debug Mode системы и не стартует вообще.
    Поэтому всякие модные HyperDbg не "катят".
     
  12. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    219
    Вы проверяли именно WinDbg?
    Тогда как вы узнали, что..
     
  13. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    490
    тоесть вам удалось снять конверт кодометра?
     
  14. hcwarper

    hcwarper New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2025
    Сообщения:
    6
    Я конверт не снимаю. Хотя он как раз и не сильно сложный, если не используется WUPI.
    У меня написан эмулятор этого донгла на основе виртуальной шины.
    И нет потребности в снятии конверта.
    --- Сообщение объединено, 11 янв 2025 ---
    Я использую x64Dbg. И при остановке программы на OEP (EP )сразу вижу, что по определённому адресу мои "патченые байты"
     
  15. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    219
    Походу вы не понимаете, о чём речь..
    x64Dbg - это юзермодный отладчик, а WinDbg для кернел.

    Ставите WinDbg на хост, и соединяете его COM-портом с виртуалкой.
    В результате под отладкой оказывается вся ОС на VMWare, а не ваше приложение с CodeMeter.
    Софт (в ядре) может обнаружить факт своей отладки по таймерам и флагам в структуре KPROCESS (самое дно, что связано с процессом), а поскольку они будут сброшены, то вариант может дать результаты. Если и это не поможет, то сломав CodeMeter вы сможете заработать лям зелёных президентов.
    Код (Text):
    1. 0: kd> dt _eprocess fffffa800402eb00 Pcb.Header.
    2. nt!_EPROCESS
    3.    +0x000 Pcb   :
    4.       +0x000 Header   :
    5.          +0x000 Type                  : 0x3
    6.          +0x001 TimerControlFlags     : 0     <-----------------
    7.          +0x001 Coalescable           : 0y0
    8.          +0x001 KeepShifting          : 0y0
    9.          +0x001 EncodedTolerableDelay : 0y00000 (0)
    10.          +0x001 Abandoned             : 0 ''
    11.          +0x001 Signalling            : 0 ''
    12.          +0x002 ThreadControlFlags    : 0x58 'X'
    13.          +0x002 CpuThrottled          : 0y0
    14.          +0x002 CycleProfiling        : 0y0
    15.          +0x002 CounterProfiling      : 0y0
    16.          +0x002 Reserved              : 0y01011 (0xb)
    17.          +0x002 Hand                  : 0x58 'X'
    18.          +0x002 Size                  : 0x58 'X'
    19.          +0x003 TimerMiscFlags        : 0
    20.          +0x003 Index                 : 0y000000 (0)
    21.          +0x003 Inserted              : 0y0
    22.          +0x003 Expired               : 0y0
    23.          +0x003 DebugActive           : 0     <-----------------
    24.          +0x003 ActiveDR7             : 0y0   <-----------------
    25.          +0x003 Instrumented          : 0y0
    26.          +0x003 UmsScheduled          : 0y0
    27.          +0x003 UmsPrimary            : 0y0
    28.          +0x003 DpcActive             : 0 ''
    29.          +0x000 Lock                  : 0n5767171
    30.          +0x004 SignalState           : 0n0
    31.          +0x008 WaitListHead          : _LIST_ENTRY [ 0xfffffa80`0402eb08 - 0xfffffa80`0402eb08 ]
    32. 0: kd>
     
  16. hcwarper

    hcwarper New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2025
    Сообщения:
    6
    То есть в настройки оси , которая на варе, не надо прописывать Debug Mode?

    Цитирую себя. Хотя это и нескромно )

    "Программа , "накрытая" защитным конвертом CodeMeter проверяет Debug Mode системы и не стартует вообще.
    Поэтому всякие модные HyperDbg не "катят". "
     
  17. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    219
    надо, и я говорю, что ос окажется под отладкой.
    мимо отладки проходит только софт.
    и если в x64dbg доходит до точки ep, то утилита gflags сбросит лог прямо под юзером.
     
  18. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.476
    Адрес:
    Россия, Нижний Новгород
    Не надо COM-порт, для ядерной отладки есть KDNET.
    --- Сообщение объединено, 11 янв 2025 ---
    Можно сделать ещё проще: при старте процесса снимать поставленный ранее патч, а на загрузке нужного модуля ставить снова.
    Тогда получится, что между запусками в кэше будет висеть образ с патчем, который восстановится на запуске, пройдёт проверку целостности, и тут же пропатчится снова.
     
    Marylin нравится это.
  19. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    490
    KDNET только для win10/11? интересует поддержка Win7
     
  20. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.476
    Адрес:
    Россия, Нижний Новгород
    На хосте может быть Win7, на госте - Win8 или новее.
     
    alex_dz нравится это.