Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.06.02;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
15-1358803496
N.Cage
2013-01-22 01:24
2013.06.02
Защита приложений


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


6-1222503093
Cryxalis
2008-09-27 12:11
2013.06.02
как заставить INDY юзать уже занятый порт?


2-1351765196
Kolya
2012-11-01 14:19
2013.06.02
Учусь


15-1358926991
Потапыч
2013-01-23 11:43
2013.06.02
Как программно отключить UAC?