как подключить функцию Windows API внутри IAT запущенного процесса и заменить ее фиктивной функцией? - PullRequest
0 голосов
/ 08 мая 2020

Моя цель - выполнить перехват IAT. Я хочу заменить LoadLibraryA (LLA) своей функцией ModifiedLLA.

Я пробирался через формат PE и смог найти имена функций для каждого импортированного файла DLL.

Считайте, что это будет моя функция замены:

DWORD ModifiedLLA(char* str){
    printf("test\n");
    return 0;
}

Рассмотрим следующий код внутри основной функции:

...

//IAT & ILTs have been assigned previously

//Declare pointer to our own function
DWORD(WINAPI *procPtr)(char*);
procPtr = ModifiedLLA;

while(ilt->u1.AddressOfData){
    namedata = (PIMAGE_IMPORT_BY_NAME)((DWORD_PTR)imagebase +
                 (DWORD)ilt->u1.AddressOfData);

    //We have found the LoadLibraryA function.
    if(strcmp(namedata->Name, "LoadLibraryA") == 0){


        //Here we must replace the original LoadLibraryA with procPtr;


        break;
    }
    ilt++;
    alt++;
}
...

Вопрос в том, «как я могу назначить procPtr на адрес LLA »?

Я читал, что когда IMAGE_ORDINAL_FLAG не установлен, адрес LoadLibraryA становится iat->u1.Function + namedata.

Однако я не уверен, какой тип данных мне следует преобразовать (DWORD_PTR)namedata + (DWORD)iat->u1.Function к. Пробовал закинуть на DWORD_PTR. Когда я пытаюсь назначить адрес procPtr, я получаю ошибки, такие как: недопустимый аргумент типа унарного '*' (имеет 'DWORD_PTR' {aka 'long long unsigned int'})

1 Ответ

1 голос
/ 08 мая 2020

Я нашел ответ. Очевидно, это так же просто, как iat->u1.Function = (ULONGLONG)procPtr

Таким образом, код становится:


//IAT & ILTs have been assigned previously

//Declare pointer to our own function
DWORD(WINAPI *procPtr)(char*);
procPtr = ModifiedLLA;

while(ilt->u1.AddressOfData){
    namedata = (PIMAGE_IMPORT_BY_NAME)((DWORD_PTR)imagebase +
                 (DWORD)ilt->u1.AddressOfData);

    //We have found the LoadLibraryA function.
    if(strcmp(namedata->Name, "LoadLibraryA") == 0){

        iat->u1.Function = (ULONGLONG)procPtr;

        break;
    }
    ilt++;
    alt++;
}
...

Я надеюсь, что это поможет и некоторым другим людям.

...