Вопрос Ошибка при инжекте через драйвер

Начинающий
Статус
Оффлайн
Регистрация
24 Май 2020
Сообщения
197
Реакции[?]
25
Поинты[?]
0
При инжекте драйверным инжектором через IAT появляется ошибка:
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Ошибка появляется только при вызове DllMain. Но при этом перед этой ошибкой код из DllMain выполняется. Защита потока управления и подобное у библиотеки отключены.
C++:
    uint8_t dll_stub[] = { "\x51\x52\x55\x56\x53\x57\x41\x50\x41\x51\x41\x52\x41\x53\x41\x54\x41\x55\x41\x56\x41\x57\x48\xB8\xFF\x00\xDE\xAD\xBE\xEF\x00\xFF\x48\xBA\xFF\x00\xDE\xAD\xC0\xDE\x00\xFF\x48\x89\x10\x48\x31\xC0\x48\x31\xD2\x48\x83\xEC\x28\x48\xB9\xDE\xAD\xBE\xEF\xDE\xAD\xBE\xEF\x48\x31\xD2\x48\x83\xC2\x01\x48\xB8\xDE\xAD\xC0\xDE\xDE\xAD\xC0\xDE\xFF\xD0\x48\x83\xC4\x28\x41\x5F\x41\x5E\x41\x5D\x41\x5C\x41\x5B\x41\x5A\x41\x59\x41\x58\x5F\x5B\x5E\x5D\x5A\x59\x48\x31\xC0\xC3" };
   
    IMAGE_DOS_HEADER *dos_header{ (IMAGE_DOS_HEADER *)raw_data };

    if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) {
        LOG_ERROR("Invalid DOS header signature!");
        return false;
    }

    IMAGE_NT_HEADERS *nt_header{ (IMAGE_NT_HEADERS *)(&raw_data[dos_header->e_lfanew]) };

    if (nt_header->Signature != IMAGE_NT_SIGNATURE) {
        LOG_ERROR("Invalid NT header signature!");
        return false;
    }

    uint64_t base{ proc->virtual_alloc(nt_header->OptionalHeader.SizeOfImage,
                                       MEM_COMMIT | MEM_RESERVE,
                                       PAGE_READWRITE) };

    if (!base) {
        LOG_ERROR("Unable to allocate memory for the image!");
        return false;
    }

    LOG("Image base: 0x%p", base);
    uint64_t stub_base{ proc->virtual_alloc(sizeof(dll_stub),
                                            MEM_COMMIT | MEM_RESERVE,
                                            PAGE_READWRITE) };
   
    if (!stub_base) {
        LOG_ERROR("Unable to allocate memory for the stub!");
        return false;
    }

    LOG("Stub base: 0x%p", stub_base);

    PIMAGE_IMPORT_DESCRIPTOR import_descriptor{ (PIMAGE_IMPORT_DESCRIPTOR)get_ptr_from_rva(
                                                (uint64_t)(nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress),
                                                nt_header,
                                                raw_data) };

    if (nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size) {
        LOG("Solving imports...");
        solve_imports(raw_data, nt_header, import_descriptor);
    }

    PIMAGE_BASE_RELOCATION base_relocation{ (PIMAGE_BASE_RELOCATION) get_ptr_from_rva(
                                                                        nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress,
                                                                        nt_header,
                                                                        raw_data)};

    if (nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size) {
        LOG("Solving relocations...");
        solve_relocations((uint64_t) raw_data,
                          base,
                          nt_header,
                          base_relocation,
                          nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size);
    }

   
    if (!parse_imports()) {
        LOG_ERROR("Unable to parse imports!");
        return false;
    }

    uint64_t iat_function_ptr{ imports["TranslateMessage"] };
    if (!iat_function_ptr) {
        LOG_ERROR("Cannot find import");
        return false;
    }

    uint64_t orginal_function_addr{ read_memory<uint64_t>(iat_function_ptr) };
    LOG("IAT function pointer: 0x%p", iat_function_ptr);
    LOG("Original IAT pointer: 0x%p", orginal_function_addr);

    *(uint64_t*)(dll_stub + 0x18) = iat_function_ptr;
    *(uint64_t*)(dll_stub + 0x22) = orginal_function_addr;  

    proc->write_memory(base, (uintptr_t)raw_data, nt_header->FileHeader.SizeOfOptionalHeader + sizeof(nt_header->FileHeader) + sizeof(nt_header->Signature));
    LOG("Mapping PE sections...");
    map_pe_sections(base, nt_header);

    uint64_t entry_point{ (uint64_t)base + nt_header->OptionalHeader.AddressOfEntryPoint };
    *(uint64_t*)(dll_stub + 0x39) = base;
    *(uint64_t*)(dll_stub + 0x4a) = entry_point;

    LOG("Entry point: 0x%p", entry_point);
    proc->write_memory(stub_base, (uintptr_t)dll_stub, sizeof(dll_stub));
    proc->virtual_alloc(sizeof(uint64_t), MEM_RESET, PAGE_READWRITE, iat_function_ptr);
    proc->virtual_protect(iat_function_ptr, sizeof(uint64_t), PAGE_READWRITE);
    proc->write_memory(iat_function_ptr, (uintptr_t)&stub_base, sizeof(uint64_t));
    LOG("Success!");
    system("pause");
    proc->virtual_protect(iat_function_ptr, sizeof(uint64_t), PAGE_READONLY);
 
Energy Reload
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции[?]
330
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Это не ошибка.
И этот способ не будет работать.
 
