Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.06.02;
Скачать: [xml.tar.bz2];

Вниз

Исключение при доступе к памяти   Найти похожие ветки 

 
Nucer   (2013-01-22 18:24) [0]

Пытаюсь обнаружить в своей программе хуки, установленные посторонними внедренными модулями. Проверяю в памяти таблицу с указателями на функции и на определенном адресе получаю исключение (в случае установленного хука):
Исключение unknown software exception (0x80000004) в приложении по адресу 0x131b05c1.

Исключение вызывает следующий код:
if PInteger(P)^ = Integer(FuncAddr) then Exists := True;

P и FuncAddr - указатели. P увеличивается в цикле (перебираю элементы таблицы), FuncAddr не изменяется. В таблице 10 элементов, исключение возникает, например, на 7-ом (если хука нет, то все нормально).

Добавлял предыдущий строкой VirtualProtect c PAGE_EXECUTE_READ, но исключение все равно появляется. Делал VirtualQuery, но не нашел ни PAGE_GUARD, ни PAGE_NOACCESS.

В чем может быть дело? Что за хитрый хук?


 
Игорь Шевченко ©   (2013-01-22 18:42) [1]

//
// MessageId: STATUS_SINGLE_STEP
//
// MessageText:
//
//  {EXCEPTION}
//  Single Step
//  A single step or trace operation has just been completed.
//
const STATUS_SINGLE_STEP               = NTSTATUS($80000004);    // winnt


 
Nucer   (2013-01-22 18:53) [2]

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


 
Rouse_ ©   (2013-01-22 18:59) [3]

STATUS_SINGLE_STEP может сработать в случае срабатывания Hardware Breakpoint. Соответственно нужно смотреть - кто его установил.


 
Rouse_ ©   (2013-01-22 19:03) [4]

Кстати, попробуй PAGE_EXECUTE_READWRITE выставить а не PAGE_EXECUTE_READ, а то попадешь случайно в страницу с текущей секцией данных и привет. Хоть ошибка и не та, но так оно правильней будет...


 
Nucer   (2013-01-22 19:12) [5]

Никогда не работал с  Hardware Breakpoint. Могу ли я проверить, установлен он сейчас на конкретный адрес или нет?


 
Rouse_ ©   (2013-01-22 19:16) [6]

Угу, DR7 регистр у нити проверить нужно.

http://alexander-bagel.blogspot.ru/2012/11/debuger-3.html

Ищи строку: Детектируем Hardware BreakPoint:


 
Nucer   (2013-01-22 19:26) [7]

Rouse_, спасибо большое, буду копаться. Случайно при гуглении попал в ваш блог (статьи про отладчик), теперь изучаю.


 
Rouse_ ©   (2013-01-22 19:29) [8]

Кстати забыл, еще STATUS_SINGLE_STEP будет установлен в случае включенного TF флага. Получить его значение можно как-то так:

const
 EFLAGS_TF = $100;

var
 Context: TContext;
begin
 ZeroMemory(@Context, SizeOf(TContext));
 Context.ContextFlags := CONTEXT_FULL;
 GetThreadContext(GetCurrentThread, Context);
 if Context.EFlags and EFLAGS_TF <> 0 then
   ... TF флаг установлен.


 
Nucer   (2013-01-22 19:47) [9]

Точно, DR7 был установлен :) Еще раз спасибо.
А адрес где хранится? В нём?


 
Rouse_ ©   (2013-01-22 19:50) [10]


> потому что модуль, устанавливающий хук, защищен Themida.

Кстати - пропустил. Вот тебе и ответ. Темида работает через DebugBlok отлаживая самого себя. Так просто эту беду не обойти.


 
Rouse_ ©   (2013-01-22 19:51) [11]


> А адрес где хранится? В нём?

С адресом немного сложнее, вот это почитай:

http://alexander-bagel.blogspot.ru/2012/11/debuger-2.html

поиск по: Реализация Аппаратных точек остановки:

ЗЫ: блин надо метки чтоли вставить в статьи, а то не удобно ссылки давать :)


 
Rouse_ ©   (2013-01-22 21:00) [12]

Еще кстати могу подсказать вариант обхода.
ReadProcessMemory позволяет считать блок памяти с обходом Хардварных бряков. Грубо аллоцируешь свой буфер и в него через ReadProcessMemory читаешь требуемый валидирования блок. Хардварные бряки не отреагируют на на доступ к контролируемой ими памяти. Проверку есесно делаешь по скопированному буферу, а не по оригинальному.


 
Rouse_ ©   (2013-01-22 21:02) [13]

ЗЫ: хм, об этом я тоже упоминал оказывается :)

http://alexander-bagel.blogspot.ru/2012/11/debuger-3.html

поиск по: Обход Memory Breakpoint


 
Nucer   (2013-01-22 21:04) [14]

Про ReadProcessMemory я уже тоже прочитал в статье, но оказалось, что память не изменена. Т. е. перехват идет именно через Hardware Breakpoint, а не через замену адреса в таблице. А потом или временный сплайсинг делают, или подмену стека, или еще что-то (не стал разбираться, так как это уже не особо важно).


 
Rouse_ ©   (2013-01-22 21:07) [15]


> но оказалось, что память не изменена.

Нет, тут цимус в том что ты обойдешь выдачу исключения и получишь на руки валидный для анализа буфер.

А перехват через HWBP сделать затруднительно ибо их всего 4 на нить, я уже точно не помню логику ядра темиды, но HWBP она использует только на самых критических участках перед входом


 
Nucer   (2013-01-22 21:32) [16]

> Нет, тут цимус в том что ты обойдешь выдачу исключения и получишь на руки валидный для анализа буфер.
Так в том и дело, что таблица не изменена. Все вызовы в программе идут через таблицу. Этот посторонний модуль только ставит HWBP на один из адресов в таблице, за счет этого и происходит перехват управления при вызове функции.
Themida используется просто в качестве протектора этого модуля, но к хуку отношения не имеет.


 
Rouse_ ©   (2013-01-22 21:34) [17]

А, ну тогда обнуляй DR7 регистр и работай как обычно.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2013.06.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
15-1358886602
Юрий
2013-01-23 00:30
2013.06.02
С днем рождения ! 23 января 2013 среда


15-1358837720
ПЛОВ
2013-01-22 10:55
2013.06.02
Как правильно работать с таким потоком?


15-1359029346
Студент
2013-01-24 16:09
2013.06.02
Колонка и микрофон.


15-1358765049
vxxv
2013-01-21 14:44
2013.06.02
Создать определенный класс.


15-1359516511
Кто б сомневался
2013-01-30 07:28
2013.06.02
Как запускать игру)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский