Как получить и изменить в таблице импорта програмы один адрес на друго

Тема в разделе "MS Visual C++", создана пользователем r00t_, 31 июл 2007.

Статус темы:
Закрыта.
  1. r00t_

    r00t_ Гость

    Привет всем...Народ подскажите... как получить список всех адресов функций (dll'ки или dll'ок) в таблице импорта программы и изменить на другой....если можно с куском кода, а то что-то неправильно делаю ..спасибо за ранее
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    1. Соблюдаем правила!!!!
    2. У тебя ошибка в 17 строке! Тут телепатов нет, покажи код, может ошибка и найдется
     
  3. r00t_

    r00t_ Гость

    Код (Text):
    DWORD adr_MessageBoxA;

    BOOL WINAPI Intercept_MessageBoxA(HWND hwnd, char *text,char *hdr, UINT utype)
    {

    char *str = "Hi From MessageBOX!!!!";
    ((BOOL (__stdcall*)(HWND, char*, char*, UINT))adr_MessageBoxA)(hwnd,str, hdr, utype);
    return TRUE;
    }

    void InterceptFunctions(void)
    {

    BYTE *pimage = (BYTE*)GetModuleHandle(NULL);
    BYTE *pidata;
    IMAGE_DOS_HEADER *idh;
    IMAGE_OPTIONAL_HEADER *ioh;
    IMAGE_SECTION_HEADER *ish;
    IMAGE_IMPORT_DESCRIPTOR *iid;
    DWORD *isd,written=0;

    idh = (IMAGE_DOS_HEADER*)pimage;
    ioh = (IMAGE_OPTIONAL_HEADER*)(pimage + idh->e_lfanew + 4 + sizeof(IMAGE_FILE_HEADER));
    ish = (IMAGE_SECTION_HEADER*)((BYTE*)ioh + sizeof(IMAGE_OPTIONAL_HEADER));

    if (idh->e_magic != 0x5A4D)
    {
    MessageBox(NULL, "Not exe hdr", "Error!", 0);
    return;
    }
    int i;

    for(i=0; i<16; i++)
    if(strcmp((char*)((ish+ i)->Name) , ".idata") == 0) break;
    if( i==16)
    {
    MessageBox(NULL, "Unable to find .idata section", "Error!", 0);
    return;
    }

    iid = (IMAGE_IMPORT_DESCRIPTOR*)(pimage + (ish +i)->VirtualAddress );

    adr_MessageBoxA = (DWORD)GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA");
    if(adr_MessageBoxA == 0)
    {
    MessageBox(NULL, "Can`t get addr_MessageBoxA", "Error!", 0);
    return;
    }

    while(iid->Name)
    {
    if(strcmp((char*)(pimage + iid->Name), "USER32.dll") ==0 ) break;
    iid++;
    }

    isd = (DWORD*)(pimage + iid->FirstThunk);
    while(*isd!=adr_MessageBoxA && *isd!=0) isd++;
    if(*isd == 0)
    {
    MessageBox(NULL, "adr_MessageBoxA not found in .idata", "Error!", 0);
    return;
    }

    DWORD buf = (DWORD)&Intercept_MessageBoxA;
    DWORD op;

    VirtualProtect((void*)(isd),4,PAGE_READWRITE, &op);

    WriteProcessMemory(GetCurrentProcess(), (void*)(isd),(void*)&buf,4,&written);

    VirtualProtect((void*)(isd),4,op, &op);
    if(written!=4)
    {
    MessageBox(NULL, "Unable rewrite address", "Error!", 0);
    return;
    }
    }
    потом вызываю InterceptFunctions(); и как-бы все пучком только вот не находит секцию idata в экслорере и незаменяет соответственно ничего....как сделать универсальный метод нахождения длл а потом и адреса функции(через таблицу импорта)....???
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
  5. r00t_

    r00t_ Гость


    спасибо посмотрю...такой вопрос таб.импорта(в exe файле) в какой секции хранится???
     
  6. r00t_

    r00t_ Гость

    Немогу понять...код (вышеуказанный) работает..при выполнении говорит что idata секция не найдена...посмотрел PE заголовок и правда в iexlorer'e нет такой секции ...пытаюсь пройти по .text или .data вылетает эксепшн с кодом C0000005 типа доступ запрещен на сколько я понял, и так на любую секцию IE...КАК пройтись по секциям без эксепшена(т.е. как получить доступ)...код приведен выше...спасибо за ранее всем кто ответит...
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей