хук внутренней функции PE файла

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by qsd, 9 Jan 2010.

  1. qsd

    qsd New Member

    Joined:
    4 Jan 2010
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Подскажите пожалуйста как можно хукнуть неимпортируемую ни из каких длл функцию, коей к примеру является LoadURI() в firefox?
     
  2. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    точно так же, предварительно узнав её виртуальный адрес
     
  3. qsd

    qsd New Member

    Joined:
    4 Jan 2010
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    дак в том то и проблема - как узнать адрес?)
     
  4. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    GetProcAddress

    это чтоль?
     
  5. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    не. дизасмить тока. и искать по косвенным признакам(строковым литералам, вызываемым функциям). можно сбилдить версией компилера как у авторов тока с пдб файлов или мап файлом и так найти. тут ограничение тока в фантазии.
     
  6. qsd

    qsd New Member

    Joined:
    4 Jan 2010
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    а насколько все эти фантастические методы надежны?) мне бы хукнуть loadURI у фф, а версий у него ой как много(
     
  7. flacs

    flacs Member

    Joined:
    28 Jan 2009
    Messages:
    81
    Likes Received:
    31
    Reputations:
    6
    думаю наилучшим решением станет поиск сигнатур начала функции, наподобие того алгоритма что изпользуется в PEID, для определения сигнатуры компилятора

    к примеру, сигнатура
    push ebp/mov ebp esp
    Юзается для подготовки стека, в Delphi компиляторах, в С++ немного другой метод изпользуется там стек по другому иcпользуется (add/sub esp, n)
     
  8. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Я думаю и в дебагере можно увидеть... у тебя же есть вроде описание функции (ну всмысле, что она делает) если например реагирует на ввод ставишь бряк на GetWindowText и ей подобных... думаю должно словится... хотя... в общем муторно
     
    _________________________
  9. flacs

    flacs Member

    Joined:
    28 Jan 2009
    Messages:
    81
    Likes Received:
    31
    Reputations:
    6
    Все это долго и муторно (
    Предлагаю вариант попроще
    Не надо брякать эту функцию LoadURI
    В формировании строк почти всегда изпользуется функция wssprintA

    есть вариант ставить бряк на wssprintA и ловить строки содежащие подстроки
    [http://, ftp://, javastript://, https://], и подменять их своими значенями
     
  10. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,297
    Reputations:
    327
    по паттерну например так

    Code:
    BOOL utilsCompareData(const BYTE* pData, const BYTE* bMask, const char* pszMask)
    {
    	for(;*pszMask; ++pszMask, ++pData, ++bMask)
    		if(*pszMask == 'x' && *pData !=* bMask ) 
    			return FALSE;
    	return (*pszMask) == 0;
    }
    
    //////////////////////////////////////////////////////////////////////////
    DWORD utilsFindPattern(DWORD dwAddress, DWORD dwLen, BYTE *bMask, char * pszMask)
    {
    	for(DWORD i=0; i < dwLen; i++)
    		if(utilsCompareData((BYTE*)( dwAddress+i ), bMask, pszMask ))
    			return (DWORD)(dwAddress + i);
    
    	return 0;
    }
    dwDecode = utilsFindPattern( (DWORD)(pDosHdr)+pSecHdr->VirtualAddress, pSecHdr->SizeOfRawData,
    (BYTE*)"\x51\x53\x55\x8B\x6C\x24\x10\x56\x8B\x74\x24\x20\x57","xxxxxxxxxxxxx");