Сейчас на форуме: Magister Yoda, vasilevradislav (+5 невидимых)

 eXeL@B —› Крэки, обсуждения —› Как обойти проверку целостности кода в секции
Посл.ответ Сообщение

Ранг: -0.7 (гость), 2thx
Активность: 0=0
Статус: Участник

Создано: 01 октября 2013 11:20 · Поправил: RebelNeo
· Личное сообщение · #1

Доброе время суток! Есть программа, редактор карт GPSMapedit http://geopainting.com/download/mapedit2-0-77-1.zip . С регистрацией как бы уже понятно и решено, мало того, были открыты "недокументированные" фичи в программе, но это уже через прямой патч или лоадер и вот беда, при прямом патчинге или через лоадер прога теряет регистрацию. Как отловить этот затык хз, т.к. это явно не банальный CRC32, никаких окон не появляется, лишь при открытии любого файла в эбауте меняется надпись с зарегистрированной копии на не зарегистрированную и соответственно далее версия не работает как зарегенная. Т.е. изменение хоть одного байта в секции .text и прога теряет регистрацию




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 01 октября 2013 11:27
· Личное сообщение · #2

--> Link <--




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 01 октября 2013 11:30 · Поправил: Dr0p
· Личное сообщение · #3

Маршрутизируйте.

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



Ранг: -0.7 (гость), 2thx
Активность: 0=0
Статус: Участник

Создано: 01 октября 2013 11:45
· Личное сообщение · #4

Ок, спасибо



Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 01 октября 2013 17:52 · Поправил: kunix
· Личное сообщение · #5

Dr0p
Звучит довольно нереально, если у человека нет либы для переделки копии кода на новый адрес загрузки. Учтите, речь идет о EXE без reloc-ов.
Я бы сделал проще - перехватил бы какую-то апи, вызываемую из функции X, в этой апи правил бы адрес возврата на мой код, и патчил X. В моей коде, вызываемом при возврате X, восстанавливал бы патч X.
Если в X нет вызова проверки целостности - то все ок.

[everyone]
А какие вообще есть способы проверить целостность секции кода? Пока на ум приходят:
1) Прямое чтение юзермодными инструкциями
2) ReadProcessMemory
3) shared секция кода, проверка делается в другом процессе с тем же EXE (может даже rundll32 можно загрузить).
Кстати, по опыту знаю, что на shared секцию кода reloc-и применяются не один раз

Может еще можно замапить секцию кода в другое место через аналоги MapViewOfFile и там прочесть?

Вообще, в WinNT можно замапить некоторый виртуальный адрес на еще один адрес без помощи своего кода в кернелмоде?
Первый адрес получен не через CreateFileMapping, естессно.
В WinCE 5.x в юзермоде работает VirtualSetAttributes.




Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 01 октября 2013 18:59
· Личное сообщение · #6

kunix пишет:
А какие вообще есть способы проверить целостность секции кода?

tls callback. А еще можно считать контрольную сумму секции и использовать ее в программе как значение для условных переходов

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 01 октября 2013 19:07 · Поправил: kunix
· Личное сообщение · #7

Crawler пишет:
tls callback.

Если я еще не впал в маразм, то TLS callback-и срабатывают рано, еще до аттача отладчика, так?
Т.е. это скорее способ вызвать код до отладчика, а что уже в том коде делать - другой вопрос.
Этот способ обламывается, если патчить в памяти процесса не сразу.

Crawler пишет:
А еще можно считать контрольную сумму секции и использовать ее в программе как значение для условных переходов

Так у меня вопрос, как эту сумму считать? Надо же байты получить как-то, причем незаметно.




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 01 октября 2013 20:50
· Личное сообщение · #8

kunix пишет:
Надо же байты получить как-то, причем незаметно

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

а если есть? мало того, нужный нам кусок кода декриптится незадолго до вызова, потом снова криптится (veh). это не к топику. вспомнилась тут одна шняжка интересная. решал с помощью DrX и анти-антидебага с get/setcontext, на мой взгляд не красиво получилось

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 01 октября 2013 22:41
· Личное сообщение · #9

kunix

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



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 02 октября 2013 03:02
· Личное сообщение · #10

GPSMapedit содержит в себе самопальную ВМ и довольно злостную. Один из лучших крекеров команды TSRh ее ломал очень плотно, сломал, а потом все-таки скрытая проверка вылезла и пришлось доламывать. Так что, удачи!

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

Для проверок целостности, которые используют относительное смещение не подходит. Е8 00 00 00 00 никто не отменял.

