Сейчас на форуме: tyns777, cppasm, dutyfree, asfa (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Обойти проверку CRC файла
Посл.ответ Сообщение

Ранг: 26.9 (посетитель), 1thx
Активность: 0.050.01
Статус: Участник

Создано: 16 февраля 2017 21:28
· Личное сообщение · #1

Имеется жертва, с разрабами которой многолетняя "дружба" типа кто - кого. Не так давно они снова показали козью морду и сменили ASProt на VMProt3. В результате разрабы празднуют победу, а крякеры провалились полностью - жаждущие, в том числе на nsane, уже задолбали: когда и чё. Выяснил, что по VMProt3 в паблике вообще НИЧЕГО нет. Показательно, что LCF-AT категорически отказалась им заниматься, а на запросы отмалчивается или шлёт куда подальше.
У сабжа секция кода не закриптована, и тут бы сам Бог велел сварганить инлайн патч, тем более, что по старым наработкам хорошо знаю, где и что подправить. Всё бы так, да ма-аленькая "загогулина" © - проверка CRC. Просмотрел всё, что есть по предыдущим версиям VMProt, - ничего не подходит. Попробовал поискать решение "в лоб" - не получилось: наги "File corrupted! ..." и BugTrap удаляются без проблем, однако за собой они тянут Process terminated, что преодолеть не удалось. Интересно, что нашёл место, где проводится сравнение хешей, но ничего сделать не смог. (Не смешно...).

Появилась идея. Надо дать возможность сабжу загрузиться в память до того момента, когда проверка хешей уже будет проведена (но ещё не начата загрузка основного кода), сделать в этом месте остановку, пропатчить файл в памяти и после этого продолжить загрузку дальше. Разработал методику поиска, в результате быстренько удалось найти несколько таких мест. В общем, в Olly всё работает прекрасно: BP > патчинг > F9 - и вуаля - сабж загружается без всяких NAG'ов и полностью вылечен.

Дык, теперь бы реализовать это программно!
Все точки останова находятся в системных библиотеках или в защищённой области памяти. Ни в секции VM, ни в секции кода такие точки найти не удалось. О-очень хотелось найти такие в секции кода, но сволочной протектор не даёт там ставить ВР.
Скорее всего, надо попытаться сделать что-то вроде лоадера, на первый взгляд алгоритм работы его не сложный:
- запуск сабжа;
- остановка процесса загрузки в память в точке, находящейся в системной dll'ke. Ориентиром может быть определённая API функция;
- патчинг в секции кода, при этом есть особенность: патчить надо в памяти, а не на диске;
- снова запуск.
Реально ли это изобрести? Где что смотреть и изучать?

P.S. Прошу прощение за многословие. Наболело...




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 16 февраля 2017 21:49 · Поправил: difexacaw
· Личное сообщение · #2

Chris

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

-----
vx





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 16 февраля 2017 22:49
· Личное сообщение · #3

Chris пишет:
Реально ли это изобрести? Где что смотреть и изучать?

Подобно и делалось --> Link <--

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

Тоже неплохо, но лишний гемор... И нюансов-то тут много. Если б движок для этого был готовый, а то пилить некогда

-----
IZ.RU





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 16 февраля 2017 22:55 · Поправил: difexacaw
· Личное сообщение · #4

DenCoder

В самом простом случае секция может скопироваться в буфер и там исполняться(так как нет релатив адресации за пределы секции x32).

-----
vx




Ранг: 30.2 (посетитель), 31thx
Активность: 0.060
Статус: Участник

Создано: 16 февраля 2017 22:58
· Личное сообщение · #5

Chris пишет:
Надо дать возможность сабжу загрузиться в память до того момента, когда проверка хешей уже будет проведена


Это наверняка не прокатит, судя по денувке (64 битный вмпрот 3+), проверки CRC происходили многократно
(десятки тысяч раз) и рандомно участками по примерно 10-255 байт во время запуска приложения и уже после
прохождения винмайна, работы в меню и загрузки сохраненной игры.

Но ты не огорчайся, патчи, что тебе там надо, потом аппаратный бряк на чтение этого кода ставь, смотри кто и
как считает с него crc, там наверняка будет такое (пример для 64 бит):

Code:
  1. ....
  2. | C1 E0 07 | shl eax, 7 |
  3. ....
  4. | C1 E9 19 | shr ecx, 19 |
  5. .....
  6. |32 02 | xor al, byte ptr ds:[rdx] <---- считает "crc"
  7.  


получи правильное значение для своего участка, дальше можешь его подбрутить, подогнав "свободные"
байты. Это 1 способ. Есть ещё более забавный



Ранг: 26.9 (посетитель), 1thx
Активность: 0.050.01
Статус: Участник

Создано: 16 февраля 2017 23:35
· Личное сообщение · #6

oldman пишет:
Это наверняка не прокатит

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




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 16 февраля 2017 23:57 · Поправил: DenCoder
· Личное сообщение · #7

difexacaw пишет:
В самом простом случае секция может скопироваться в буфер и там исполняться

Не, под первым слоем несколько виртуальных машин, в каждой перед выходом проверка crc рандомного региона. Именно поэтому не даёт вмпрот ставить софт бряки. Адреса выходов из вм надо будет менять на нужные, а это перемалывать все вм и таблицы crc.

Можно ловить выход из вм хардбряками, но по-моему адрес выхода поксорен неким значением. Чтоб его узнать, надо в "эпилог"-функции, коих несколько, определять его. Всё можно, но эти решения для тс будут ой как непросты. Самым правильным тогда уж будет радикальный подход - полный девирт всех лент и убирать проверки crc. Это будет универсально. А так, тс правильно предложил способ. Его недостаток в ручном анализе только, но для одной задачи и быстрее будет, если правильно подходить.

И вообще-то, да, oldman прав, надо будет подменять crc, высчитанное на заменённом участке.

oldman пишет:
получи правильное значение для своего участка, дальше можешь его подбрутить, подогнав "свободные"
байты. Это 1 способ. Есть ещё более забавный

Лично помимо рандомных проверок встречалась ещё большая )

