Как поиметь запущенное приложение на C#?

Такая вот ситуация. Есть некое приложение, написанное на шарпе. И есть я, который хочет, используя тот же шарп, каким-то образом подключиться к процессу этого приложения и что-то там в нем менять. Исходников этого приложения нету.
Подскажите, в какую сторону гуглить?))
  • Вопрос задан
  • 8634 просмотра
Пригласить эксперта
Ответы на вопрос 7
ghaiklor
@ghaiklor
NodeJS TechLead
Это называется дизассемблирование (раз исходников нету). И при таком стиле вопроса могу ответить - гуглить вам нужно будет очень долго.
По существу. В случае с шарпом - ReSharper. Поможет восстановить часть исходных кодов и проекта. Я бы даже сказал, что он весь проект восстанавливает.
Ответ написан
@Avery007
.NET и C# исходники можно получить используя декомпилятор ShowMyCode
Ответ написан
martsen
@martsen
Программист-дроновод
Если хотите получить исходник приложения, то советую dotPeek. Он может исходники в проект Visual Studio экспортировать.
Ответ написан
Комментировать
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
Умение работать с отладчиком - очень полезное. Вам, кажется, именно этим и придётся заниматься
Ответ написан
bstdman
@bstdman
Desktop разработчик
Если нужно симулировать поведение пользователя - нажимать кнопки, вводить данные в поля - то можно обойтись WinAPI (получить хэндл окна и посылать команды через SendMesssage). Если нужно менять данные в памяти - то без отладчика никуда
Ответ написан
Комментировать
@BlindShot96
Можно с помощью WinApi писать в память процесса. Для этого необходимо узнать Id процесса. По-моему, самый удобный способ это сделать, зная название процесса (имя исполняемого файла без расширения EXE или пути).
public static uint GetProcessID(string name)
        {
          return (uint)Process.GetProcessesByName(name)[0].Id;
        }


После того, как найден Id процесса его нужно открыть для чтения/записи. Для этого нужно использовать функцию WinApi OpenProcess. dwDesiredAccess- модификатор доступа к процессу( 0x001F0FFF - полный доступ к процессу) dwProcessId- id процесса
[DllImport("kernel32.dll")]
        public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32    dwProcessId);

IntPtr process_handle = OpenProcess(0x001F0FFF,1,process_id);


Функция открытия процесса возвращает handle процесса (как я понял указатель на него). process_handle далее нужно использовать для функция чтения и записи данных в память процесса.

Чтобы записать данные в память процесса можно использовать функцию WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte [] lpBuffer, uint nSize, out int lpNumberOfBytesWritten);
hProcess - handle процесса, lpBaseAddress - это адрес памяти, начиная с которого нужно записывать данные, lpBuffer - данные для записи, nSize - количество байтов для записи, lpNumberOfBytesWritten - точно не знаю, что означает, его можно оставить в значение UIntPtr.Zero

После работы с процессом нужно закрыть подключение к нему. hObject - handle процесса.
[DllImport("kernel32.dll")]
        public static extern Int32 CloseHandle(IntPtr hObject);
Ответ написан
@varus
Идея такая: если у вас есть ссылка на AppDomain, вы можете вызвать в нем свой код. Проблема в том, как получить домен удаленного процесса. Нагуглилось только вот что. Если я правильно вас понял, вам нужно примерно это. Правда, я не уверен, что DoCallback получится вызвать для домена другого процесса. Да и что есть возможность получить домены по ProcessID тоже не факт. Альтернативы: как уже сказали, SendMessage. Может в System.Reflection.Emit что-нибудь найдется.
Вот еще статья нагуглилась, может интересно будет, а может оно и не совсем в тему. В любом случае, найдете решение - отпишитесь, очень интересно!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы