Перехват функций Api
Ситуация такая - есть некоторое приложение, которое использует функции своей dll, которая уже обращается к системным функциям.
(Приложение->someshit.dll->user32.dll)
Нужно перехватить вызовы некоторой системной функции, которые происходят в этой someshit.dll.
С перехватом вызовов из самого приложения проблем нет - внедряем в процесс свою dll, которая правит таблицу импорта - все работает замечательно.
А вот если функция вызывается из промежуточной dll, то ничего не получается.
Пробовал искать эту библиотеку в памяти процесса ( GetModuleHandle('someshit.dll')) и править ее таблицу импорта. Все отрабатывает нормально, но эффекта нет - вызовы из этой dll все равно не перехватываются. Что делать?
импорта самой someshit.dll так как она импортирует user32.dll
То есть некая функция в someshit.dll и будет перехватывать
вызовы user32.dll внутри себя.Если надо чтобы эта перехватывающая функция
вызывалась в твоем .exe то сделай её
exported.Кстати,каждый раз когда ты вызываешь функцию некой
DLL(не через LoadLibrary то есть при неявном связывании,вызывается её DllMain( ),также DllMain вызывается при вызове LoadLibrary( )
(явное связывание).Это так на всякий случай.
Кстати а слабо в самой USER32.dll программно!!! найти адрес её exported функций?
Мне это очень нужно так как я хочу делать hook тех функций которые вызывает
сама User32.dll или ntdll.dll.У меня это не получается так как в таких dll
нету секций .idata и .edata а то что должно в них быть находится в секции
.text .Но программно не удается найти эти данные
смотрите тему "Секции СИСТЕМНЫХ Dll"
Цитата:
Originally posted by semskmax
Мне это очень нужно так как я хочу делать hook тех функций которые вызывает
сама User32.dll или ntdll.dll.У меня это не получается так как в таких dll
нету секций .idata и .edata а то что должно в них быть находится в секции
.text .Но программно не удается найти эти данные
Мне это очень нужно так как я хочу делать hook тех функций которые вызывает
сама User32.dll или ntdll.dll.У меня это не получается так как в таких dll
нету секций .idata и .edata а то что должно в них быть находится в секции
.text .Но программно не удается найти эти данные
Используй ImageDirectoryEntryToData.
У меня встречный вопрос. Перехват функций (как вариант: MessageBoxA/W и GetMessageA/W) работает в моем тестовом приложении, вызывающем эти функции, частично работает в Блокноте (перехватывает только MessageBox) и совсем не работает в explorer.exe. Кто-нибудь знает в чем дело?
То у меня есть такая версия.Иногда
некоторые функции нет смысла перехватывать по той простой причине что они не вызываются!
То есть они реализованы как макросы а раз так
то просто вставлены в код по месту.Я сейчас
занимаюсь перехватом функций в драйверах
используя примерно тот же принцип что и в user
address range и вот что например можно увидеть
в файле ndis.h
#define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length)))
или вот так
#define NdisChainBufferAtFront(Packet, Buffer) \
{ \
PNDIS_BUFFER TmpBuffer = (Buffer); \
\
for (;;) \
{ \
if (TmpBuffer->Next == (PNDIS_BUFFER)NULL) \
break; \
TmpBuffer = TmpBuffer->Next; \
} \
if ((Packet)->Private.Head == NULL) \
{ \
(Packet)->Private.Tail = TmpBuffer; \
} \
TmpBuffer->Next = (Packet)->Private.Head; \
(Packet)->Private.Head = (Buffer); \
(Packet)->Private.ValidCounts = FALSE; \
}
и тут же рядом
EXPORT
VOID
NdisUnchainBufferAtFront(
IN OUT PNDIS_PACKET Packet,
OUT PNDIS_BUFFER * Buffer
);