@sddvxd

Почему не меняется адрес функции в разделе импорта?

Добрый день!

Написал код для смены импортируемого адреса CreateProcessW на свой. Если я пытаюсь поменять адрес импортируемой функции в своем процессе (CLIENT.exe), то все проходит удачно:

BOOL g(){
   QMessageBox::information(0, 0, "ok");
   return false;
}

int main(int argc, char* argv[]){
    Process explorer(L"CLIENT.exe"); //Инициализация this->hModule, this->pID, this->hProcess
    if(!explorer.isOpen()) return -1;
    HID hId = explorer.replaceProcAddress("KERNEL32.dll", GetProcAddress(GetModuleHandleA("Kernel32"), "CreateProcessW"), (PROC)g);
    CreateProcessW(0,0,0,0,0,0,0,0,0,0); //Вызвалась функция g()
    return 0;


Это работает, адрес функции изменен
Но если я пытаюсь методом инжекта DLL в чужой процесс поменять там так-же адрес, то у меня ничего не выходит:

//CLIENT.exe

int main(int argc, char* argv[]){
    Process explorer(L"explorer.exe"); //Инициализация this->hModule, this->pID, this->hProcess
    if(!explorer.isOpen()) return -1;
    if(!explorer.injectLib(L"C:\\libappUTILS.dll")) return -2; //Инжект через CreateRemoteProcess
    return 0;


Код библиотеки:

//libappUTILS.dll

Process* explorer;


WINBOOL WINAPI MyCreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation){
    int argc = 0;
    QApplication app(argc, 0);
    QMessageBox::information(0,"hooked", QString(QString("У explorer.exe перехвачен вызов: ")));
}

BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, PVOID load){
    switch (fdwReason) {
        case DLL_PROCESS_ATTACH:{
            explorer = new Process(L"explorer.exe");
            if(!explorer->isOpen())
                explorer->error(L"Does not open process");
            HID hId = explorer->replaceProcAddress("KERNEL32.dll", GetProcAddress(GetModuleHandleA("Kernel32"), "CreateProcessW"), (PROC)MyCreateProcessW);

            if(hId == INVALID_HID){
                    int argc = 0;
                    QApplication app(argc, 0);
                    QMessageBox::information(0, "error", 0);
            }
            QMessageBox::information(0, "ptr", QString::number((long long)MyCreateProcessW));


            break;
        }
    }
    return FALSE;
}


Код Process::replaceProcAddress:

HID Process::replaceProcAddress(LPCSTR moduleName, PROC original, PROC swap){
    ULONG size;
    bool found = false;
    PIMAGE_IMPORT_DESCRIPTOR pImageDesc;
    pImageDesc = reinterpret_cast<PIMAGE_IMPORT_DESCRIPTOR>(ImageDirectoryEntryToData(getHinstance(), TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &size));
    if(pImageDesc == NULL)
        return INVALID_HID;
    for(; pImageDesc->Name; pImageDesc++){
        PSTR pModName = reinterpret_cast<PSTR>(reinterpret_cast<PBYTE>(getHinstance()) + pImageDesc->Name);
        if(strcmp(pModName, moduleName) == 0){
            PIMAGE_THUNK_DATA pThunkData = reinterpret_cast<PIMAGE_THUNK_DATA>(reinterpret_cast<PBYTE>(getHinstance()) + pImageDesc->FirstThunk);
            for(; pThunkData->u1.Function; pThunkData++){
                PROC* ppOriginalFunc = reinterpret_cast<PROC*>(&pThunkData->u1.Function);
                if(*ppOriginalFunc == original){
                    found = true;
                    DWORD dwOldProtect;
                    if(VirtualProtect(ppOriginalFunc, sizeof(swap), PAGE_WRITECOPY, &dwOldProtect)){
                        if(!WriteProcessMemory(getHandle(), ppOriginalFunc, &swap, sizeof(swap), NULL))
                            return INVALID_HID;
                        {
                            int argc = 0;
                            QApplication app(argc, 0);
                            QMessageBox::information(0, "ok", "changed");
                        }
                        VirtualProtect(ppOriginalFunc, sizeof(swap), dwOldProtect, &dwOldProtect);
                    }
                }
            }
        }
    }
    if(found) return 1;
    return INVALID_HID;
}


Процессы как открывались нормально, так и открываются. Подскажите пожалуйста, в чем может быть загвоздка

HID - мой тип (uint), который я использую для определения успешности завершения процедур
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
в чем может быть загвоздка

Твой код вообще вызывается? Отрабатывает без ошибок? Или где первая ошибка?

CreateProcessW

Почему ты ожидаешь, что все сознательные и используют W, а не A?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы