Защита exe при обратном вызове TLS, пытаясь понять поведение


2

У меня есть приложение, запутанное защитой FSG. Когда я попытался распаковать его, первым из тех, что у меня было, является, когда я запустил процесс с помощью отладчика или отладчика позже, я немедленно получаю исключение ACCESS VIOLATION, потому что обратный вызов Tls выполняется, со следующим содержимым:

.text:0063EE70 public TlsCallback_0 
.text:0063EE70 TlsCallback_0:       ; DATA XREF: .CRT:TlsCallbacks_0 
.text:0063EE70 mov  [esi-6Dh], ebx 
.text:0063EE73 xlat byte ptr gs:[ebx] 
.text:0063EE75 retf 155h 

Как это возможно? Регистры внутри tlscallback по умолчанию указывают на некоторые разделы/сегменты? Здесь используется esi, но у него есть значение по умолчанию, из ntdll:ntdll_LdrShutdownThread+386

Я прикладываю полную трассировку стека, это трассировка стека, из которой вызывается этот обратный вызов, когда я запускаю приложение под ida pro + windbg, Обратный вызов tls ударяется до точки входа.

stack trace

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

tls

Как вы можете видеть TLS_end и TLS_start точек на базе изображения.

Так что мой вопрос: как этот обратный вызов не сбой программы без отладчика? И почему это, когда я присоединяю отладчик? Это какая-то техника анти-debuggin я не могу понять,

tls callback

1

Это старая анти-отладки трюк, чтобы использовать функцию обратного вызова TLS. Код в TLS запускается до точки ввода исполняемых файлов, а управление отладчиком получает контроль. Это позволяет TLS проверять наличие отладчика и действовать соответствующим образом.

Один из способов обойти это использование OllyDbg заключается в том, чтобы приостановить «Системную точку останова» вместо стандартного «WinMain», и я считаю, что плагин Olly Advanced позволяет вам разрывать TLS.

Возможно, что установка INT 3 (0xCC) в начале TLS (и замена исходного байта) сломается и позволит вам пройти, чтобы найти код нарушения, но я не помню, работает ли это на самом деле или нет, вы должны его протестировать.


0

Обратные вызовы TLS могут выполняться при подключении, так как ОС создает новый поток, указывающий на DbgUiBreakin с точкой останова программного обеспечения, чтобы остановить выполнение программы, а новый поток вызывает выполнение обратного вызова TLS.

  0

Но на старте процесса, ДУС обратного вызова выполняется слишком правильно? Обратный вызов точно так же срабатывает при статической разборке, как они это сделали, что этот обратный вызов не выполняется, при запуске процесса? И только с приложением отладчика 27 ноя. 172017-11-27 21:40:29

  0

Также здесь приведены следующие инструкции: 'mov [esi-6Dh], ebx, xlat byte ptr gs: [ebx]' по какой-либо причине не вызывает нарушения прав доступа, как это означает, что ebx и esi указывают на действительные местоположения? 27 ноя. 172017-11-27 21:41:05

  0

Я не знаю, трудно сказать без двоичного кода. 27 ноя. 172017-11-27 21:42:21


1

Исключения из TLSCallbacks отбрасываются Windows, но прекращаются последующие вызовы от вызова, а затем управление передается на главную точку входа.

Однако код, который вы указали для TLSCallback, выглядит как мусор, регистры не предсказуемы, и я сомневаюсь, что то, что вы показали, фактически выполнено.

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

Неверная метка для TlsEnd. Нулевые отметки неиспользуемых значений в первых двух полях (начало и конец области памяти для резервирования).

Вы можете увидеть примеры TLS на моем сайте: http://pferrie.host22.com (при условии, что он работает сегодня) в презентации разделе компании с 2008