P.S. Защита достойная, чтобы ее разобрать, хотя сам я сабж не смотрел.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 02 октября 2013 03:53
· Личное сообщение · #11

int

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



Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 02 октября 2013 11:26 · Поправил: kunix
· Личное сообщение · #12

int
А что в ней злостного? Скорее всего, там эмулируются инструкции x86, просто записанные иначе. Надо лишь посидеть на жопе ровно и разобрать обработчики всех опкодов.
Кстати крекер не поделится дизассемблером для той VM?

Dr0p
Оно может и сработает. Но при условии, что
1) Обращения к данным идут по абсолютной адресации.
2) Пункт 1 в применении к байтам кода.
Ибо если контрольная сумма считается относительно текущего EIP - нутыпонел.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 02 октября 2013 12:18 · Поправил: Dr0p
· Личное сообщение · #13

kunix

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

Метода маршрутизацией называется потому что это обход "маршрута"(графа), который не линеен обычно. Тоесть обычно выполняется бактрейс(разворачивается стек - аля стековая маршрутизация, если CurrentNL > TargetNL), затем трассируется(если CurNL < TarNL) и так многократно. Иногда поточная маршрутизация используется - например один поток синхронно зацикливается при доступе к ресурсу, второй поток переключает его контекст на копию проекции.

Обычно никакие самопроверки не мешают. Маловероятно что это не сработает на сабже.

Тут давно принципы описаны http://exelab.ru/faq/IDP

Кстате раз я вспомнил про идп, то напомню вам что модель памяти плоская в нт, тоесть код может располагаться по разным линейным адресам, но смещение будет одинаково. Жаль что это на x64 не робит



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 02 октября 2013 12:18
· Личное сообщение · #14

Dr0p
Относительных за пределы нет. Но есть еще такие понятия как switch-таблицы, vtable и прочее. Без релоков, подчеркиваю, нет 100% надежности все это не поломать. А если не трогать, управление кодом просто уйдет обратно в оригинальную секцию и все.

kunix пишет:
А что в ней злостного?

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




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 02 октября 2013 12:23 · Поправил: Dr0p
· Личное сообщение · #15

int

> switch-таблицы

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

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

Кстате NXSEH обходится через маршрутизацию. Посморите реализацию ;)

Code:
  1. _ZwQueryVirtualMemory proc uses ebx ProcessHandle:HANDLE, BaseAddress:PVOID, InformationClass:ULONG, Information:PVOID, InformationLength:ULONG, ReturnLength:PULONG
  2.          %DBG "LWE: ZwQueryVirtualMemory()"
  3.          %GETENVPTR Ebx
  4.          assume ebx:PUENV
  5.          cmp ProcessHandle,NT_CURRENT_PROCESS
  6.          jne @f
  7.          cmp InformationClass,MemoryBasicInformation
  8.          jne @f
  9.          cmp InformationLength,sizeof(MEMORY_BASIC_INFORMATION)
  10.          jne @f
  11. ; Стаб для RtlpStkIsPointerInDllRange().
  12.          push BaseAddress
  13.          mov eax,LWE_CHECK_IP
  14.          Call LWE
  15.          %DBG "LWE: WALK(0x%X): 0x%X", Eax, BaseAddress
  16.          dec eax
  17.          dec eax
  18.          jnz @f
  19.          push ReturnLength
  20.          push InformationLength
  21.          push Information
  22.          push InformationClass
  23.          push BaseAddress
  24.          push ProcessHandle
  25.          Call [ebx].pZwQueryVirtualMemory
  26.          %DBG "LWE: ZwQueryVirtualMemory(): 0x%X", Eax
  27.          test eax,eax
  28.          mov ecx,Information
  29.          jnz @f
  30.          mov MEMORY_BASIC_INFORMATION._Type[ecx],MEM_IMAGE
  31.          xor eax,eax
  32.          ret
  33. @@:
  34.          mov eax,[ebx].pZwQueryVirtualMemory
  35.          %DBG "LWE: ZwQueryVirtualMemory(SKIP)"
  36.          pop ebx
  37.          leave
  38.          Jmp Eax
  39. _ZwQueryVirtualMemory endp
  40.  
  41. xVEH:
  42.          %GET_CURRENT_GRAPH_ENTRY
  43. VEH proc uses ebx esi ExceptionPointers:PEXCEPTION_POINTERS
  44.          %DBG "LWE: VEH CALLED", Eax
  45.          %GETENVPTR Esi
  46.          assume esi:PUENV
  47.          mov ebx,ebp
  48.          assume ebx:PSTACK_FRAME
  49.          jmp @f
  50. Next:
  51.          mov ebx,[ebx].Next
  52. @@:
  53.          cmp fs:[PcStackBase],ebx
  54.          jna Exit
  55.          cmp fs:[PcStackLimit],ebx
  56.          ja Exit
  57.          mov eax,[ebx].Ip
  58.          cmp [esi].CodeBase,eax
  59.          ja Next
  60.          cmp [esi].CodeLimit,eax
  61.          mov ecx,[esi].Delta
  62.          jna Next
  63.          %DBG "LWE: VEH ROUTE IP = 0x%X", Eax
  64.          sub [ebx].Ip,ecx
  65.          jmp Next
  66. Exit:
  67.          xor eax,eax
  68.          ret
  69. VEH endp


