У меня gui прилажение. Задача: В юзермоде не дать внедрить либу в мой процесс через SetWindowsHookEx\WH_GETMESSAGE. Как винда вообще проэцирует либу в мой процесс ? Прочел эту статейку: Но ничего полезного для себя не вынес как противодействовать этому.. Хукать во всех процессах SetWindowsHookEx\NtUserSetWindowsHookEx не предлагать
Flasher В KernelCallbackTable(это в юзермоде табличка, PEB.KernelCallbackTable) указатель на загрузчик подмени, либо LdrLoadDll похукай. (На VT досконально разобран этот механизм). Посмотрел, у меня индекс ClientLoadLibrary() для XPSP2 равен 0x42. А вобще рекомендую для ольки символы скочать, крайне удобно: Код (Text): $ ==> >77D5F534 USER32.___fnCOPYDATA@4 $+4 >77D783AC USER32.___fnCOPYGLOBALDATA@4 $+8 >77D3B390 USER32.___fnDWORD@4 $+C >77D3E613 USER32.___fnNCDESTROY@4 $+10 >77D78365 USER32.___fnDWORDOPTINLPMSG@4 $+14 >77D78566 USER32.___fnINOUTDRAG@4 $+18 >77D50A9A USER32.___fnGETTEXTLENGTHS@4 $+1C >77D7883B USER32.___fnINCNTOUTSTRING@4 $+20 >77D5F6E2 USER32.___fnPOUTLPINT@4 $+24 >77D78708 USER32.___fnINLPCOMPAREITEMSTRUCT@4 $+28 >77D3E7E2 USER32.___fnINLPCREATESTRUCT@4 $+2C >77D78746 USER32.___fnINLPDELETEITEMSTRUCT@4 $+30 >77D6FC0C USER32.___fnINLPDRAWITEMSTRUCT@4 $+34 >77D78784 USER32.___fnINLPHLPSTRUCT@4 $+38 >77D78784 USER32.___fnINLPHLPSTRUCT@4 $+3C >77D785A6 USER32.___fnINLPMDICREATESTRUCT@4 $+40 >77D6F37C USER32.___fnINOUTLPMEASUREITEMSTRUCT@4 $+44 >77D3D2BC USER32.___fnINLPWINDOWPOS@4 $+48 >77D41A95 USER32.___fnINOUTLPPOINT5@4 $+4C >77D3D1B3 USER32.___fnINOUTLPSCROLLINFO@4 $+50 >77D5DC44 USER32.___fnINOUTLPRECT@4 $+54 >77D3D65C USER32.___fnINOUTNCCALCSIZE@4 $+58 >77D3D1B3 USER32.___fnINOUTLPSCROLLINFO@4 $+5C >77D785F8 USER32.___fnINPAINTCLIPBRD@4 $+60 >77D7865F USER32.___fnINSIZECLIPBRD@4 $+64 >77D5FE2D USER32.___fnINDESTROYCLIPBRD@4 $+68 >77D3DCA1 USER32.___fnINSTRINGNULL@4 $+6C >77D3DCA1 USER32.___fnINSTRINGNULL@4 $+70 >77D52D09 USER32.___fnINDEVICECHANGE@4 $+74 >77D788D0 USER32.___fnINOUTNEXTMENU@4 $+78 >77D78FEE USER32.___fnLOGONNOTIFY@4 $+7C >77D782DE USER32.___fnOPTOUTLPDWORDOPTOUTLPDWORD@4 $+80 >77D782DE USER32.___fnOPTOUTLPDWORDOPTOUTLPDWORD@4 $+84 >77D78322 USER32.___fnOUTDWORDINDWORD@4 $+88 >77D786C5 USER32.___fnOUTLPRECT@4 $+8C >77D5F6E2 USER32.___fnPOUTLPINT@4 $+90 >77D78784 USER32.___fnINLPHLPSTRUCT@4 $+94 >77D5F6E2 USER32.___fnPOUTLPINT@4 $+98 >77D78424 USER32.___fnSENTDDEMSG@4 $+9C >77D3DF2B USER32.___fnINOUTSTYLECHANGE@4 $+A0 >77D3EDBD USER32.___fnHkINDWORD@4 $+A4 >77D6F64A USER32.___fnHkINLPCBTACTIVATESTRUCT@4 $+A8 >77D6F58C USER32.___fnHkINLPCBTCREATESTRUCT@4 $+AC >77D789C7 USER32.___fnHkINLPDEBUGHOOKSTRUCT@4 $+B0 >77D5F69D USER32.___fnHkINLPMOUSEHOOKSTRUCTEX@4 $+B4 >77D7894D USER32.___fnHkINLPKBDLLHOOKSTRUCT@4 $+B8 >77D7898A USER32.___fnHkINLPMSLLHOOKSTRUCT@4 $+BC >77D46DB6 USER32.___fnHkINLPMSG@4 $+C0 >77D78910 USER32.___fnHkINLPRECT@4 $+C4 >77D6ED85 USER32.___fnHkOPTINLPEVENTMSG@4 $+C8 >77D78AB2 USER32.___ClientCopyDDEIn1@4 $+CC >77D78AF4 USER32.___ClientCopyDDEIn2@4 $+D0 >77D78B57 USER32.___ClientCopyDDEOut1@4 $+D4 >77D78B26 USER32.___ClientCopyDDEOut2@4 $+D8 >77D423C1 USER32.___ClientCopyImage@4 $+DC >77D78B8B USER32.___ClientEventCallback@4 $+E0 >77D46F1B USER32.___ClientFindMnemChar@4 $+E4 >77D58E3D USER32.___ClientFontSweep@4 $+E8 >77D78A45 USER32.___ClientFreeDDEHandle@4 $+EC >77D5F5CB USER32.___ClientFreeLibrary@4 $+F0 >77D5A3FC USER32.___ClientGetCharsetInfo@4 $+F4 >77D78A7C USER32.___ClientGetDDEFlags@4 $+F8 >77D78BD5 USER32.___ClientGetDDEHookData@4 $+FC >77D6F715 USER32.___ClientGetListboxString@4 $+100 >77D565AA USER32.___ClientGetMessageMPH@4 $+104 >77D5AA6D USER32.___ClientLoadImage@4 $+108 >77D5DC84 USER32.___ClientLoadLibrary@4 $+10C >77D41BE7 USER32.___ClientLoadMenu@4 $+110 >77D59ED3 USER32.___ClientLoadLocalT1Fonts@4 $+114 >77D58521 USER32.___ClientLoadRemoteT1Fonts@4 $+118 >77D78C74 USER32.___ClientPSMTextOut@4 $+11C >77D78CCA USER32.___ClientLpkDrawTextEx@4 $+120 >77D78D2E USER32.___ClientExtTextOutW@4 $+124 >77D78D93 USER32.___ClientGetTextExtentPointW@4 $+128 >77D78C12 USER32.___ClientCharToWchar@4 $+12C >77D56678 USER32.___ClientAddFontResourceW@4 $+130 >77D39F3E USER32.___ClientThreadSetup@4 $+134 >77D78E4C USER32.___ClientDeliverUserApc@4 $+138 >77D78DEA USER32.___ClientNoMemoryPopup@4 $+13C >77D3DA50 USER32.___ClientMonitorEnumProc@4 $+140 >77D79043 USER32.___ClientCallWinEventProc@4 $+144 >77D78A0E USER32.___ClientWaitMessageExMPH@4 $+148 >77D419C0 USER32.___ClientWOWGetProcModule@4 $+14C >77D79086 USER32.___ClientWOWTask16SchedNotify@4 $+150 >77D78E5F USER32.___ClientImmLoadLayout@4 $+154 >77D78EBB USER32.___ClientImmProcessKey@4 $+158 >77D78EFB USER32.___fnIMECONTROL@4 $+15C >77D7848F USER32.___fnINWPARAMDBCSCHAR@4 $+160 >77D50A9A USER32.___fnGETTEXTLENGTHS@4 $+164 >77D787D5 USER32.___fnINLPKDRAWSWITCHWND@4 $+168 >77D5AC79 USER32.___ClientLoadStringW@4 $+16C >77D8541F USER32.___ClientLoadOLE@4 $+170 >77D852FC USER32.___ClientRegisterDragDrop@4 $+174 >77D8533B USER32.___ClientRevokeDragDrop@4 $+178 >77D78FAB USER32.___fnINOUTMENUGETOBJECT@4 $+17C >77D5F136 USER32.___ClientPrinterThunk@4 $+180 >77D790C5 USER32.___fnOUTLPCOMBOBOXINFO@4 $+184 >77D79105 USER32.___fnOUTLPSCROLLBARINFO@4
Clerk, загадками говоришь :P Чекал, значение PEB.KernelCallbackTable что до хука что после - одинаковое.. А LdrLoadDll зачем хукать ? я вить не знаю название dll которое внедрят.. И что вышеперечисленные номера дадут ?
Flasher Ядро для загрузки модуля вызывает ядерный калбак с номером сервиса, а это индекс в таблице указателей, собственно он индексирует процедуру ClientLoadLibrary() которая модуль и загружает. А далее LdrLoadDll() модуль и подгрузит. Один из параметров той функции - имя загружаемого модуля в юникоде. http://www.virustech.org/f/viewtopic.php?id=35 Ну если это не катит, то уж не знаю.. сделой дров который будет чтолибо фильтровать в ви32к.)
Хукать у себя в процессе KiUserCallbackDispatcher, и чекать номер функции, если = номеру ClientLoadLibrary - то не выполняем. Так ? И это сработает ?
Flasher Сработает 100%. Повторяюсь в табличке указатель подмени Нужно разрешить подгружать системные модули, иначе криво твоё приложение работать будет, стили и тп. заглючат. Юзой SfcIsFileProtected() для определения является лм модуль системным http://msdn.microsoft.com/en-us/library/aa382536.aspx , если да, то разрешай загрузку и будет тебе счастье )
Clerk, а как программно определить индекс той или иной процедуры? И еще, можно-ли вместо SfcIsFileProtected юзать твою IsKnownDll ?
Flasher 2. Нет, немногие модули существуют в виде секций. 1. > Сканить секцию кода(сигнатурный поиск), единственный раз во всё модуле user32.dll используется функция LoadLibraryExW. > Создать таблицу версия/номер. Я не могу сделоть такую таблицу ибо у меня модуля user32 от систем отличных от XPSP2 нет, а в ядро лезть счас не охота.
В принципе можно пошагово раздизасмить все входы в таблице, но нужно знать последовательность вызова LoadXX(линейная процедура ?), Flasher если есть от висты|вин7|сп3 модуль user32 скинь мне.