Главная страница
    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.004 c
6-1222503093
Cryxalis
2008-09-27 12:11
2013.06.02
как заставить INDY юзать уже занятый порт?


2-1351936642
Очень Злой
2012-11-03 13:57
2013.06.02
Получить текст под мышкой из чужого окна


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


15-1359232203
Юрий
2013-01-27 00:30
2013.06.02
С днем рождения ! 27 января 2013 воскресенье


15-1358803496
N.Cage
2013-01-22 01:24
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский