Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   чужой процесс , вызов функции c++ (https://forum.antichat.xyz/showthread.php?t=187755)

fromegg 17.03.2010 17:06

чужой процесс , вызов функции c++
 
Добрый день! Win xp.
Есть такая задача - в процессе p1
существует функция f1 -> как заставить p1 выполнять f1 из процесса p2 ??

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

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

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

Hiro Protagonist 17.03.2010 17:39

CreateRemoteThread

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

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

slesh 17.03.2010 17:48

Если обе проги твои, то лучший вариант - оформить функцию для вызова в виде экспорта. Так легче искать )

Hiro Protagonist 17.03.2010 19:11

2slesh
в таком варианте лучше использовать другие методы межпроцессного взаимодействия, типа пайпов, секций и тд

Gar|k 17.03.2010 23:00

Hiro Protagonist есть какие либо алгоритмы сигнатруного поиска? ну и вообще можешь поделишься на ссылки по теме что такое сигнатура - сигнатурный анализ

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

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

fromegg 18.03.2010 09:44

исследуемая программа не моя )
для примера можно взять pinball.exe


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

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

Hiro Protagonist 18.03.2010 14:21

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

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

zeppe1in 18.03.2010 20:54

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

Hiro Protagonist 19.03.2010 08:32

2zeppe1in
не универсально )

ntldr 19.03.2010 08:40

Цитата:

Сообщение от fromegg
исследуемая программа не моя )
для примера можно взять pinball.exe


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

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

Я думаю в данном случае такое скорее невозможно, чем возможно. Почему.
Когда ты отсылаешь нажатие кнопки, в обработчике системных сообщений главный поток программы переходит в ту функцию, которая в свою очередь вызывает еще что-то и т.д. CreateRemoteThread создаст новый поток, и 90% что он крашнет программу.
Как вариант - поэкспериментировать с SetThreadContext


Время: 10:55