Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.08.2023, 02:38   #1
lallollulz
Пользователь
 
Регистрация: 20.10.2018
Сообщений: 16
По умолчанию Иньекция dll в программу, работает на 32 bit, не работает на 64 bit

Есть функция, которая выполняет иньекцию длл (32 bit) в процесс (также 32bit). если собираю свою программу (инжектор) как 32 bit - все прекрасно работает. если как 64 bit - иньекция не производиться (хотя функция возвращает результат 2 (то есть успешный). почему не работает в 64 bit? и как это исправить?
Код:
uint32_t CreateRemoteThreadUNM( LPCSTR DllPath, HANDLE hProcess )
{
    uint32_t result = 0;
 
 
 
    LPVOID LoadLibAddr = reinterpret_cast<LPVOID>(GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA"));
 
//    LPVOID LoadLibAddr = (LPVOID)GetProcAddress( GetModuleHandleA( "kernel32.dll" ), "LoadLibraryW" );
 
    if( !LoadLibAddr )
        return result;
 
    LPVOID pDllPath = VirtualAllocEx( hProcess, nullptr, std::strlen(DllPath), MEM_COMMIT, PAGE_READWRITE );
 
    if( !pDllPath )
        return result;
 
    BOOL Written = WriteProcessMemory( hProcess, pDllPath, (LPVOID)DllPath, strlen(DllPath), NULL );
 
    if( !Written )
        return result;
 
    HANDLE hThread = CreateRemoteThread( hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, pDllPath, 0, NULL );
 
    if( !hThread )
        return result;
 
    result++;
    WaitForSingleObject( hThread, INFINITE );
 
    if( !VirtualFreeEx( hProcess, pDllPath, 0, MEM_RELEASE ) )
        result++;
 
    CloseHandle( hThread );
    return result;
}
lallollulz вне форума Ответить с цитированием
Старый 06.08.2023, 08:23   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

В разных процессах адрес загрузки kernel32.dll может быть разным.
Я вообще удивляюсь, что это работает и на х32.
waleri вне форума Ответить с цитированием
Старый 06.08.2023, 14:39   #3
lallollulz
Пользователь
 
Регистрация: 20.10.2018
Сообщений: 16
По умолчанию

на самом деле инжектор это одна из опций моей программы, она большая и мне хотелось бы оставить ее x64. правильно ли я понимаю что единственный выход это сделать отдельное приложение инжектор x86 и делать иньекию через него? (то есть просто запускать его и передавать пид и имя процессора ей)? (это будет реализовано примерно следующим образом: моя основная программа (инжектор) будет запускать при старте дополнительную программу x86 которая будет всего навсего получать адрес LoadLibraryA в kernel x86 и передавать в основную программу этот адрес. затем уже используя этот адрес моя основная программу будет инжектить необходимые длл куда нужно.
т.е. правильно ли я понимаю что такие dll как user32.dll kernel32.dll никому не будут выгружены в рамках одной сессии пользователя windows и в процессе работы приложения мне не нужно обновлять адреса функций этих длл?
lallollulz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TesseractOCR4(delphi) : Release все работает, DEBUG практически не работает. все остальное одинаково Pcrepair Общие вопросы Delphi 0 23.06.2023 17:20
QUdpSocket работает только при локальном IP. Не работает если указан динамичесский айпи kook163 Qt и кроссплатформенное программирование С/С++ 5 09.05.2018 22:40
Программа на Visual C# работает при запуске руками, но не работает при попытки автоматического запуска Bug$ Помощь студентам 18 21.10.2013 16:22
не работает relese версия проги и debug работает тока на моем компе D][mon C# (си шарп) 2 04.05.2012 20:21
Почему программа на С++ не работает с локальным описанием массива, но работает с глобальным? >>STINGER<< Помощь студентам 4 08.03.2011 09:56