Как защитится от метода внедрения dll через SetWindowsHookEx?

Тема в разделе "WASM.WIN32", создана пользователем Flasher, 30 дек 2008.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    У меня gui прилажение.
    Задача:
    В юзермоде не дать внедрить либу в мой процесс через SetWindowsHookEx\WH_GETMESSAGE.
    Как винда вообще проэцирует либу в мой процесс ?

    Прочел эту статейку:
    Но ничего полезного для себя не вынес как противодействовать этому..
    Хукать во всех процессах SetWindowsHookEx\NtUserSetWindowsHookEx не предлагать ;)
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    В KernelCallbackTable(это в юзермоде табличка, PEB.KernelCallbackTable) указатель на загрузчик подмени, либо LdrLoadDll похукай. (На VT досконально разобран этот механизм).
    Посмотрел, у меня индекс ClientLoadLibrary() для XPSP2 равен 0x42.
    А вобще рекомендую для ольки символы скочать, крайне удобно:
    Код (Text):
    1. $ ==>    >77D5F534  USER32.___fnCOPYDATA@4
    2. $+4      >77D783AC  USER32.___fnCOPYGLOBALDATA@4
    3. $+8      >77D3B390  USER32.___fnDWORD@4
    4. $+C      >77D3E613  USER32.___fnNCDESTROY@4
    5. $+10     >77D78365  USER32.___fnDWORDOPTINLPMSG@4
    6. $+14     >77D78566  USER32.___fnINOUTDRAG@4
    7. $+18     >77D50A9A  USER32.___fnGETTEXTLENGTHS@4
    8. $+1C     >77D7883B  USER32.___fnINCNTOUTSTRING@4
    9. $+20     >77D5F6E2  USER32.___fnPOUTLPINT@4
    10. $+24     >77D78708  USER32.___fnINLPCOMPAREITEMSTRUCT@4
    11. $+28     >77D3E7E2  USER32.___fnINLPCREATESTRUCT@4
    12. $+2C     >77D78746  USER32.___fnINLPDELETEITEMSTRUCT@4
    13. $+30     >77D6FC0C  USER32.___fnINLPDRAWITEMSTRUCT@4
    14. $+34     >77D78784  USER32.___fnINLPHLPSTRUCT@4
    15. $+38     >77D78784  USER32.___fnINLPHLPSTRUCT@4
    16. $+3C     >77D785A6  USER32.___fnINLPMDICREATESTRUCT@4
    17. $+40     >77D6F37C  USER32.___fnINOUTLPMEASUREITEMSTRUCT@4
    18. $+44     >77D3D2BC  USER32.___fnINLPWINDOWPOS@4
    19. $+48     >77D41A95  USER32.___fnINOUTLPPOINT5@4
    20. $+4C     >77D3D1B3  USER32.___fnINOUTLPSCROLLINFO@4
    21. $+50     >77D5DC44  USER32.___fnINOUTLPRECT@4
    22. $+54     >77D3D65C  USER32.___fnINOUTNCCALCSIZE@4
    23. $+58     >77D3D1B3  USER32.___fnINOUTLPSCROLLINFO@4
    24. $+5C     >77D785F8  USER32.___fnINPAINTCLIPBRD@4
    25. $+60     >77D7865F  USER32.___fnINSIZECLIPBRD@4
    26. $+64     >77D5FE2D  USER32.___fnINDESTROYCLIPBRD@4
    27. $+68     >77D3DCA1  USER32.___fnINSTRINGNULL@4
    28. $+6C     >77D3DCA1  USER32.___fnINSTRINGNULL@4
    29. $+70     >77D52D09  USER32.___fnINDEVICECHANGE@4
    30. $+74     >77D788D0  USER32.___fnINOUTNEXTMENU@4
    31. $+78     >77D78FEE  USER32.___fnLOGONNOTIFY@4
    32. $+7C     >77D782DE  USER32.___fnOPTOUTLPDWORDOPTOUTLPDWORD@4
    33. $+80     >77D782DE  USER32.___fnOPTOUTLPDWORDOPTOUTLPDWORD@4
    34. $+84     >77D78322  USER32.___fnOUTDWORDINDWORD@4
    35. $+88     >77D786C5  USER32.___fnOUTLPRECT@4
    36. $+8C     >77D5F6E2  USER32.___fnPOUTLPINT@4
    37. $+90     >77D78784  USER32.___fnINLPHLPSTRUCT@4
    38. $+94     >77D5F6E2  USER32.___fnPOUTLPINT@4
    39. $+98     >77D78424  USER32.___fnSENTDDEMSG@4
    40. $+9C     >77D3DF2B  USER32.___fnINOUTSTYLECHANGE@4
    41. $+A0     >77D3EDBD  USER32.___fnHkINDWORD@4
    42. $+A4     >77D6F64A  USER32.___fnHkINLPCBTACTIVATESTRUCT@4
    43. $+A8     >77D6F58C  USER32.___fnHkINLPCBTCREATESTRUCT@4
    44. $+AC     >77D789C7  USER32.___fnHkINLPDEBUGHOOKSTRUCT@4
    45. $+B0     >77D5F69D  USER32.___fnHkINLPMOUSEHOOKSTRUCTEX@4
    46. $+B4     >77D7894D  USER32.___fnHkINLPKBDLLHOOKSTRUCT@4
    47. $+B8     >77D7898A  USER32.___fnHkINLPMSLLHOOKSTRUCT@4
    48. $+BC     >77D46DB6  USER32.___fnHkINLPMSG@4
    49. $+C0     >77D78910  USER32.___fnHkINLPRECT@4
    50. $+C4     >77D6ED85  USER32.___fnHkOPTINLPEVENTMSG@4
    51. $+C8     >77D78AB2  USER32.___ClientCopyDDEIn1@4
    52. $+CC     >77D78AF4  USER32.___ClientCopyDDEIn2@4
    53. $+D0     >77D78B57  USER32.___ClientCopyDDEOut1@4
    54. $+D4     >77D78B26  USER32.___ClientCopyDDEOut2@4
    55. $+D8     >77D423C1  USER32.___ClientCopyImage@4
    56. $+DC     >77D78B8B  USER32.___ClientEventCallback@4
    57. $+E0     >77D46F1B  USER32.___ClientFindMnemChar@4
    58. $+E4     >77D58E3D  USER32.___ClientFontSweep@4
    59. $+E8     >77D78A45  USER32.___ClientFreeDDEHandle@4
    60. $+EC     >77D5F5CB  USER32.___ClientFreeLibrary@4
    61. $+F0     >77D5A3FC  USER32.___ClientGetCharsetInfo@4
    62. $+F4     >77D78A7C  USER32.___ClientGetDDEFlags@4
    63. $+F8     >77D78BD5  USER32.___ClientGetDDEHookData@4
    64. $+FC     >77D6F715  USER32.___ClientGetListboxString@4
    65. $+100    >77D565AA  USER32.___ClientGetMessageMPH@4
    66. $+104    >77D5AA6D  USER32.___ClientLoadImage@4
    67. $+108    >77D5DC84  USER32.___ClientLoadLibrary@4
    68. $+10C    >77D41BE7  USER32.___ClientLoadMenu@4
    69. $+110    >77D59ED3  USER32.___ClientLoadLocalT1Fonts@4
    70. $+114    >77D58521  USER32.___ClientLoadRemoteT1Fonts@4
    71. $+118    >77D78C74  USER32.___ClientPSMTextOut@4
    72. $+11C    >77D78CCA  USER32.___ClientLpkDrawTextEx@4
    73. $+120    >77D78D2E  USER32.___ClientExtTextOutW@4
    74. $+124    >77D78D93  USER32.___ClientGetTextExtentPointW@4
    75. $+128    >77D78C12  USER32.___ClientCharToWchar@4
    76. $+12C    >77D56678  USER32.___ClientAddFontResourceW@4
    77. $+130    >77D39F3E  USER32.___ClientThreadSetup@4
    78. $+134    >77D78E4C  USER32.___ClientDeliverUserApc@4
    79. $+138    >77D78DEA  USER32.___ClientNoMemoryPopup@4
    80. $+13C    >77D3DA50  USER32.___ClientMonitorEnumProc@4
    81. $+140    >77D79043  USER32.___ClientCallWinEventProc@4
    82. $+144    >77D78A0E  USER32.___ClientWaitMessageExMPH@4
    83. $+148    >77D419C0  USER32.___ClientWOWGetProcModule@4
    84. $+14C    >77D79086  USER32.___ClientWOWTask16SchedNotify@4
    85. $+150    >77D78E5F  USER32.___ClientImmLoadLayout@4
    86. $+154    >77D78EBB  USER32.___ClientImmProcessKey@4
    87. $+158    >77D78EFB  USER32.___fnIMECONTROL@4
    88. $+15C    >77D7848F  USER32.___fnINWPARAMDBCSCHAR@4
    89. $+160    >77D50A9A  USER32.___fnGETTEXTLENGTHS@4
    90. $+164    >77D787D5  USER32.___fnINLPKDRAWSWITCHWND@4
    91. $+168    >77D5AC79  USER32.___ClientLoadStringW@4
    92. $+16C    >77D8541F  USER32.___ClientLoadOLE@4
    93. $+170    >77D852FC  USER32.___ClientRegisterDragDrop@4
    94. $+174    >77D8533B  USER32.___ClientRevokeDragDrop@4
    95. $+178    >77D78FAB  USER32.___fnINOUTMENUGETOBJECT@4
    96. $+17C    >77D5F136  USER32.___ClientPrinterThunk@4
    97. $+180    >77D790C5  USER32.___fnOUTLPCOMBOBOXINFO@4
    98. $+184    >77D79105  USER32.___fnOUTLPSCROLLBARINFO@4
     
  3. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Clerk, загадками говоришь :P
    Чекал, значение PEB.KernelCallbackTable что до хука что после - одинаковое..
    А LdrLoadDll зачем хукать ? я вить не знаю название dll которое внедрят..
    И что вышеперечисленные номера дадут ? :)
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Ядро для загрузки модуля вызывает ядерный калбак с номером сервиса, а это индекс в таблице указателей, собственно он индексирует процедуру ClientLoadLibrary() которая модуль и загружает. А далее LdrLoadDll() модуль и подгрузит. Один из параметров той функции - имя загружаемого модуля в юникоде.
    http://www.virustech.org/f/viewtopic.php?id=35
    Ну если это не катит, то уж не знаю.. сделой дров который будет чтолибо фильтровать в ви32к.)
     
  5. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Хукать у себя в процессе KiUserCallbackDispatcher, и чекать номер функции, если = номеру ClientLoadLibrary - то не выполняем. Так ? И это сработает ? :)
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Сработает 100%. Повторяюсь в табличке указатель подмени :)
    Нужно разрешить подгружать системные модули, иначе криво твоё приложение работать будет, стили и тп. заглючат.
    Юзой SfcIsFileProtected() для определения является лм модуль системным http://msdn.microsoft.com/en-us/library/aa382536.aspx , если да, то разрешай загрузку и будет тебе счастье :))
     
  7. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Clerk, а как программно определить индекс той или иной процедуры?
    И еще, можно-ли вместо SfcIsFileProtected юзать твою IsKnownDll ?
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    2. Нет, немногие модули существуют в виде секций.
    1.
    > Сканить секцию кода(сигнатурный поиск), единственный раз во всё модуле user32.dll используется функция LoadLibraryExW.
    > Создать таблицу версия/номер. Я не могу сделоть такую таблицу ибо у меня модуля user32 от систем отличных от XPSP2 нет, а в ядро лезть счас не охота.
     
  9. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    В принципе можно пошагово раздизасмить все входы в таблице, но нужно знать последовательность вызова LoadXX(линейная процедура ?), Flasher если есть от висты|вин7|сп3 модуль user32 скинь мне.
     
  11. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Тоже 66 и в висте 66. От 6.1 не знаю где взять, ищи сам вобщем.)