Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2011, 05:15   #1
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию перехват WinAPI

Здравствуйте.

Пишу программу для защиты данных корпоративных программ от шаловливых рук пользователей. Перехватываю функции обращения к реестру с помощью изменение адреса, перехватываемой функции, в таблицах импорта (IAT) используя код Д.Рихтера.
По отдельности в разных библиотеках все работает. Проблема заключается в том, чтобы из одной DLL перехватить более одной функции. Уже который день бьюсь.

Что и куда узнаю примерно так:

Код:
g_DLLModule = hModule;
PROC pfnOrig = GetProcAddress(GetModuleHandle("User32.dll"),"MessageBoxW");
PROC pfnNew  = (PROC)MyFunction;
PFNENUMPROCESSMODULES m_pfnEnumProcessModules;
HMODULE m_hModPSAPI = LoadLibraryA("PSAPI.DLL");
m_pfnEnumProcessModules = (PFNENUMPROCESSMODULES)GetProcAddress(m_hModPSAPI, "EnumProcessModules");
HANDLE hProcess = GetCurrentProcess();
if( m_pfnEnumProcessModules(hProcess, g_hMods, sizeof(g_hMods), &g_cbNeeded))
{
    for (unsigned int i = 0; i < (g_cbNeeded / sizeof(HMODULE)); i++ )
    {
        ReplaceIATEntryInOneMod("User32.dll",pfnOrig, pfnNew, g_hMods[i]);
    }
}
А вот заменить адрес второй функции не получается. Помогите пожалуйста.

P.S. Полный работоспособный пример можно взять тут

Последний раз редактировалось hiho; 03.01.2011 в 05:21.
hiho вне форума Ответить с цитированием
Старый 03.01.2011, 10:58   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
от шаловливых рук пользователей
Почему бы для начала не использовать виндовые средства?
p51x вне форума Ответить с цитированием
Старый 03.01.2011, 20:13   #3
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию

только потому что захотелось повысить уровень своего образования
hiho вне форума Ответить с цитированием
Старый 03.01.2011, 23:42   #4
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Цитата:
Сообщение от hiho Посмотреть сообщение
только потому что захотелось повысить уровень своего образования
ну тада чужие классы юзать не кошерно же посмотрю на днях, если что пишите в личку
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 04.01.2011, 01:31   #5
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию

Вы когда на велосипеде ездить учились, придумывали свой или же пользовались уже готовым классом для того, чтобы понять главный принцип работы руля с педалями?

То, что я взял основу, еще не означает, что я не разобрался и просто скопипастил код.

Проблема, кстати, решена. Ошибка была в том, что во второй и последующий перехват использовался описатель функции для первого перехвата.
hiho вне форума Ответить с цитированием
Старый 04.01.2011, 06:42   #6
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Ну да, когда я писал свои велосипеды подобного рода я честно раскручивал импорты в каждом модуле адресного пространства процесса и это разумеется сразу добавило +10 к ЧСВ и -42 к невнимательности
PS: и ни в коем случае не стоит забывать о том, что если программа, которая полезет в реестр будет звать апишечки минуя таблицу импорта(что очень даже вполне может быть), скажем через тот же GetProcАdrеss и вызов по полученному адресу, то коварные шаловливые ручки пользователей до вас таки доберутся :-D
Нет, ну правда..

Последний раз редактировалось yuran666666; 04.01.2011 в 11:00.
yuran666666 вне форума Ответить с цитированием
Старый 10.01.2011, 05:39   #7
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию

Что-то я застрял на сокрытии папки в Windows 7. Перехватываю функцию NtQueryDirectoryFile. Она пишет имя нужного элемента в 4 структуры, соответственно правлю нужные указатели в каждой из них, чтобы функция наш файл перескакивала.
Вроде бы все так. Да и на XP работает отлично. Либо я что-то не так делаю, либо семерка, после того как я поменял NtQueryDirectoryFile получает список файлов еще каким-то образом.
Наставте на путь истиный =). Что-то не так со мной, или с семеркой...

Пример обхода структуры FileBothDirectoryInformation:
Код:
case FileBothDirectoryInformation :
FileBothDirectoryInfo = NULL;
do
 {
     LastFileBothDirectoryInfo = FileBothDirectoryInfo;
     FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset);
     if ((FileBothDirectoryInfo->FileNameLength > 1) && 
         (RtlCompareMemory((PVOID)&(FileBothDirectoryInfo->FileName[0]),(PVOID)L"Example",sizeof(L"Example") - 2) == sizeof(L"Example") - 2))
     {
            if (!FileBothDirectoryInfo->NextEntryOffset)
            {
                if (LastFileBothDirectoryInfo)LastFileBothDirectoryInfo->NextEntryOffset = 0;
                else status = STATUS_NO_SUCH_FILE;
                return status;
             } else 
             if (LastFileBothDirectoryInfo)LastFileBothDirectoryInfo->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset;
      }
       Offset += FileBothDirectoryInfo->NextEntryOffset;
} while (FileBothDirectoryInfo->NextEntryOffset);
break;
hiho вне форума Ответить с цитированием
Старый 10.01.2011, 05:43   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

помоему семерка уже не на ядре Nt же построена...соотвественно там иначе идет.
поправьте коллеги, если попутал я..
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.01.2011, 06:05   #9
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Пепелу Фениксу: ну да, в результате массовой истерии микрыссофт, а также из уныния и отчаяния (а вы что хотели после висты-то?) вин7 была написана как надстройка над мсдос :-D
hiho: вы перехватываете функцию в процессе эксплорер? Какой способ перехвата? Выложите бинарник, который выполняет данный перехват-посмотрим почему происходит данная несправедливость.
Нет, ну правда..

Последний раз редактировалось yuran666666; 10.01.2011 в 06:10.
yuran666666 вне форума Ответить с цитированием
Старый 10.01.2011, 17:57   #10
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию

Перехватываю все тем же способом, через таблицу импорта, до другого я пока не дорос. Перехватываю в эксплоере, загружая методом удаленных потоков.
Если ставить MessageBox в нашу функцию, то он вызываеться, а значит, что експлоер все-таки эту функцию использует.
Вложения
Тип файла: rar DLL.rar (15.2 Кб, 24 просмотров)
hiho вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Qt vs. WinAPI Зелёный_спец Общие вопросы C/C++ 3 12.03.2010 15:34
WinApi и C++ titan-prog Win Api 1 17.07.2008 21:02
WinApi Andr Безопасность, Шифрование 3 17.06.2007 13:38