2010-01-11

Hook api

Небольшой код для перехвата функций методом модификации импорта.

bool HookImport(DWORD Base, DWORD Org, DWORD Hook)
{
    PIMAGE_FILE_HEADER pFileHdr;
    PIMAGE_OPTIONAL_HEADER pOptHdr;
    PIMAGE_IMPORT_DESCRIPTOR pImpDesc;
    bool rv = false;

    pFileHdr = (PIMAGE_FILE_HEADER)(*(PDWORD)(Base+0x3c)+Base+4);
    pOptHdr = (PIMAGE_OPTIONAL_HEADER)((DWORD)pFileHdr+sizeof(IMAGE_FILE_HEADER));
    pImpDesc = (PIMAGE_IMPORT_DESCRIPTOR)(Base +
                pOptHdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);

    for ( int i=0;pImpDesc[i].Characteristics; i++ )
    {
        char * CurrentModuleName = (char*)(pImpDesc[i].Name + Base);
        PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)(pImpDesc[i].FirstThunk + Base);
        for ( int j=0; pThunk[j].u1.Ordinal; j++ )
        {
            if (pThunk[j].u1.Function == Org)
            {
                pThunk[j].u1.Function = Hook;
                rv = true;
                goto Exit;
            }
        }
    }
    Exit:
    return rv;
}

4 комментария:

Анонимный комментирует...

1) не нравиться magic numbers в коде
2) не будет работать в win64 ;)

frosty комментирует...

1) вы про 0x3c? есть какой-то длиный дефайн для него, надо записать.
2) я ниразу ничего не делал под win64 :)

char * CurrentModuleName = (char*)(pImpDesc[i].Name + Base); - не нужна, она просто юзалась для отладочного вывода

p.s. нифига себе, это ещё кто-то читает :)

Анонимный комментирует...

Не надо обольщяться, просто было скучно ;-)

frosty комментирует...

ну я так и подумал =)

Архив