-----
IZ.RU





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 17 февраля 2017 00:08
· Личное сообщение · #8

DenCoder

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

Добавлено спустя -56 минут
> Можно ловить выход из вм хардбряками
> Самым правильным тогда уж будет радикальный подход - полный девирт

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

-----
vx





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 17 февраля 2017 00:14 · Поправил: DenCoder
· Личное сообщение · #9

Для рандомных проверок crc вспомнил - можно подменять значение rdtsc на одно и то же (оно там используется в качестве ГПЧ для выбора региона проверки), тогда проверок пофиксенного региона не будет . Но это ж нужно, чтоб драйвер только для этого приложения делал такие подмены и только при нахождении инструкций в определённых местах.

Добавлено спустя -57 минут
difexacaw пишет:
подмена данных


а тс нужно

Chris пишет:
- патчинг в секции кода


Добавлено спустя -53 минут
difexacaw пишет:
Я не представляю о чём вы говорит

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

-----
IZ.RU





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 17 февраля 2017 00:30
· Личное сообщение · #10

DenCoder

> - патчинг в секции кода

Вот я про это и говорю, что он нужен при вашем решении

-----
vx





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 17 февраля 2017 00:52 · Поправил: DenCoder
· Личное сообщение · #11

Как бы подошёл я более проще к подмене кода, накрытого вмпротом:
план A
- найти rdtsc-примитивы
- вбить одно возвращаемое значение, чтобы проверялся только один регион (естественно, который не трогали). Если используется больше одной вм, то для каждой своё значение будет. Если размер изменяемого кода невелик, можно просто угадать все значения с вероятностью в 100%
- если есть вызовы глобальных проверок crc, тут уже изучать надо. Высчитать адреса для проверяемых регионов и их crc в большой таблице можно, и подсунуть свои пошифрованные crc, но занимает время

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

-----
IZ.RU





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 17 февраля 2017 01:28
· Личное сообщение · #12

oldman пишет:
Есть ещё более забавный

на него лет 10 не обращали внимания, пусть ещё столько же....потом расскажем..

-----
Чтобы юзер в нэте не делал,его всё равно жалко..




Ранг: 26.9 (посетитель), 1thx
Активность: 0.050.01
Статус: Участник

Создано: 17 февраля 2017 08:30
· Личное сообщение · #13

Можно понять гуру, коим интересно рассматривать проблему глобально, применительно к VMProt'у вообще. В данном же случае мне бы хотелось практически реализовать один из возможных, как мне кажется, способов обойти проверку CRC. Скорее всего он не станет универсальным, но где-то вдруг поможет решить проблему. Это ведь тоже даёт право на жизнь, не?

Как вариант, это может быть лоадер, который:
- запускает приложение;
- мониторит процесс загрузки, ловит нужную API и процесс останавливает (фактически это полный аналог функции ВР в Olly);
- производит патчинг в секции кода (аналогично тому, как это делает dUP, только патчить надо в памяти, а не на диске);
- отпускает процесс идти дальше.

