2017-01-22 3 views
0

Я возился с некоторыми вставками DLL/функцией. Я могу перехватить функции таблицы адресов импорта по имени, сравнив имя функции в IAT. (Получение IMAGE_THUNK_DATA и считывание значения)Можно подключить функцию IAT по порядку?

Но когда приложение, в которое я ввожу, импортирует функции по порядку, у меня не будет успеха с этим подходом. Например, иногда, когда я проверяю IMAGE_THUNK_DATA * thunkData-> u1.Function, он выглядит как порядковый номер.

Теперь на мой вопрос: есть ли способ получить порядковое число, например, функции сна (https://msdn.microsoft.com/de-de/library/windows/desktop/ms686298(v=vs.85).aspx) и проверить, соответствует ли значение в IAT этому порядковому номеру? Например что-то вроде этого:

if (IMAGE_SNAP_BY_ORDINAL(thunkData->u1.Function)) { 
    //check if u1.Function is my desired ordinal number of sleep 
} 

Или порядковый номер в IAT моего заявления я нагнетание в не то же самое, как порядковый номер функции Sleep в оригинальной DLL?

Надеюсь, вы понимаете, что я имею в виду.

+0

@user - вы совершенно неправы - порядковый нестабильный. мы не можем использовать порядковый номер для Sleep - он отличается в разных версиях Windows. – RbMm

+0

@ RbMm oh okey спасибо. Есть ли другое решение, если, скажем, «Сон» импортируется по порядку, чтобы связать эту функцию через IAT? –

+0

Сон НИКОГДА не импортируется по порядку - это неверно. однако я, конечно, знаю решение – RbMm

ответ

0

конечно возможно функция крючка по порядку, но если мы знаем этот порядковый номер.

в целом ординалы нестабильны. поэтому, например, Sleep имеют разные ординалы в каждой версии Windows. еще больше - в той же версии вдов они имеют разные ординалы в x86 и x64 версиях kernel32.dll - но являются Sleep импортированы по порядку в вашей заявке? i 100% уверен, что нет.

Однако некоторые ординалы стабильны, в некоторых dlls (например, ws2_32.dll или oleaut32.dll). как мы можем знать, какие ординалы устойчивы (можно использовать)? let think - мы используем ссылку someimport.lib для импорта функций от some.dll - и в этом импортном LIB и содержащий информацию о том, как функция импорта - по имени или по порядку. поэтому вам нужно получить информацию от LIB. это можно сделать с помощью команды:

link.exe -dump /EXPORTS "somepath\somelib.lib" > somelib.log

пусть, например, взять ws2_32.lib - я бег

link.exe -dump /EXPORTS "my path\x64\ws2_32.lib" > ws2_32.log

ordinal name 
      [email protected]@[email protected] (int __cdecl WSApSetPostRoutine(void *)) 
      FreeAddrInfoEx 
      FreeAddrInfoExW 
      FreeAddrInfoW 
      GetAddrInfoExA 
      GetAddrInfoExCancel 
      GetAddrInfoExOverlappedResult 
      GetAddrInfoExW 
      GetAddrInfoW 
      GetHostNameW 
      GetNameInfoW 
      InetNtopW 
      InetPtonW 
      SetAddrInfoExA 
      SetAddrInfoExW 
    500 WEP 
      WPUCompleteOverlappedRequest 
      WPUGetProviderPathEx 
      WSAAccept 
      WSAAddressToStringA 
      WSAAddressToStringW 
      WSAAdvertiseProvider 
    102 WSAAsyncGetHostByAddr 
    103 WSAAsyncGetHostByName 
    105 WSAAsyncGetProtoByName 
    104 WSAAsyncGetProtoByNumber 
    107 WSAAsyncGetServByName 
    106 WSAAsyncGetServByPort 
    101 WSAAsyncSelect 
    108 WSACancelAsyncRequest 
    113 WSACancelBlockingCall 
    116 WSACleanup 
      WSACloseEvent 
      WSAConnect 
      WSAConnectByList 
      WSAConnectByNameA 
      WSAConnectByNameW 
      WSACreateEvent 
      WSADuplicateSocketA 
      WSADuplicateSocketW 
      WSAEnumNameSpaceProvidersA 
      WSAEnumNameSpaceProvidersExA 
      WSAEnumNameSpaceProvidersExW 
      WSAEnumNameSpaceProvidersW 
      WSAEnumNetworkEvents 
      WSAEnumProtocolsA 
      WSAEnumProtocolsW 
      WSAEventSelect 
    111 WSAGetLastError 
      WSAGetOverlappedResult 
      WSAGetQOSByName 
      WSAGetServiceClassInfoA 
      WSAGetServiceClassInfoW 
      WSAGetServiceClassNameByClassIdA 
      WSAGetServiceClassNameByClassIdW 
      WSAHtonl 
      WSAHtons 
      WSAInstallServiceClassA 
      WSAInstallServiceClassW 
      WSAIoctl 
    114 WSAIsBlocking 
      WSAJoinLeaf 
      WSALookupServiceBeginA 
      WSALookupServiceBeginW 
      WSALookupServiceEnd 
      WSALookupServiceNextA 
      WSALookupServiceNextW 
      WSANSPIoctl 
      WSANtohl 
      WSANtohs 
      WSAPoll 
      WSAProviderCompleteAsyncCall 
      WSAProviderConfigChange 
      WSARecv 
      WSARecvDisconnect 
      WSARecvFrom 
      WSARemoveServiceClass 
      WSAResetEvent 
      WSASend 
      WSASendDisconnect 
      WSASendMsg 
      WSASendTo 
    109 WSASetBlockingHook 
      WSASetEvent 
    112 WSASetLastError 
      WSASetServiceA 
      WSASetServiceW 
      WSASocketA 
      WSASocketW 
    115 WSAStartup 
      WSAStringToAddressA 
      WSAStringToAddressW 
      WSAUnadvertiseProvider 
    110 WSAUnhookBlockingHook 
      WSAWaitForMultipleEvents 
      WSCDeinstallProvider 
      WSCDeinstallProvider32 
      WSCDeinstallProviderEx 
      WSCEnableNSProvider 
      WSCEnableNSProvider32 
      WSCEnumNameSpaceProviders32 
      WSCEnumNameSpaceProvidersEx32 
      WSCEnumProtocols 
      WSCEnumProtocols32 
      WSCEnumProtocolsEx 
      WSCGetApplicationCategory 
      WSCGetApplicationCategoryEx 
      WSCGetProviderInfo 
      WSCGetProviderInfo32 
      WSCGetProviderPath 
      WSCGetProviderPath32 
      WSCInstallNameSpace 
      WSCInstallNameSpace32 
      WSCInstallNameSpaceEx 
      WSCInstallNameSpaceEx2 
      WSCInstallNameSpaceEx32 
      WSCInstallProvider 
      WSCInstallProvider64_32 
      WSCInstallProviderAndChains64_32 
      WSCInstallProviderEx 
      WSCSetApplicationCategory 
      WSCSetApplicationCategoryEx 
      WSCSetProviderInfo 
      WSCSetProviderInfo32 
      WSCUnInstallNameSpace 
      WSCUnInstallNameSpace32 
      WSCUnInstallNameSpaceEx2 
      WSCUpdateProvider 
      WSCUpdateProvider32 
      WSCUpdateProviderEx 
      WSCWriteNameSpaceOrder 
      WSCWriteNameSpaceOrder32 
      WSCWriteProviderOrder 
      WSCWriteProviderOrder32 
      WSCWriteProviderOrderEx 
      WahCloseApcHelper 
      WahCloseHandleHelper 
      WahCloseNotificationHandleHelper 
      WahCloseSocketHandle 
      WahCloseThread 
      WahCompleteRequest 
      WahCreateHandleContextTable 
      WahCreateNotificationHandle 
      WahCreateSocketHandle 
      WahDestroyHandleContextTable 
      WahDisableNonIFSHandleSupport 
      WahEnableNonIFSHandleSupport 
      WahEnumerateHandleContexts 
      WahInsertHandleContext 
      WahNotifyAllProcesses 
      WahOpenApcHelper 
      WahOpenCurrentThread 
      WahOpenHandleHelper 
      WahOpenNotificationHandleHelper 
      WahQueueUserApc 
      WahReferenceContextByHandle 
      WahRemoveHandleContext 
      WahWaitForNotification 
      WahWriteLSPEvent 
    151 __WSAFDIsSet 
    1 accept 
    2 bind 
    3 closesocket 
    4 connect 
      freeaddrinfo 
      getaddrinfo 
    51 gethostbyaddr 
    52 gethostbyname 
    57 gethostname 
      getnameinfo 
    5 getpeername 
    53 getprotobyname 
    54 getprotobynumber 
    55 getservbyname 
    56 getservbyport 
    6 getsockname 
    7 getsockopt 
    8 htonl 
    9 htons 
    11 inet_addr 
    12 inet_ntoa 
      inet_ntop 
      inet_pton 
    10 ioctlsocket 
    13 listen 
    14 ntohl 
    15 ntohs 
    16 recv 
    17 recvfrom 
    18 select 
    19 send 
    20 sendto 
    21 setsockopt 
    22 shutdown 
    23 socket 

, если мы рассматриваем порядковые не пусто - API будет импортирован порядковым (, если PE построить, связавшись с этим lib), если пусто - будет импортироваться по имени. так скажем, например, WSAStartup будет импортироваться по порядку 115 (0x73), когда WSASocketW будет импортироваться по имени. если библиотека Microsoft (ws2_32.lib) экспортирована WSAStartup по порядку 115 - это означает, что в ВСЕХ окнах (x64) версии WSAStartupдолжен быть экспортирован с одинаковым порядковым номером 115 - в противном случае огромное количество приложений, связанных с этой официальной библиотекой - не запускалось или не разбивалось во время выполнения. так что в будущем какая-то другая версия ws2_32.libможет начать импорт WSAStartup по имени, но все окна ws2_32.dll уже должны всегда экспортировать WSAStartup с порядковым номером 115.

Если вы отметите kernel32.lib, вы можете просмотреть, что столбец ординатов пуст, поэтому ни один грантополучатель не говорит Sleep порядковый номер - и это действительно очень неустойчиво.

так как нужно написать код, например обнаружить WSAStartup импорт?

#define WSAStartup_Ordinal 115 

PVOID hmod; 
PIMAGE_IMPORT_DESCRIPTOR piid; 
ULONG size/* size of IMPORT directory*/, d; 
// assume hmod, piid, size already initialized 

while ((INT)size >= sizeof(IMAGE_IMPORT_DESCRIPTOR) && (d = piid->Name)) 
{ 
    PCSTR name = RtlOffsetToPointer(hmod, d); 

    if (!_stricmp(name, "ws2_32.dll")) 
    { 
     if (d = piid->FirstThunk) 
     { 
      PIMAGE_THUNK_DATA FirstThunk = (PIMAGE_THUNK_DATA)RtlOffsetToPointer(hmod, d); 

      if (d = piid->OriginalFirstThunk) 
      { 
       PIMAGE_THUNK_DATA OriginalFirstThunk = (PIMAGE_THUNK_DATA)RtlOffsetToPointer(hmod, d); 

       while (ULONG_PTR Ordinal = OriginalFirstThunk->u1.Ordinal) 
       { 
        ULONG_PTR Function = 0; 

        if (IMAGE_SNAP_BY_ORDINAL(Ordinal)) 
        { 
         if (IMAGE_ORDINAL(Ordinal) == WSAStartup_Ordinal) // 115 
         { 
          Function = FirstThunk->u1.Function; 
         } 
        } 
        else 
        { 
         if (!strcmp((PCSTR)((PIMAGE_IMPORT_BY_NAME)RtlOffsetToPointer(hmod, Ordinal))->Name, "WSAStartup")) 
         { 
          Function = FirstThunk->u1.Function; 
         } 
        } 

        if (Function) 
        { 
         __nop(); 
        } 
       } 
      } 
     } 
    } 

    size -= sizeof(IMAGE_IMPORT_DESCRIPTOR), piid++; 
} 
+0

Wow спасибо за ответ. Ну, вы правы, на самом деле функция, которую я хочу подключить, это ws2_32.sendto, но я не могу найти ее по имени в IAT, поэтому я предположил, что она импортируется порядковое. Я продолжу читать ваш код, пока не пойму его на 100%, но спасибо приятелю :) –

+0

@ User90234 - 'sendto' имеют порядковый номер 20 - посмотрите в таблицу, которую я вставляю – RbMm

+0

Просто изменил мою функцию с вашим гидом, работает отлично, спасибо приятель :) Могу я еще раз спросить вас: что произойдет, если две функции на самом деле имеют один и тот же порядковый номер? Как sendto имеет порядковый номер 20, а другая функция другой dll имеет также порядковый номер 20? Что будет тогда? –

Смежные вопросы