- ZwQueryVirtualMemory пропатчен в буфере, оригинальный код не тронут. Для недетекта.



Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 02 октября 2013 12:52 · Поправил: kunix
· Личное сообщение · #16

Dr0p, мне вас сложно понимать.. ладно.

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

На mapedit это должно сработать, там с виду просто все в X. Инлайнового ассемблера, которым можно было бы задетектить трассировку, не видно. Проверок адреса возврата скорее всего тоже нет.

RebelNeo
Я боюсь, после этих обсуждений, в следующей версии горячие места будут под VM.

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


Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 02 октября 2013 12:59 · Поправил: Dr0p
· Личное сообщение · #17

kunix

http://exelab.ru/faq/SFC

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

Короче, не вижу проблемы.)




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 02 октября 2013 13:02
· Личное сообщение · #18

kunix пишет:
боюсь, после этих обсуждений, в следующей версии горячие места будут под VM.

вы бы что ли сам екзе поизучали прежде чем демагогию здесь разводить

и там кроме вирутальной машины в самом екзе, есть прыжки из виртуальной машины в другой модуль который в ресурсах, и там тоже не все просто

да и сам екзе кусками под vm, по пол функции



Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 02 октября 2013 13:05 · Поправил: kunix
· Личное сообщение · #19

reversecode пишет:
вы бы что ли сам екзе поизучали прежде чем демагогию здесь разводить

Ну вроде поизучал. Я имел ввиду, что патченные места из X в следующей версии будут под VM.

reversecode пишет:
и там кроме вирутальной машины в самом екзе, есть прыжки из виртуальной машины в другой модуль который в ресурсах, и там тоже не все просто

Покажите.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 02 октября 2013 13:10
· Личное сообщение · #20

kunix пишет:
Покажите.

ах да, пардон, с другой вм спутал




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 02 октября 2013 13:47
· Личное сообщение · #21

RebelNeo пишет:
http://geopainting.com/download/mapedit2-0-77-1.zip

Code:
  1. /*5C61E5*/  CALL 005C647D
  2. /*5C61EA*/  MOV [791060],AL========>;)
  3. /*5C61EF*/  PUSH 5C61F6
  4. /*5C61F4*/  RETN


-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.


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


Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 02 октября 2013 14:21
· Личное сообщение · #22

kunix пишет:
Как нашли, расскажете?

У мну свои секреты ))

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




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

Создано: 02 октября 2013 17:19 · Поправил: dosprog
· Личное сообщение · #23

RebelNeo,

>>версия дальше не работает как зареганная...

а в чём сама-то суть недобитости этой MapEdit 2.0.77.1 ?
Ну, пишет она "[зарегистрированная версия]" в эбауте,
ну не пишет "[не зарегистрирована]" поверх карты при максимальном увеличении её масштаба.
А какие там ещё "некоторые особенности", по которым можно определить "нерегистрированность" ?

P.S. - кое-что я уже вижу и сам (после открытия файла). Хорошо бы полный перечень чудес.




Ранг: -0.7 (гость), 2thx
Активность: 0=0
Статус: Участник

Создано: 03 октября 2013 11:38
· Личное сообщение · #24

kunix пишет:
RebelNeoЯ боюсь, после этих обсуждений, в следующей версии горячие места будут под VM.

Что делать, что делать, попробую отписать в личку участвующим.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 03 октября 2013 15:14
· Личное сообщение · #25

RebelNeo
Предлагаю закрыть эту тему, ссылку на нее повесить на соседнюю. Эх, склейки тем очень не хватает(


 eXeL@B —› Крэки, обсуждения —› Как обойти проверку целостности кода в секции
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати