Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых)

 eXeL@B —› Программирование —› Внедрение DLL и перехват API-функций
Посл.ответ Сообщение

Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 06 декабря 2006 21:28
· Личное сообщение · #1

Учусь перехватывать API-функцию CreateFile(). Для этого в процесс внедряю библиотеку DLL, которая подгружает подгружает библиотеку DLL с заменяющими функциями и правит таблицу импорта. Нужна помощь: при работе приложения получаю необрабатываемое исключение. В чем проблема сама разобратся не могу.

Часть кода Carrier.dll

//-------------------------------------------------------------------- -------
void ReplaceIATEntryInOneMod(PCSTR pszCalleeModName,
PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller){
// Получаем адресс раздела импорта модуля
ULONG ulSize;
PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)
ImageDirectoryEntryToData(hmodCaller, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT,
&ulSize);
if (pImportDesc == NULL) return; // в этом модуле нет раздела импорта
// находим дискриптор раздела импорта со ссылками
// на функции DLL (вызываемого модуля)
for (;pImportDesc->Name; pImportDesc++) {
PSTR pszModName = (PSTR)((PBYTE) hmodCaller + pImportDesc->Name);
if (lstrcmpiA(pszModName, pszCalleeModName) ==0)
break; // найден
}
if (pImportDesc->Name ==0)
return; // этот модуль не импортирует никаких функций из данной DLL
// получаем таблицу адрессов импорта (IAT) для функций DLL
PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)
((PBYTE) hmodCaller + pImportDesc->FirstThunk);
// заменяем адреса исходных функций адресами своих функций
for (; pThunk->u1.Function; pThunk++){
// получаем адрес адреса функции
PROC* ppfn = (PROC*) &pThunk->u1.Function;
// та ли это функция которая нас интересует?
BOOL fFound = (*ppfn == pfnCurrent);
if (fFound){
// адреса сходятся; изменяем адресс в разделе импорта
WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew,
sizeof(pfnNew), NULL);
return; // получилосы; выходим
}
}
// если мы попали сюда, значит в разделе импорта
// нет ссылки на нужную функцию
};
//-------------------------------------------------------------------- -------
void MyInit(){
// Загрузка собственной библиотеки
HANDLE LabraryHandle = LoadLibrary("c:\HookFunction.dll");
PROC pfnOrig = GetProcAddress(GetModuleHandle("Kernel32"), "CreateFileA");
PROC pfnRepl = GetProcAddress(LabraryHandle, "HookCreateFile");
HMODULE hmodCaller = GetModuleHandle(NULL);
ReplaceIATEntryInOneMod(
"Kernel32.dll", // модуль, содержащий ANSI-функцию
pfnOrig, // адрес исходной функции в вызываемой DLL
pfnRepl, // адрес заменяющей функции
hmodCaller); // описатель модуля, из которого надо вызвать
// новую функцию
pfnOrig = GetProcAddress(GetModuleHandle("Kernel32"), "CreateFileW");
ReplaceIATEntryInOneMod(
"Kernel32.dll", // модуль, содержащий ANSI-функцию
pfnOrig, // адрес исходной функции в вызываемой DLL
pfnRepl, // адрес заменяющей функции
hmodCaller); // описатель модуля, из которого надо вызвать
// новую функцию
};
//-------------------------------------------------------------------- -------
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
switch(fwdreason)
{
case DLL_PROCESS_ATTACH:
MyInit();
break;
default: break;
}
return true;
}
//---------------------------------------------------------------------------

Часть кода HookFunction.dll

extern "C" __declspec(dllexport) HANDLE HookCreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTempleFile)
{
HANDLE hFile = CreateFile(
"c:FileFunction.log",
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
NULL);
LPDWORD NumberWritten;
BOOL bWrite = WriteFile(
"c:FileFunction.log",
&lpFileName,
lstrlen(lpFileName),
NumberWritten,
NULL);
CloseHandle(hFile);
return CreateFile(
lpFileName,
dwDesiredAccess,
FILE_SHARE_READ,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
hTempleFile);
};

Объясните плз что не так



Ранг: 115.1 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 07 декабря 2006 02:46
· Личное сообщение · #2

WriteProcessMemory вернет 0, а ты этого даже не проверяешь.
Используй отладчик ;)



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 07 декабря 2006 10:42
· Личное сообщение · #3

Почитай статьи MS-Rem "Перехват АPI функций в WindowsNT" на wasm.ru
там очень доходчиво и с примерами открыта эта тема.



Ранг: 52.6 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 09 декабря 2006 04:23
· Личное сообщение · #4

LadyDee пишет:
внедряю библиотеку DLL, которая подгружает подгружает библиотеку DLL с заменяющими функциями и правит таблицу импорта


лучше саму ф-ю перехватить а не править таблицу импорта, так как прога может выйти на ф-ю через GetProcAddress



Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 09 декабря 2006 13:23
· Личное сообщение · #5

Файлик у китайцев - если не лень в исходниках порыться
www.pudn.com/downloads/HookAPI1.62.rar




Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 09 декабря 2006 14:19
· Личное сообщение · #6

http://softsearch.ru/programs/94-785-hook-development-kit-download.sht ml http://softsearch.ru/programs/94-785-hook-development-kit-download.shtml
Hook Development Kit
---
Набор весьма интересных исходников для написания шпионов. Есть так же на дисках crackl@b. Весьма полезно будет. Сам пользовался этой информацией.

-----
Уважайте других и пишите грамотно.




Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 09 декабря 2006 15:25
· Личное сообщение · #7

Бог знает куда посылаешь
clifftown.narod.ru/HDK/HDK.htm


 eXeL@B —› Программирование —› Внедрение DLL и перехват API-функций
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати