Здравствуйте! Я так понял, что начиная с 8-ки dll инъекции нельзя делать, а есть этому альтернатива?
Ответ
Все отлично делается! И на 8 и на 8.1 и на 10. Если нужен пример простой инъекции кода, могу помочь с кодом (обновлю сообщение).
UPD
Способов загрузки dll превеликое множество, прочитать о них можно в книге Рихтера, вот один из простейших (работает на win8 100%, только для x86 приложений!!!):
bool load(const tstring & dllPath, const tstring & processName)
{
// Получение дескриптора процесса
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, false, t_proc.getID(processName));
if (process == NULL) {
msg_er_full;
return false;
}
//Из модуля kernel32.dll этого же процесса вытягиваем адрес функции LoadLibraryA
LPVOID fp = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
if (fp == NULL) {
msg_er_full;
if (!CloseHandle(process))msg_er_full;
return false;
}
// Выделение участка памяти размером dll_name для последующей записи в память процесса.
LPVOID alloc{};
if ((alloc = VirtualAllocEx(process, 0, dllPath.size(), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)) == NULL) {
msg_er_full;
if (!CloseHandle(process))msg_er_full;
return false;
}
// Запись Dll в память
if (WriteProcessMemory(process, alloc, dllPath.c_str(), dllPath.size(), 0) == NULL) {
msg_er_full;
if (!CloseHandle(process))msg_er_full;
return false;
}
// Создание "удаленного" потока в адресном пространстве открытого процесса и последующая подгрузка нашей Dll
if (CreateRemoteThread(process, 0, 0, (LPTHREAD_START_ROUTINE)fp, alloc, 0, 0) == NULL) {
msg_er_full;
if (!CloseHandle(process))msg_er_full;
return false;
}
return true;
}
Комментариев нет:
Отправить комментарий