-
Автор темы
- #1
При инжекте драйверным инжектором через IAT появляется ошибка:
Ошибка появляется только при вызове DllMain. Но при этом перед этой ошибкой код из DllMain выполняется. Защита потока управления и подобное у библиотеки отключены.
Пожалуйста, авторизуйтесь для просмотра ссылки.
.Ошибка появляется только при вызове 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);