Форум: "Прочее";
Текущий архив: 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