Реально ли замутить такое?




Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 17 февраля 2017 09:33
· Личное сообщение · #14

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

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 17 февраля 2017 15:48 · Поправил: DenCoder
· Личное сообщение · #15

Bronco пишет:
ну а так совет же дельный дали, даже наводку с --> патерном<--

Если патченных регинов, которые проверяются, больше 4х, то хард бряков не хватит

Добавлено спустя
Chris пишет:
только патчить надо в памяти, а не на диске)

Никто никогда на диске и не патчил. Пропатчить можно, пользуясь хардбряками можно, если условие выше выполняется. Если нет, то план B

-----
IZ.RU




Ранг: 30.2 (посетитель), 31thx
Активность: 0.060
Статус: Участник

Создано: 17 февраля 2017 16:05 · Поправил: oldman
· Личное сообщение · #16

DenCoder пишет:
больше 4х, то хард бряков не хватит


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




Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 17 февраля 2017 16:26
· Личное сообщение · #17

DenCoder пишет:
Если патченных регинов, которые проверяются, больше 4х

подели регион сканирования на 255 байтов, вот и будет тебе кол-во участков, как рандом работает не вникал, но большую часть участков стабильно сканят. Ну а так, всё это гавно нагибается на раз_два.
Учитывая что любой вопрос по гавнопроту либо риторический, либо табу, либо козу круктят, паблить желания нет.

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 17 февраля 2017 16:46 · Поправил: DenCoder
· Личное сообщение · #18

oldman пишет:
В Думе я пропатчил несколько десятков выходов из вм, естественно
пришлось многократно прогонять скрипт в дебагере и т.д., время всё это занимает - ну а по другому и не будет.

По-другому - план B

Bronco пишет:
подели регион сканирования на 255 байтов

Рандомные регионы маленькие, меньше 255 байт, поделишь на 255 - целое будет 0 )
А хард бряк на доступ к памяти вообще-то только 4 байта может охватить )

Добавлено спустя -56 минут
А в принципе хорошую идею подал Инде --> Link <--

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

-----
IZ.RU




Ранг: 30.2 (посетитель), 31thx
Активность: 0.060
Статус: Участник

Создано: 17 февраля 2017 16:56
· Личное сообщение · #19

DenCoder пишет:
По-другому - план B


учитывая тормоза поверх вмпрота, +время на реализацию и отладку такого - не, все таки единственный выбор -
план А




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 17 февраля 2017 17:00 · Поправил: DenCoder
· Личное сообщение · #20

oldman, да, тут надо выбирать между проще и тормозами.

Основные идеи нарисовали, варианты стратегий есть. Как конкретно делать - тс уже сам может собрать, систематизировать информацию и в путь

-----
IZ.RU





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 17 февраля 2017 17:05
· Личное сообщение · #21

DenCoder пишет:
Bronco, из тебя сделать клон и немного подправить, впихнуть легенду и прописать по другому адресу, ты ж ничего не будешь знать об иногда говнистом оригинале.

Это уже клон писал, или говнистый оригинал. ??
млять, переведи на доступный.
DenCoder пишет:
Патчим в копии только то, что надо, выполняется копия.

ну если решение рабочее, дерзай.никто же не настаивает на более простых..

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 17 февраля 2017 17:06 · Поправил: DenCoder
· Личное сообщение · #22

Bronco пишет:
ну если решение рабочее, дерзай.никто же не настаивает на более простых..

тс - не я )

Добавлено спустя 3 минуты
2 задачи были в моей практкике, совместить решения по ним - будет решение и этой задачи. Как оно будет работать, тормозно не тормозно - это уже дело испытаний. Возможно, решение надо будет совершенствовать или искать другое. Не хочу сейчас искать другие решения, может и есть, поищите ещё. Но теоретически, для плана B, поскольку проверка рандомна, то тормоза-то будут и не всегда. Для избавления вообще от тормозов план A, но он требует времени и подготовки. Для производной от идеи Инде маленький тормозок будет каждый раз при выходе из вм, если выходы из вм не патчить в копии кода.

oldman пишет:
учитывая тормоза поверх вмпрота, +время на реализацию и отладку такого - не, все таки единственный выбор -
план А

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

-----
IZ.RU





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 17 февраля 2017 18:34
· Личное сообщение · #23

DenCoder пишет:
если выходы из вм не патчить в копии кода.

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

-----
Чтобы юзер в нэте не делал,его всё равно жалко..



 eXeL@B —› Вопросы новичков —› Обойти проверку CRC файла
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати