 |
Вызов функций из чужого адресного пространства - Вопросы и ответы, обсуждения - Ваши вопросы по C/C++ только в данном разделе |
01.02.2013, 18:33
|
#1
|
|
|
|
Сержант
|
 Регистрация: 01.10.2011
 Сообщений: 128
 Популярность: 5723
 Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Вызов функций из чужого адресного пространства
Здравствуйте, не часто я задаю вопросы, но сейчас именно такой случай.
Начну пожалуй с кода
Код:
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, id); //Получаю дескриптор "чужого" процесса
DWORD dwRemoteModuleBase = dwGetModuleBaseAddress(id, "injected.dll"); //Получаю базовый адрес моей длл'ки
HMODULE hModule = LoadLibrary("injected.dll"); //гружу свою длл'ку в себя, что бы узнать смещение
DWORD offset = dwGetOffset(hModule, "Test"); //получаю смещение для функции
LPVOID lpFunc = (void*)(DWORD)(offset + dwRemoteModuleBase); // ну и наконец получаю указатель на функцию
FreeLibrary(hModule);
Все естественно работает, получаю правильный указатель, НО, я не могу вернуть результат функции, если она конечно его возвращает.
Вызываю функцию через CreateRemoteThread, вот так
Код:
BOOL RemoteExecute(HANDLE hProcess, LPVOID lpFunc, LPVOID lpParam)
{
if(!lpFunc)
return FALSE;
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpFunc, lpParam, 0, NULL);
if(!hThread)
{
CloseHandle(hThread);
return FALSE;
}
CloseHandle(hThread);
return TRUE;
}
Так вот, может есть какие то другие способы вызывать функции, или способы вернуть результат из потока
________________
Talk is cheap. Show me the code
— Linus Torvalds
|
|
|
02.02.2013, 02:37
|
#2
|
|
|
|
Лейтенант-командор
|
 Регистрация: 12.08.2010
 Сообщений: 727
 Популярность: 30569
 Золото Zhyk.Ru: 1
 Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
|
Re: Вызов функций из чужого адресного пространства
А вариант прицепить ольку и посмотреть куда результат идёт принимается?
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Perfect World: PWDatabaseScanner, Client, PWNickRenamer, PWClientRenamer, База логинов PW, Гайд по варУ, Зарабатываем репутацию.
Delphi: Авторизация на сайте с помощью Indy, Загрузка изображений с интернета в TImage с помощью Indy, Автоматическая смена стандартной версии Indy в Delphi на Indy 10.0.76 / 10.1.5, Основы парсинга с помощью Indy, Делаем Updater до программы с помощью Indy.
Other: ShowIP, FFUUU смайлы в QIP, Как играть в Minecraft (видеокурс), Как мы захватили человечество :D, Энергия в Лицемер/TopFace, PasGen.
|
|
|
02.02.2013, 03:16
|
#3
|
|
|
|
Сержант
|
 Регистрация: 01.10.2011
 Сообщений: 128
 Популярность: 5723
 Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Re: Вызов функций из чужого адресного пространства
VeTaL_UA, оказалось все на много проще, ответ можно вытащить при помощи функции GetExitCodeThread примерно вот так
Код:
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpFunc, lpParam, 0, NULL);
WaitForSingleObject(hThread,INFINITE);
DWORD dwResult;
GetExitCodeThread(pHandle,&dwResult);
________________
Talk is cheap. Show me the code
— Linus Torvalds
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 10:10.
|
 |