Здравствуйте. Возникла необходимость находить динамически gSharedInfo во всех версиях Windows. Главная проблема в том что в Windows Seven - user32.dll уже имеет gSharedInfo в export'ах. Но это не тот адрес структуры. Под дебагом посмотрел ф-ию UserRegisterWowHandlers и в конце обнаружил адрес который и дает user32.dll в export'ax. И соответственно напрашиваются несколько вопросов: Как можно найти\вычислить gSharedInfo в Windows Seven? Существует ли возможность найти\вычислить адрес стурктуры aheList (список хэндлов всех окон, менюшек и т.д.), без gSharedInfo?
>user32.dll уже имеет gSharedInfo в export'ах. Но это не тот адрес структуры. Точно не тот? Что же это за экспорт тогда такой? Просто мы тоже замечали, что такой символ экспортируется, однако полагали, что он определяет не что иное, как адрес gSharedInfo. А вообще, никакой особой разницы между получением адреса этой структуры на различных OS мы не видим. Другое дело, что сами структуры могут слегка отличаться промежутке w2k..w7. >Существует ли возможность найти\вычислить адрес стурктуры aheList без gSharedInfo? Чисто теоретически? 1) Загрузить user32.dll – чтобы секция win32k!ghSectionShared промапилась на адресное пространство процесса. 2) Массив элементов HANDLEENTRY будет (по идее) располагаться в начале отображения. 3) Просканировать дескрипторы виртуальных адресов в поисках подходящего по параметрам отображения секции (размер, защита, подложка). 4) Проверить, действительно ли это нужное отображение – создать окно или что-нибудь. Учитывать размер HANDLEENTRY при валидации – внимание для дебажных билдов и х64-систем. Больше? Комментарии к статье «Инжект: лезем через окно»: Небольшой модуль, который пользует это: Код (Text): // SharedInfo.h // Huey the Infected, 10/2009 [del] // Sol_Ksacap, 2009/12/24 [del] NAMESPACE_BEGIN(shared_info) // // Address of structure with sysinfo like 'dtCaretBlink' or 'dwLastRITEventTickCount'. // extern struct tagSERVERINFO* ServerInfo; // psi // // Dunno what's this and how one can use it. // extern struct tagDISPLAYINFO* DisplayInfo; // pDispInfo // // Delta between views of 'win32k!ghSectionShared' section. First view is in // session space, r/w, and the second view is for the current process, r/o. // Section contains entries for handles of User Objects. // extern UINT64 HandleEntriesDelta; // ulSharedDelta // // Usermode address of session-wide table with entries for handles of User Objects. // HandleEntriesUser = (PPROCESSINFO(PEPROCESS->Win32Process))->pClientBase // extern struct _HANDLEENTRY* HandleEntriesUser; // aheList // // Kernelmode address of session-wide table with entries for handles of User Objects. // HandleEntriesKernel == win32k!gpvSharedBase // extern struct _HANDLEENTRY* PTR64 HandleEntriesKernel; // <none> NAMESPACE_END(shared_info) ^ в аттаче. Должно работать для всех систем – 2k..w7, x64\x32 (в т.ч. для х32-программ на х64). Сегодня там были подправилены некоторые шероховатости – так что в случае обнаружения косяков желательно отписаться в теме.