2016-04-07 2 views
0

Я немного новичок в этом, и я до сих пор не понимаю этот вопрос, хотя я знаю, как сделать поток и запустить программы с несколькими потоками. Мне интересно, когда вы создаете dll-файл (C++) и вставляете его в процесс (скажем, с игрой), например. Вам нужно будет создавать потоки в DLL-файле, или это не сработает? После моего понимания основной поток будет запущен из хост-процесса правильно? Или как это работает?C++ Внедрение dll, вам нужны потоки?

+0

Вам необязательно создавать отдельные потоки в вашей DLL. Это зависит от того, что вам нужно сделать. –

+0

Поскольку «инъекция» не является термином, который фиксирован, невозможно сказать, нужны ли вам потоки. Вы не нуждаетесь в потоках каждый раз, но некоторые инъекции могут нуждаться в них. – nvoigt

+0

Хорошо, но будет ли он работать для создания потоков в DLL-файле, и они будут работать отдельно в хост-процессе? Im в школе, поэтому я не могу проверить это, но идея просто ударила меня. Или бы потоки не ускорили работу? Потому что моя программа exernal работает очень медленно из-за многопоточности, хотя мой код еще не оптимизирован. Поэтому я мог бы сделать это dll и внедрить в процесс. Но им интересно, нужны ли мне потоки или нет –

ответ

0

Каждый процесс имеет хотя бы один поток. Когда этот процесс начинается, можно связать кучу функций или библиотеки с памятью этого процесса. Вот что такое dll. Преимущество по сравнению с привязкой непосредственно к бинарнику состоит в том, что библиотека должна существовать только в одном месте в файловой системе и в одном месте в памяти при использовании несколькими процессами. Это метод связывания, аналогичный тому, как файлы .so используются в Linux. Это не имеет ничего общего с потоками.

+0

Итак, я должен ctually запустить мою программу из того процесса, который я пытаюсь сделать для программы, вместо того, чтобы делать внешний? Я делаю игру hack lol –

1

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

Но если эта DLL будет прослушивать сокет или записывать в файл или выполнять фактическую работу, которая потребует некоторого параллелизма, тогда вам может понадобиться создать потоки внутри этой DLL.

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

Чтобы ответить на ваш вопрос,

Would you need to create threads in the dll file, or is that not going to work?

Ans: Не всегда. Вам нужно создать поток для выполнения какой-либо задачи. При этом это не всегда так. Вполне возможно, чтобы запустить DLL внутри процесса без каких-либо потоков.

After my understanding the main thread will be running from the host process right? Or how does it work?

Ans: Это верно. Любой процесс, который вы запускаете, по умолчанию будет один поток. Если ваше приложение достаточно просто для обработки одним потоком, то это благословение. Продолжайте с этим :)

+0

Спасибо за ответ, он очистил некоторые вещи для меня. : p –

+0

Радует об этом. Вы можете захотеть поддержать мой ответ, если хотите. –

0

Вам нужно будет создать потоки в DLL-файле, или это не сработает?

Невозможно загрузить DLL-файл, который не содержит кода, который будет запущен. Тем не менее, есть несколько способов, код DLL может задавит:

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

  • во время инициализации, может:

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

    • регистрировать обратные вызовы от ОС или приложения, такие как настройка обработчиков сигналов, обработчиков клавиш, любого типа обработчика событий ....

  • может содержать функции, что программа будет искать динамически и запустить, спутать код DLL для оригинальных версий этих функций, программа прилагаемых

Какой из этих костюмов ваших потребности полностью зависят от того, что ваша DLL пытается достичь, и что технически необходимо для ее достижения. Например, если вы хотите, чтобы какая-то память имела конкретный контент, а затем его дальнейшее изменение, может быть достаточно иметь функцию в вашей DLL, вызванную службой сигнализации ОС, и сбросить ее снова, если не будет обнаружено содержимое загружаемой памяти , Но триггером может быть наличие файла или службы обмена памятью, создаваемого сокета и т. Д.

После моего понимания основной поток будет работать от хост-процесса правильно? Или как это работает?

Да - потоки, запущенные в процессе, включая любые инициализационные процедуры DLL, также находятся в процессе. Существуют некоторые библиотечные функции, которые могут создавать другие процессы, такие как fork, popen, system, которые могут содержать свои собственные потоки.

+0

Спасибо :) Toofewcharacters –

0

Поскольку вы конкретно ссылаетесь на , вносящий DLL, у меня есть для вас дополнительный вклад в то, что уже было сказано.

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

Нить в основном является непосредственной средой, в которой работает код. Такие вещи, как текущее состояние регистров процессора и стековые переменные (например, ваши локальные переменные в функциях, в большинстве случаев, а также где в коде, исполняемом в настоящий момент), относятся к потоку. Существуют также другие ресурсы, которые часто имеют сходство потоков, например, окна. Это зависит от ресурса, о котором идет речь, о том, есть ли у них сходство потоков.

