Как вызвать функцию другого процесса?

Тема в разделе "WASM.WIN32", создана пользователем dcLout, 15 фев 2010.

  1. dcLout

    dcLout New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2010
    Сообщения:
    47
    Есть два процесса. Нужно вызвать функцию одного процесса из другого.
    Указатель на требуемую функцию найден, но он находится в адресном пространстве другого процесса и вызов по нему приводит к Access Volation.
    Подойдет ссылка на любую информацию по теме.
    P.S. Это мой первый вопрос на форум, поэтому прошу не пинать меня за него слишком сильно. :)
     
  2. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Хорошо, пинать не будем. :)

    Давай рассуждать. Ты сам говоришь
    Это вполне логично, так как в твоем АП по этому адресу находится совсем не то, что в другом. Отсюда вывод - тебе необходимо попасть в АП чужого процесса, там вызвать нужную функцию и результат вернуть собственному процессу.
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    dcLout
    вариант 1. скопировать функцию себе и запустить в АП своего процесса
    (ReadProcessMemory)
    вариант 2. создать удаленный поток в АП чужого процесса в качестве точки входа указать адрес функции (CreateRemoteThread)
    вариант 3. скопировать в АП чужого процесса мини функцию, осуществляющую вызов требуемой функции, но возвращающей результат в ваш процесс и создать удаленную ветвь с указанием адреса скопированной функции.

    з.ы. интересно только для чего это надо? если не секрет.
     
  4. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    max7C4
    Первый вариант ересь. Второй в общем случае неуниверсален (геморройненький). Третий я озвучил.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    RtlRemoteCall() :)
    Сформировать контекст и стек.
     
  6. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Закинь в процесс dll-ку и jmp,нахера процесс к процесу ежели можно либу хоть через расшареные секции.
     
  7. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Twister
    почему же. вот вам пример функции, которую можно скопировать
    Код (Text):
    1. push eax
    2. push ecx
    3. push edx
    4. mov eax, [esp+16]
    5. mov eax, [esp+20]
    6. mov eax, [esp+24]
    7. finit
    8. fld dword [eax+0]
    9. fld dword [eax+4]
    10. fld dword [eax+8]
    11. fadd dword [edx+0]
    12. fadd dword [edx+4]
    13. fadd dword [edx+8]
    14. fstp dword [ecx+0]
    15. fstp dword [ecx+4]
    16. fstp dword [ecx+8]
    17. pop edx
    18. pop ecx
    19. pop eax
    20. ret 12
    примерный аналог на Си
    Код (Text):
    1. void add(vector3* a, vector3* b, vector3* c)
    2. {
    3.  c->x=a->x+b->x;
    4.  c->y=a->y+b->y;
    5.  c->z=a->z+b->z;
    6.  return;
    7. }
     
  8. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Написать шелкод, пикод и не понадобится никаких либ - тупо записать в память тому процессу, затем SetThreadContext() на свой обработчик, затем восстановить контекст потока и вызвать нужную функцию. Только непонятно к чему такой ерундой заниматься...
     
  9. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    max7C4
    Если функцию возможно скопировать к себе в процесс и она при этом не потеряет функционал, то ее можно преспокойненько рипнуть из дизасма и встроить в свой код. В данном случае вообще отпадет надобность что-то откуда-то копировать.
     
  10. zStorm

    zStorm New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2005
    Сообщения:
    44
    Адрес:
    Ukraine
    При создании удаленного треда не стоит забывать про тредобезопасность.
    Если функция, которую необходимо вызвать, изменяет некоторую структуру в то время как главный поток удаленного процеса ее читает и т.д. и т.п., то это ведет к непредсказуемым последствиям.
    Остановка главного потока удаленного процесса не решает эту проблему, потому как он может уже находится в критической секции.

    Каковы остаются варианты в таком случае?
     
  11. dcLout

    dcLout New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2010
    Сообщения:
    47
    Большое спасибо всем, кто помог мне, ответив на мой вопрос.
    Проблема решена.