Часто встречаю в отладчике(Олька) антиотладочный приём seh. При трасировке кидает то в ядро,то к чёрту на рога,но ни как на необходимый участок кода Нужны хотябы приблизительные методы(не откажусь от конкретных решений) каких образом всё это безобразие закончить? Ведь "не затирать" же mov eax,fs:[0] Статьи Мэта Питрека читал как мог,но мне статьи такого класа почти непосильны
Scr[1]pt0S Попробуй в натройках отладчика включить игнор на сехи. Alt+O -> Exception и поставь все галки, можеш добавть последнее исключение на игнор, или поставь range исключений от 0 до FFFFFFFF.
Спасибо за решения,но почему-то данные способы не помогают. Процесс терменируется,но при этом приложение запускается исправно,так было и до этого,смотрю в список потоков их там аж 10,каким образом проследить код в потоках? может быть они ответственные за выкидывание процесса?
Scr[1]pt0S Может ты пытаешся протектор какойто отлаживать (похоже ЕхеКриптор ) читай инфу по снятию прота. researchist Тожесамое.
Криптором там и не пахнет,пакеров и близко не видно,просто такой антиотладочный трюк(походу арифметическая операция приводит к плохому результату -1,0,nil и срабатывает seh не ОС а проги)
да так оно и есть, только вот странно, что про обход этого нет информации... может и правда можно как то "затереть" эти mov eax,fs:[0] ?
Это конечно можно сделать только стек прийдётся выравнивать,что есть гимор. researchist а ты случайно не при креке встретился с этим? может быть вместе решили бы эту проблему,как считаешь?
Ты имеешь ввиду трассировку Seh-ов в Оле? Если так, то проще Seh-ы проходить через скрипт. А если в ручную, то попадая на Seh, в стеке по [esp+4] находится его вершина. Ставишь бряк на этот адрес и далее Shift-F9 и ты на вершине и можешь продолжать трассировку.
Недавно перечитал статьи Мэта.И вот что надыбал по адресу fs:[0] хранится теb потока первое двойное слово говорит о ExecptionRegistration(данная структура представляет из связанный список,первый dword говорит о обработчике ИС который будет вызван при exception).Так вот его и надо править т.к защита в проге ставит свои обработчики(то что программер накодил,кроме этого ОСь оставляет по одному дефолтному обработчику на каждый поток).Попытался с помощью скриптов хотябы прочитать адреса обработчиков выглядело это у меня как будто так: mov addr_meth,fs:[0] <-- error mov addr,[addr_meth] log addr плугин скриптов жутко ворчит на ошибку,похоже что нельзя использовать fs регистр? вобщем дело техники,но у меня с практикой туго, помогите советов,буду благодарен.
Scr[1]pt0S Что-то вы с researchist вокруг да около топчетесь, но кроме общих слов и "воплей о помощи" от вас еще ничего не слышали Конкретный вопрос - прочитать адреса обработчиков. Конкретный ответ - если прога еще не успела тебе напакостить, то достаточно в Оле кликнуть View -> SEH chain и увидишь всю цепочку. Что касается общего вопроса, то SEH для антиотладки может использоваться по разному, в том числе и для неявной передачи управления в другое место, в том числе и "к черту на рога". Если прога обнаруживает отладчик, то она может открытым текстом материться и\или легально идти на выход через ExitProcess. А может хитро попортить тебе кровь, послав тебя к черту на рога через SEH - ты будешь долго взывать о помощи и изучать Мэта, после чего окажется что дело совсем не в этом и при нормальной работе прога в этот сэх вовсе не попадает (например путем путанных вычислений при отладке получается деление на 0, а без отладчика не на 0). С игнором\не-игнором исключения тоже дело обстоит хитрее. Например, не так давно была тема по INVALID_HADLE - сначала явно вызывается RaiseExeption, который отладчику нужно игнорировать, а затем CloseHandle c инвалидным параметром и т.к. при этом исключение происходит только под отладчиком, то его игнорировать нельзя. Поэтому пока Asterix не усовершенствовал свой HideDebugger, эту фишку можно обойти только ручками, включая и выключая игнор исключения. (Кстати попытка зайти в сэх по Shift+F8/F9 при RaiseExeption в Оле не срабатывает - нужно смотреть адрес обработчика, ставить на него бряк и перезапускать прогу - в надежде на то, что прога не обнаружит этот бряк и не вылетит раньше ) Вывод - нужно рассматривать конкретные ситуации, а не задавать риторические вопросы на все случаи жизни
это можно сделать примерно так: mov bptmp,00BAC4FB //последнее исключение eoe @L run @L: cmp eip,bptmp //ищем последнее исключение je @R0 esto jmp @L @R0: //этот блок можно не использовать findop bptmp,#83C404# cmp $RESULT,0 je @Er bp $RESULT esto bc $RESULT ........
Если заигнорил все исключения, и это не криптор, то SEH тут вообще не при чем, нужно искать антиотладку, а SEH таковым не является, это скорее антитрэйс, но ни как не антиотладка. Так что с игнором исключений всё должно запускаться. PS Мог бы дать ссылку на программу, тебе ответили конкретней, а так....
PE_Kill К инвалидному CloseHandle это не относится - см.мой пост выше, а также тут и тут Можно элементарный крякми сделать с RaiseException и CloseHandle, который под отладчиком будет выбрасывать прогу к "черту на рога" как при игноре, так и при не-игноре исключений Интересно, а обнаружение отладчика и передача управления мягко говоря не туда - это не антиотладка ?