Предположим, вы пишете простую программу мира привет. Он будет работать в одном потоке, который проходит через вашу программу от начала до конца и печатает «Hello World». Теперь предположим, что вы захотите написать программу, которая медленно записывает «Hello World», по одному символу в секунду, но тем временем загружает файл. Затем вы можете создать второй поток и вывести поток «Hello World» медленно, и один поток загрузит файл. Это означает, что выполнение может происходить параллельно, с различным локальным состоянием - один поток в данный момент находится внутри вашей функции printHelloWorld, а один поток находится внутри downloadFile.

Процесс в основном представляет собой контейнер для одного или нескольких потоков. Он объединяет их вместе в общую среду, в которой используется одна и та же виртуальная память (это означает, что, например, глобальные переменные в вашем коде будут доступны из всех потоков, но для этого требуется тщательная синхронизация, чтобы избежать условий гонки) и разделяет ресурсы, такие как дескрипторы файлов создаются потоки процесса. Таким образом, ваша программа hello-world-and-download из ранее имела бы 2 потока в 1 процессе, например, для совместного использования консоли и наблюдения в диспетчере задач как одного объекта.

Модуль представляет собой файл, который содержит исполняемый код (в большинстве случаев, то есть) и загружается в процесс. Обычно в процессе есть один EXE-файл и несколько DLL-файлов, загружаемых как модули. Файлы DLL и EXE-файлы технически почти одинаковы, но EXE-файлы должны быть основой, с которой запускаются процессы, а файлы DLL предназначены для библиотек, экспортирующих определенные функции, которые могут использоваться другими модулями.Поскольку я сказал, что модули загружаются в процессы, это означает, что модуль доступен для всех потоков в процессе, и он не имеет привязки к потоку по своему усмотрению - в нашем предыдущем примере, когда второй поток загружает файл, он может быть вызван в HTTP-сетевую DLL, код которой затем будет работать во втором потоке. Существует ряд модулей, которые автоматически загружаются в каждый процесс Windows, а другие, вероятно, загружаются некоторыми функциями вашего компилятора.

ОК, так что, возвращаясь к вашему вопросу:

Вы должны были бы создавать потоки в файл длл [...]?

По сути, использование DLL не имеет ничего общего с необходимостью создания новых потоков или нет. Это зависит от того, что вы хотите сделать - если вам нужно выполнить некоторую трудоемкую задачу параллельно с любым другим кодом, тогда вам нужно будет создать для него новый поток, иначе нет необходимости.

[...] или это не сработает?

Как уже говорилось, вы можете создавать новые темы, если вы хотите (это будет работать), но это не является необходимостью приходить с помощью DLL.

После моего понимания основной поток будет работать от хост-процесса правильно?

Основной поток технологического хоста будет, конечно, в процессе хозяина. (Хотя технически нет «основного потока», так как совершенно правильно, чтобы первый поток в процессе создал второй, а затем завершался, так что только второй будет работать больше, у вас обычно есть первый поток, проходящий через весь жизненный цикл процесса, и вы, вероятно, можете назвать его «основным потоком» в этом случае.) В каком модуле находится текущий код, но будет зависеть от того, что в данный момент работает.

Позвольте мне вернуться к вопросу о «введении»: предыдущие ответы, похоже, приобрели более «нормальную» среду, в которой ваша DLL просто связана с программой и предназначена для ее загрузки. В этом случае процедура инициализации вашей DLL (которая автоматически запускается при загрузке модуля в процесс) будет запускаться только в «основном потоке», вероятно, до начала фактической работы процесса.

Однако при введении DLL вещи немного разные. Это зависит от того, как вы делаете инъекцию:

  • Если вы введете DLL, изменив таблицу импорта хоста EXE, тогда ваша DLL будет загружена «обычным» способом, который я только что сказал. Таким образом, вы можете ожидать, что ваша процедура инициализации будет запущена во время запуска процесса в основном потоке.
  • Если вы введете DLL с помощью ключа реестра AppInit_DLLs, это будет то же самое.
  • То же самое, если вы вставляете DLL, запустив процесс хоста, а затем запустив заглушку, чтобы загрузить DLL в память процессов и с помощью SetThreadContext указать указатель на нее.
  • Если впрыснуть DLL через средства удаленного вызова LoadLibrary внутри целевого процесса, используя CreateRemoteThread, то тем не менее, как следует из названия, вы создаете новый поток внутри процесса.В этой цепочке LoadLibrary загрузит вашу DLL, а также вызовет вашу процедуру инициализации, поэтому в этом случае ваша процедура инициализации действительно будет работать в новом потоке, отличном от «основного потока».
Смежные вопросы