понедельник, 1 ноября 2010 г.

vista ws2_32.dll self-checking

Нашел тут под вистой sp2 32bit дико угарный кусок кода в ws2_32.dll - в ф-ции CheckForHookersOrChainers (вызываемой из WSAStartup):

                mov     eax, offset off_4B0F5510 ; указатель на таблицу имен
exported functions
                xor     esi, esi
loc_4B0DC7A2:
                push    dword ptr [eax] ; lpProcName
                push    ?gDllHandle@@3PAUHINSTANCE__@@A ; hModule
                call    ds:__imp__GetProcAddress@8 

                test    eax, eax
                jz      loc_4B0DA7A1
                cmp     eax, ?apfns@@3PAPAXA[esi] ; указатель на таблицу адресов exported functions
                jnz     loc_4B0DA7A1
                inc     edi
                mov     esi, edi
                shl     esi, 2
                lea     eax, off_4B0F5510[esi]
                cmp     dword ptr [eax], 0
                jnz     short loc_4B0DC7A2

Собственно все понятно - проверка на угон IAT, если имя или адрес, полученный через GetProcAddress не совпали - возвращаем -1 и WSAStartup в свою очередь вернет 10091 (WSASYSNOTREADY)
Угар в том что если пропатчить IAT после вызова WSAStartup - ничего больше не проверится
Ну и традиционно этот массив ?apfns@@3PAPAXA (бгг) не экспортируется, так что юзер лишен воможности запустить проверку IAT в любое другое время

Комментариев нет:

Отправить комментарий