Хм...а проблема вот в чем...Там юзается LDasm.c(h), при компиляции VC++ ругается что unexpected end of file в LDasm.c, также там юзается ntddk.h хотя я глянув код не нашел ничего того что берется из этого хидера. Это раз, отказавшись от LDasm.c(h) и advApiHook.c(h) я поместил весь код находящийся в этих файлах в свой основной проект файл plugin.cpp (Это к слову сказать dll-ка) все скомпилилось без проблем, но при внедрении этой dll в таргет - процесс, тот при вызове перехватываемой АПИ накрылся (
Мне способ патчинга IAT не очень то и подходит, т.к. интересующие меня функ-и вызываются через LoadLibrary/GetProcAddress, при чем не самим интересующим меня процессом а одной из dll-к который этот процес подключает. Способ Мс-Рем'а это как раз то что нужно, но блин в VС++ не компилячится зараза
Ок что бы не поднимать новую тему скажите такую вещь В общем хочу получить указатель на PIMAGE_NT_HEADERS Делаю так: Код (Text): #include "stdafx.h" #include "imagehlp.h" #include "TLHELP32.H" void ReplaceIAT(PCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller) { ULONG ulSize; PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hmodCaller; if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) return; PIMAGE_NT_HEADERS pNTHeaders = (PIMAGE_NT_HEADERS)(void *)(hmodCaller + pDosHeader->e_lfanew); if (pNTHeaders->Signature != IMAGE_NT_SIGNATURE) return; MessageBox(0,"TEST","TEST",0); !!!!!!!!!!!!! ВОТ ТУТ ПРЕД. IF СРАБАТЫВАЕТ И ПРОИСХОДИТ ВЫХОД ИЗ ПРОЦЕДУРЫ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(hmodCaller, TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize); if (pImportDesc == NULL) return; for (; pImportDesc->Name; pImportDesc++) { PSTR pszModName = (PSTR) ((PBYTE) hmodCaller + pImportDesc->Name); if (lstrcmpiA(pszModName, pszCalleeModName) == 0) break; } if (pImportDesc->Name == 0) return; 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) { DWORD dwOrgProtect, wr; VirtualProtect( ppfn, sizeof(pfnNew), PAGE_READWRITE, &dwOrgProtect ); WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, sizeof(pfnNew), &wr ); VirtualProtect( ppfn, sizeof(pfnNew), dwOrgProtect , &dwOrgProtect ); return; } } } void ReplaceIATEntryInAllMods(PCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew) { HANDLE m_Snap = INVALID_HANDLE_VALUE; MODULEENTRY32 me = { sizeof(me) }; m_Snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,GetCurrentProcessId()); if (m_Snap == INVALID_HANDLE_VALUE) return; if (!Module32First(m_Snap, &me)) return; do { ReplaceIAT(pszCalleeModName, pfnCurrent, pfnNew, me.hModule); } while (Module32Next(m_Snap, &me)); return; } HMODULE WINAPI xLoadLibraryA(PCSTR a) { HMODULE ret = LoadLibraryA(a); MessageBox(0,a,"xLoadLibraryA",0); return ret; } BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { if(ul_reason_for_call == DLL_PROCESS_ATTACH) { ReplaceIATEntryInAllMods("kernel32.dll", GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA"), (PROC)xLoadLibraryA); } return TRUE; } По ходу получается что я неправильно получаю этот PIMAGE_NT_HEADERS pNTHeaders = (PIMAGE_NT_HEADERS)(void *)(hmodCaller + pDosHeader->e_lfanew); Пробовал по разному
supersonic777 Даже код скопировать не могут нормально.. Код (Text): void CDirector::ReplaceIATEntryInOneMod(PCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller, PCSTR pszFuncName) { if ( (!IsModuleNeeded()) || (bModulePathOnly && (!IsModuleNeeded(hmodCaller) && (!IsModuleNeeded(hmodCaller, "OLEAUT32.dll")))) ) return; // ULONG ulSize; PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(hmodCaller, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize); if (pImportDesc == NULL) return; // for (; pImportDesc->Name; pImportDesc++) { PSTR pszModName = (PSTR)((PBYTE) hmodCaller + pImportDesc->Name); if (lstrcmpiA(pszModName, pszCalleeModName) == 0) { if (pImportDesc->Name == 0) return; 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 && (*ppfn > sm_pvMaxAppAddr)) { PBYTE pbInFunc = (PBYTE) *ppfn; if (pbInFunc[0] == cPushOpCode) { ppfn = (PROC*) &pbInFunc[1]; fFound = (*ppfn == pfnCurrent); } } if (fFound) { DWORD dwDummy; VirtualProtect(ppfn, sizeof(ppfn), PAGE_EXECUTE_READWRITE, &dwDummy); WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, sizeof(pfnNew), NULL); VirtualProtect(ppfn, sizeof(ppfn), dwDummy , &dwDummy); return; } } } } }
мда, там какая-то очень древняя версия моего userland-стелса вообще жесть... да ее еще кто-то и модифицировал... вот уж не знал что этим можно пользоваться supersonic777: юзай просто детоурс, вполне нормальная библиотечка
николай gorl: юзается там между прочим не твоя реализация стелс =)) ты ее кинул в массы просто запостив статью в хакере. но написана она не тобой... (большинство кода ты брал из статей во фраке, типа руткита ntillusion и иже подобных + код Рихтера). копи+пастил одним словом. а вообще руткит там засунут чисто для демонстрации библиотеки win32toolkit, большую часть которой продокументировал sh0k из w00w00.
Господа вот такой вот еще квещенс -- В интересующем меня app интересующие меня API юзаются через LoadLibrary/GetProcAddress, при чем те API что я хочу перехватить вызываются не из самого кода моего таргет-APP, а одной из DLL которая в свою очередь импорттирует другую, то есть картина такая: TargetProcess -> DLL1 -> DLL2 -> (LoadLibrary/GetProcAddress)TargetApi Делаю я так: внедряю свою DLL в TargetProcess, она патчит IAT моего TargetProcess'а, на предмет вызовов (LoadLibrary/GetProcAddress), потом переберает все загруженые модули в TargetProcess и соответсвенно патчит IAT каждого найденного модуля, затем при срабатывании хука на LoadLibrary я снова перебераю все модули и снова ставлю перехваты в IAT на (LoadLibrary/GetProcAddress), ну а в самом HOOK_GetProcAddress я делаю сравнение того адреса что вернул TRUE_GetProcAddress с адресами интересующих меня API(их я получаю еще до установки всех хуков в IAT) и обнаружилась такая загадочная вещь как: На компе дома все работает ОК, все адреса внутри HOOK_GetProcAddress удачно сравниваются и заменяются моими хуками, а на компе на работе 3 функ. просто не находятся внутри HOOK_GetProcAddress , 2 есть, а 3х других нет. Код (Text): FARPROC __stdcall HOOK_GetProcAddress(HMODULE hModule,LPCSTR lpProcName) { FARPROC ret = TRUE_GetProcAddress(hModule, lpProcName); if (MY_ADDR1 == TRUE_GetProcAddress(hMod, "MY_API1_NAME")) { MessageBox(0,"ADDR1","INTERCEPTED"); return (FARPROC)HOOK_ADDR1; } if (MY_ADDR2 == TRUE_GetProcAddress(hMod, "MY_API2_NAME")) { MessageBox(0,"ADDR2","INTERCEPTED"); return (FARPROC)HOOK_ADDR2; } ..................................................И ТАК ДАЛЕЕ ЕЩЕ 3 API return ret; }
Адиль, не надо грязи. Собрал программу. Вышел стелс. А его у меня отняли. Сказали не я автор. Вот фигня (. Вот и делись с народом кодом. Хорошо, что у меня еще осталось. Много. На 10% всей сети хватит) А если серьезно - не лезь. Разбирай на кусочки свой код, и его пость, разъясняя что, как, почему и откуда, а в чужой огород не суйся. Мне как-то не очень приятно, когда мои программы так или иначе обижают. Это воспринимается как акт агрессии в моем направлении. А любая агрессия - это тупость. Не тупим. Код не копаем, к несоответствию венгерской нотации на десятитысячной строке руткита не придираемся. supersonic777: советую использовать тебе только сплайсинг. Берешь детоурс в аттаче (в этой версии все лишнее урезано, чтобы файл не разрастался). Потом юзаешь функцию DetourFunction в целевом процессе. Перехватываешь сразу ту функцию которую надо без промежуточных LoadLibrary/GetProcAddress. Если не уверен, что в момент выполнения твоего кода библиотека будет загружена (чтобы вставить там джампы), можешь сначала ее сам загрузить LoadLibrary(DLL3). Перехват через импорт очень ненадежен. Достаточно попортить хидеры сразу после загрузки файла чтобы он обломался. Да просто обнулить OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress и все.