чужой процесс , вызов функции c++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fromegg, 17 Mar 2010.

  1. fromegg

    fromegg New Member

    Joined:
    19 Feb 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Добрый день! Win xp.
    Есть такая задача - в процессе p1
    существует функция f1 -> как заставить p1 выполнять f1 из процесса p2 ??

    грубо говоря управлять некими функциями одной программой с помощью другой )

    я понимаю что это вторжение в адресное пространства чужого процесса ,Но еще одно условие ! нужно узнать адрес или название самой f1 . известно например что f1 выполняет некое конкретное действие в программе..

    собственно вот сама цель.. хотелось бы увидеть пример кода для реализации если не всей идеи на примере любой стандартной программы винды , то хотябы частичной.
     
  2. Hiro Protagonist

    Joined:
    26 Aug 2009
    Messages:
    132
    Likes Received:
    24
    Reputations:
    -2
    CreateRemoteThread

    функцию ищешь сигнатурно, читаешь память с помощью ReadProcessMemory

    либо с помощью натива, но тебе ещё рано
     
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Если обе проги твои, то лучший вариант - оформить функцию для вызова в виде экспорта. Так легче искать )
     
    1 person likes this.
  4. Hiro Protagonist

    Joined:
    26 Aug 2009
    Messages:
    132
    Likes Received:
    24
    Reputations:
    -2
    2slesh
    в таком варианте лучше использовать другие методы межпроцессного взаимодействия, типа пайпов, секций и тд
     
  5. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Hiro Protagonist есть какие либо алгоритмы сигнатруного поиска? ну и вообще можешь поделишься на ссылки по теме что такое сигнатура - сигнатурный анализ

    как я понимаю. p1 нужно запустить под отладчиком и найти там точку входа в нужную процедуру далее тупо скопировать ее дамп. И уже исследуя память процесса p1 из своей программы искать стартовый адрес процедуры. так?

    опять же встает вопрос о том где как лучше и быстрей искать в адресном пространстве процесса? похоже изначально нужно проанализировать PE заголовок... в общем куча вопросов вылазит у меня лично ) я этим не занимался но интересно )
     
    _________________________
  6. fromegg

    fromegg New Member

    Joined:
    19 Feb 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    исследуемая программа не моя )
    для примера можно взять pinball.exe


    например нажав <space> пружинка сработает, шарик улетит ... это я так думаю легко эмулировать отослав sendmessage(... <space>) к Pinball ... но это не то.

    надо вызвать функ f1 и точка !
    1)про f1 я знаю что после ее вызова происходит какоето действие
    2)больше сведений нет о f1
     
  7. Hiro Protagonist

    Joined:
    26 Aug 2009
    Messages:
    132
    Likes Received:
    24
    Reputations:
    -2
    2Gar|k
    ну сигнатурой можно назвать что угодно на самом деле. В классике это последовательность байт, ещё из простого считать контрольные суммы.
    быстрее всего я думаю пройтись по коллам от точки входа и проверять сигнатуру (crc или байтеги), так приблизительно ида делает в случае с flirt-сигнатурами. Естественно возможны ложные срабатывания если размер сигнатуры подберешь слишком маленьким или возмешь по какимто часто встречаюшимся командам (типа стаба, etc). Тут конечно нужен дизасм, но это самый интеллектуальный подход )), если конечно нужно искать неэкспортируемую функцию в обычном исполняемом файле, для поли\метаморфного кода уже другие конечно подходы )) типа выделения паттернов, анализа кода и поведенческого анализа )) тоже в своем роде сигнатуры. Ага по байтикам кстати нужно сигнатуры брать (в случае неполиморфного кода) в районах локального максимума энтропии желательно, естественно от какихто "уникальных" данных (потипу адресов строк и тд). Впрочем все это банально и мало интересно, честно ))

    2fromegg
    перед тем, как будет искать твой процесс в автомате неэкспортируемый символ, тебе придется его найти руками.
     
  8. zeppe1in

    zeppe1in Elder - Старейшина

    Joined:
    12 Jul 2006
    Messages:
    343
    Likes Received:
    66
    Reputations:
    18
    а тупо по адресу то не вызвать функцию)
     
  9. Hiro Protagonist

    Joined:
    26 Aug 2009
    Messages:
    132
    Likes Received:
    24
    Reputations:
    -2
    2zeppe1in
    не универсально )
     
  10. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    Я думаю в данном случае такое скорее невозможно, чем возможно. Почему.
    Когда ты отсылаешь нажатие кнопки, в обработчике системных сообщений главный поток программы переходит в ту функцию, которая в свою очередь вызывает еще что-то и т.д. CreateRemoteThread создаст новый поток, и 90% что он крашнет программу.
    Как вариант - поэкспериментировать с SetThreadContext
     
    1 person likes this.
  11. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    А вообще при написании например ботов к онлайн играм, которые управляют движением персонажа, там просто находят адреса, по которым, например, 1 это зажатая кнопка "вперед", и через WriteProcessMemory пишут данные. То есть не вызывают функцию напрямую, а заставляют сам процесс вызвать ее.
     
  12. Hiro Protagonist

    Joined:
    26 Aug 2009
    Messages:
    132
    Likes Received:
    24
    Reputations:
    -2
    2ntldr
    если тупо вызывать, то 100% упадет ибо в стеке нет адреса возврата, нужнож по умному все делать =)
     
  13. fromegg

    fromegg New Member

    Joined:
    19 Feb 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    ух тада...., ну может кто то ссылками поделится на подобный пример?)хоть чемто связыный с моей задачей... токо не кидайте на мсдн и всякое типа " что такое writeprocmem"

    например на разбор бота для игры..
     
  14. Hiro Protagonist

    Joined:
    26 Aug 2009
    Messages:
    132
    Likes Received:
    24
    Reputations:
    -2
    на вот про перехваты почитай, там используется удаленные потоки и тд
    http://wasm.ru/article.php?article=apihook_1
     
  15. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    http://www.mmowned.com/forums/wow-memory-editing/
     
  16. zeppe1in

    zeppe1in Elder - Старейшина

    Joined:
    12 Jul 2006
    Messages:
    343
    Likes Received:
    66
    Reputations:
    18
    раз пошла такая пьянка), то не совсем понятно что за адрес по которому нажата кнопка? и что писать в память процесса?
    у меня просто есть похожая задача, дак вот там же оконная процедура которая обрабатывает сообщения о нажатых кнопках и прочее. тоесть как вариант слать сообщения окну, а если тупо вызвать процедеру обработки то хз, не пробовал, да её ещо и искать запаришся.
     
  17. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    для оконных приложений это не подходит.
     
  18. fromegg

    fromegg New Member

    Joined:
    19 Feb 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    гуд ! очь хорошие ссылки .спс
     
  19. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,310
    Reputations:
    327
    вообще просто фиксированную базу юзать и все
     
  20. Hiro Protagonist

    Joined:
    26 Aug 2009
    Messages:
    132
    Likes Received:
    24
    Reputations:
    -2
    2sn0w
    хуле толку если в каждой новой версии адрес функции будет менятся, а ты на столько ленив, что влом каждый раз искать руками неэкспортируемую функцию? ^_____^