Есть два процесса. Нужно вызвать функцию одного процесса из другого. Указатель на требуемую функцию найден, но он находится в адресном пространстве другого процесса и вызов по нему приводит к Access Volation. Подойдет ссылка на любую информацию по теме. P.S. Это мой первый вопрос на форум, поэтому прошу не пинать меня за него слишком сильно.
Хорошо, пинать не будем. Давай рассуждать. Ты сам говоришь Это вполне логично, так как в твоем АП по этому адресу находится совсем не то, что в другом. Отсюда вывод - тебе необходимо попасть в АП чужого процесса, там вызвать нужную функцию и результат вернуть собственному процессу.
dcLout вариант 1. скопировать функцию себе и запустить в АП своего процесса (ReadProcessMemory) вариант 2. создать удаленный поток в АП чужого процесса в качестве точки входа указать адрес функции (CreateRemoteThread) вариант 3. скопировать в АП чужого процесса мини функцию, осуществляющую вызов требуемой функции, но возвращающей результат в ваш процесс и создать удаленную ветвь с указанием адреса скопированной функции. з.ы. интересно только для чего это надо? если не секрет.
max7C4 Первый вариант ересь. Второй в общем случае неуниверсален (геморройненький). Третий я озвучил.
Закинь в процесс dll-ку и jmp,нахера процесс к процесу ежели можно либу хоть через расшареные секции.
Twister почему же. вот вам пример функции, которую можно скопировать Код (Text): push eax push ecx push edx mov eax, [esp+16] mov eax, [esp+20] mov eax, [esp+24] finit fld dword [eax+0] fld dword [eax+4] fld dword [eax+8] fadd dword [edx+0] fadd dword [edx+4] fadd dword [edx+8] fstp dword [ecx+0] fstp dword [ecx+4] fstp dword [ecx+8] pop edx pop ecx pop eax ret 12 примерный аналог на Си Код (Text): void add(vector3* a, vector3* b, vector3* c) { c->x=a->x+b->x; c->y=a->y+b->y; c->z=a->z+b->z; return; }
Написать шелкод, пикод и не понадобится никаких либ - тупо записать в память тому процессу, затем SetThreadContext() на свой обработчик, затем восстановить контекст потока и вызвать нужную функцию. Только непонятно к чему такой ерундой заниматься...
max7C4 Если функцию возможно скопировать к себе в процесс и она при этом не потеряет функционал, то ее можно преспокойненько рипнуть из дизасма и встроить в свой код. В данном случае вообще отпадет надобность что-то откуда-то копировать.
При создании удаленного треда не стоит забывать про тредобезопасность. Если функция, которую необходимо вызвать, изменяет некоторую структуру в то время как главный поток удаленного процеса ее читает и т.д. и т.п., то это ведет к непредсказуемым последствиям. Остановка главного потока удаленного процесса не решает эту проблему, потому как он может уже находится в критической секции. Каковы остаются варианты в таком случае?