Доброе время суток! Есть программа (чужая) и есть dll которая при старте программы подгружается в АП этой программы. Вопрос в том, как можно как получить hWnd всех окон (которые будут создаваться) от этой программы? Думал просплайсить CreateWindowExA/CreateWindowExW потом восстановить код функций и их просто вызвать. Но мне нужны все окна, а в теории можно во время снятие сплайса другой поток создаст окно и я об этом не узнаю. Заранее всем спасибо!
AntiB достаточно перехватить только CreateWindowExW, или чтонить уровнем ниже сплайсинг убирать не обязательно, достаточно скопировать куданить убитые сплайсингом инструкции, и вызывать их также от других потоков спасает критическая секция
qwe8013 Большое спасибо - то что нужно GoldFinch Критические секции в сплайсинге - как только я сниму перехват нету что синхронизировать. Rel Не то что нужно, но спасибо!
Код (Text): bool SpliceBridge(__in DWORD addr,__in DWORD new_addr,__out DWORD& true_addr) { DWORD Protects= NULL; DWORD JA= NULL; BYTE* rbridg= NULL; if(addr && new_addr) { rbridg=(BYTE*)VirtualAlloc(NULL,10,MEM_COMMIT,PAGE_EXECUTE_READWRITE); VirtualProtect((LPVOID)addr, 5, PAGE_EXECUTE_READWRITE, &Protects); ReadProcessMemory(GetCurrentProcess(), (LPVOID)addr, rbridg, 5, 0); rbridg[5]=0xE9; JA=addr-(DWORD)rbridg-5; memcpy(&rbridg[6],&JA,4); true_addr=(DWORD)rbridg; BYTE jmp[5]={0xe9,0x00,0x00,0x00,0x00}; JA=(DWORD)new_addr - addr - 5; memcpy(&jmp[1],&JA,4); if(WriteProcessMemory(GetCurrentProcess(),(LPVOID)addr,jmp, 5, 0)) { VirtualProtect((LPVOID)addr, 5, Protects, &Protects); return true; } } return false; }
punxer А нафига в своем процессе использовать WriteProcessMemory? Да и вообще почему бы не использовать свободный участок в уже имеющейся области памяти с аттр. ERW, а выделять ее? И вообще что-то напоминает мой код 100летней выдержки.
punxer Вы ведь понимаете насколько это плохое решение ? apfn достаточно для решения большинства задач связанных с нотификацией.