2017-01-22 90 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的序号我的申请,我注入不一样,在原来的DLL睡眠功能的序号?

我希望你明白我的意思。

+0

@user - 你完全错了 - 序号不稳定。我们不能使用序数进行睡眠 - 它在不同的Windows版本中有所不同。 – RbMm

+0

@RbMm哦okey谢谢。如果我们说睡眠是按顺序导入的,通过IAT挂钩该功能,还有其他解决方案吗? –

+0

睡眠永远不会按顺序导入 - 这是不正确的。但我当然知道解决方案 – RbMm

回答

0

当然可能依靠钩功能,但是如果我们知道这个序数。

总的来说序数不稳定。所以例如Sleep在每个Windows版本中都有不同的序号。甚至更多 - 在相同的寡妇版本中,它在kernel32.dll的x86和x64版本中具有不同的序号 - 但在您的应用程序中,Sleep按序号按序号?我100%确定没有。

但是有些序数是稳定的,在一些dll中(如ws2_32.dlloleaut32.dll)。我们如何知道哪些序数是稳定的(可以使用)?让我们想想 - 我们使用链接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)通过序号115导出WSAStartup - 这意味着在所有的Windows(x64)版本中WSAStartup必须必须以相同序号115导出 - 否则与此官方lib链接的应用程序数量很大 - 在运行时未启动或崩溃。所以在未来,一些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

哇谢谢你回答:)那么你是对的,其实我想钩的函数是ws2_32.sendto,但我无法在IAT中找到它的名称,所以我猜它是通过导入序。我会继续阅读你的代码,直到我了解它100%,但感谢哥们:) –

+0

@ User90234 - 'sendto'有序号20 - 在我粘贴的表中查找 – RbMm

+0

刚刚修改我的功能与你的向导,完美的作品,谢谢哥们:)我可以再问你一件事情:如果两个函数实际上有相同的序数会发生什么?像Sendto有序20和另一个DLL的一些其他功能也有序20?那么会发生什么?在同一个dll中的 –