Здрасте. Допустим изменили мы регистр Ds на Gs, добавив префикс 0x65. Как отлаживать в таком случае код, например потрассировать такой: Код (Text): assume fs:nothing, gs:nothing push ds mov eax,fs:[TEB.Peb] pop gs mov eax,gs:PEB.Ldr[eax] mov eax,gs:PEB_LDR_DATA.InLoadOrderModuleList.Flink[eax] mov eax,gs:LDR_DATA_TABLE_ENTRY.InLoadOrderModuleList.Flink[eax] mov ebx,gs:LDR_DATA_TABLE_ENTRY.DllBase[eax] ; ntdll.dll
Clerk Эм.. В 32 битной среде с трейсом будут проблемы да и вообще - если просто тупо вставить такой код - он не выполнится. Ибо при попытке доступа, ос генерит сепшен, и сбрасывает GS в NULL. А в 64 битной среде gs доступен на сколько я помню. И там такое проканает.
TermoSINteZ Говорим про x86. Этот код выполнится без проблем, попробуйте(если не трассировать). Просто так я бы не спросил
Clerk На какой OS вы его выполняете? На 7-ке пробовали? ADD: Хотя пофиг и на XP не пашет. Падает тут Код (Text): 0040111E .1E PUSH DS 0040111F .64:A1 30000000 MOV EAX, DWORD PTR FS:[30] 00401125 .0FA9 POP GS ; Modification of segment register 00401127 .65:8B40 0C MOV EAX, DWORD PTR GS:[EAX+C] <----- 0040112B .65:8B40 09 MOV EAX, DWORD PTR GS:[EAX+9] 0040112F .65:8B00 MOV EAX, DWORD PTR GS:[EAX] 00401132 .65:8B58 18 MOV EBX, DWORD PTR GS:[EAX+18] и еще раз говорю что и без отладчика падает ). Может я что-то не так делаю )
TermoSINteZ На XP. На 7 тоже работать должен(не проверял, но судя по ядру так), а трассировать не получится.
Clerk Сорри - работает убрал ненужное (видимо у меня смещения кривые были. Ибо хз откуда брал их щас). Вот это оставил. Код (Text): mov eax,fs:[30h] pop gs mov eax,gs:PEB.Ldr[eax] mov eax,gs:PEB_LDR_DATA.InLoadOrderModuleList.Flink[eax] Так не падает. Хороший способ защиты от трейса. )
TermoSINteZ У вас просто смещение инвалидное, возникает #AV. Должно быть так(сам код только пример, главное адресация через Gs): Код (Text): 1E push ds 64:A1 30000000 mov eax,dword ptr fs:[30] 0FA9 pop gs 65:8B40 0C mov eax,dword ptr gs:[eax+C] 65:8B40 0C mov eax,dword ptr gs:[eax+C] 65:8B00 mov eax,dword ptr gs:[eax] 65:8B58 18 mov ebx,dword ptr gs:[eax+18]
Clerk да я это уже понял ) В посте предыдущем исправил. Странно, а структуры у вас брал кстати (быстрым поиском по васму, вы давали их) для масма. ну не важно уже.
Clerk Да, действительно... при трассировке возникает AV - адрес получается какой-то левый. Причём вот что интересно - в сл. коде Код (Text): push ds pop gs mov eax, gs:var проблема возникает, даже если установить бряк не на саму инструкцию доступа к gs-адресу, а на pop gs. Может отладчик некорректно патчит код при установке/снятии бряка?
Clerk Мои предположения (по первым впечатлениям) в том, что отладчик сбрасывает GS в NULL ) Вот тока почему - я не знаю, надо копать. Скорее всего он придерживается некоторым правилам. Либо сам использует GS в некоторых целях.
TermoSINteZ Посредством манипуляций с контекстом потока(CONTEXT) нельзя прочитать регистр Gs. Тут отладчик не имеет значения.