Energy Reload
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции[?]
330
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Начинающий
Статус
Оффлайн
Регистрация
23 Дек 2018
Сообщения
134
Реакции[?]
5
Поинты[?]
0
При инжекте драйверным инжектором через IAT появляется ошибка:
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Ошибка появляется только при вызове DllMain. Но при этом перед этой ошибкой код из DllMain выполняется. Защита потока управления и подобное у библиотеки отключены.
C++:
    uint8_t dll_stub[] = { "\x51\x52\x55\x56\x53\x57\x41\x50\x41\x51\x41\x52\x41\x53\x41\x54\x41\x55\x41\x56\x41\x57\x48\xB8\xFF\x00\xDE\xAD\xBE\xEF\x00\xFF\x48\xBA\xFF\x00\xDE\xAD\xC0\xDE\x00\xFF\x48\x89\x10\x48\x31\xC0\x48\x31\xD2\x48\x83\xEC\x28\x48\xB9\xDE\xAD\xBE\xEF\xDE\xAD\xBE\xEF\x48\x31\xD2\x48\x83\xC2\x01\x48\xB8\xDE\xAD\xC0\xDE\xDE\xAD\xC0\xDE\xFF\xD0\x48\x83\xC4\x28\x41\x5F\x41\x5E\x41\x5D\x41\x5C\x41\x5B\x41\x5A\x41\x59\x41\x58\x5F\x5B\x5E\x5D\x5A\x59\x48\x31\xC0\xC3" };
  
    IMAGE_DOS_HEADER *dos_header{ (IMAGE_DOS_HEADER *)raw_data };

    if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) {
        LOG_ERROR("Invalid DOS header signature!");
        return false;
    }

    IMAGE_NT_HEADERS *nt_header{ (IMAGE_NT_HEADERS *)(&raw_data[dos_header->e_lfanew]) };

    if (nt_header->Signature != IMAGE_NT_SIGNATURE) {
        LOG_ERROR("Invalid NT header signature!");
        return false;
    }

    uint64_t base{ proc->virtual_alloc(nt_header->OptionalHeader.SizeOfImage,
                                       MEM_COMMIT | MEM_RESERVE,
                                       PAGE_READWRITE) };

    if (!base) {
        LOG_ERROR("Unable to allocate memory for the image!");
        return false;
    }

    LOG("Image base: 0x%p", base);
    uint64_t stub_base{ proc->virtual_alloc(sizeof(dll_stub),
                                            MEM_COMMIT | MEM_RESERVE,
                                            PAGE_READWRITE) };
  
    if (!stub_base) {
        LOG_ERROR("Unable to allocate memory for the stub!");
        return false;
    }

    LOG("Stub base: 0x%p", stub_base);

    PIMAGE_IMPORT_DESCRIPTOR import_descriptor{ (PIMAGE_IMPORT_DESCRIPTOR)get_ptr_from_rva(
                                                (uint64_t)(nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress),
                                                nt_header,
                                                raw_data) };

    if (nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size) {
        LOG("Solving imports...");
        solve_imports(raw_data, nt_header, import_descriptor);
    }

    PIMAGE_BASE_RELOCATION base_relocation{ (PIMAGE_BASE_RELOCATION) get_ptr_from_rva(
                                                                        nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress,
                                                                        nt_header,
                                                                        raw_data)};

    if (nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size) {
        LOG("Solving relocations...");
        solve_relocations((uint64_t) raw_data,
                          base,
                          nt_header,
                          base_relocation,
                          nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size);
    }

  
    if (!parse_imports()) {
        LOG_ERROR("Unable to parse imports!");
        return false;
    }

    uint64_t iat_function_ptr{ imports["TranslateMessage"] };
    if (!iat_function_ptr) {
        LOG_ERROR("Cannot find import");
        return false;
    }

    uint64_t orginal_function_addr{ read_memory<uint64_t>(iat_function_ptr) };
    LOG("IAT function pointer: 0x%p", iat_function_ptr);
    LOG("Original IAT pointer: 0x%p", orginal_function_addr);

    *(uint64_t*)(dll_stub + 0x18) = iat_function_ptr;
    *(uint64_t*)(dll_stub + 0x22) = orginal_function_addr; 

    proc->write_memory(base, (uintptr_t)raw_data, nt_header->FileHeader.SizeOfOptionalHeader + sizeof(nt_header->FileHeader) + sizeof(nt_header->Signature));
    LOG("Mapping PE sections...");
    map_pe_sections(base, nt_header);

    uint64_t entry_point{ (uint64_t)base + nt_header->OptionalHeader.AddressOfEntryPoint };
    *(uint64_t*)(dll_stub + 0x39) = base;
    *(uint64_t*)(dll_stub + 0x4a) = entry_point;

    LOG("Entry point: 0x%p", entry_point);
    proc->write_memory(stub_base, (uintptr_t)dll_stub, sizeof(dll_stub));
    proc->virtual_alloc(sizeof(uint64_t), MEM_RESET, PAGE_READWRITE, iat_function_ptr);
    proc->virtual_protect(iat_function_ptr, sizeof(uint64_t), PAGE_READWRITE);
    proc->write_memory(iat_function_ptr, (uintptr_t)&stub_base, sizeof(uint64_t));
    LOG("Success!");
    system("pause");
    proc->virtual_protect(iat_function_ptr, sizeof(uint64_t), PAGE_READONLY);
Не пытайся. Без лишних слов
 
Сверху Снизу