Вызов функции из удаленного процесса с использованием внедренной DLL

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

Что я имею на минуту:
DLL, внедренная в целевой процесс, отображающая окно сообщения и играющая в математике.

Что я хочу в будущем:
DLL, которая может манипулировать и играть с внутренностями целевого процесса.

Следующим шагом к достижению желаемой манипуляции является вызов метода в удаленном потоке внутри процесса, в который я внедряю.

Давайте возьмем пример:
У меня есть приложение C ++, которое имеет int main, скажем, это выглядит так:

int PrintText(string text)
{
cout << text;
return 1;
}

int main()
{
while (true)
{
PrintText("From the DLL");
}
}

Хорошо, это прекрасно, мое целевое приложение в настоящее время печатает некоторый текст, и, кажется, делает это очень счастливо. Он рассылает спам с невероятной скоростью, но я могу замедлить его, используя потоки, спящий режим и т. Д., Если нужно. Дело в том, что это не проблема, код здесь не был скомпилирован или протестирован, и я не собираюсь использовать этот точный код. Я на самом деле работаю с игрой.

Теперь, допустим, я создаю указатель на метод PrintText и знаю его адрес в этом процессе. Как мне называть это внешне, передавая аргументы?

Локально, я думаю, это будет выглядеть примерно так:

int i;
int (*PrintSomeText)(string) = PrintText;

Затем я мог бы вызвать эту функцию, используя ссылку, например, так:

i = operation("Text to be printed", PrintSomeText);

По моей теории это должно объявить целое число с именем i, затем определить указатель на метод, который возвращает int, принимает в качестве параметра одну строку, и указатель сохраняет значение указателя, которое было в PrintText. (Или что-то в этом роде).

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

Назад, так что теперь я хочу продолжить немного дальше и сделать следующий шаг. Допустим, я знаю, что метод находится по адресу 100 в целевом процессе (десятичный, я, скорее всего, сделаю это в шестнадцатеричном формате, так как я использую CheatEngine / OllyDBG, чтобы найти методы в целевом процессе, но для этого примера мы останусь простым).

Я предполагаю, что моя внедренная DLL полностью получает свое собственное пространство, имеет ли она более высокий доступ к целевому процессу? Как я могу это выяснить?

Спасибо за ваше время,
мистифицировать

Редактировать: небольшая заметка, я просматриваю учебник по C ++, и он доказал свою полезность. Я заметил, что забыл включить свой метод работы, поэтому извинения за это не хватает. Если это необходимо, дайте мне знать. Спасибо!

Edit nr 2: я только что сделал некоторый компилируемый код, чтобы проверить это, так как я написал большую часть свободного чтения из книги без IDE, и IDE наконец-то сконфигурировалась, так что вот код, который я сейчас выполняю работать с

#include "stdafx.h"#include <iostream>

using namespace std;

int PrintText(char * Text)
{
cout << Text << endl;
return 1;
}

int _tmain(int argc, _TCHAR* argv[])
{
int (*Print)(char*) = PrintText;
char Text[] = "Hello, world!";
PrintText(Text);
int x = (*Print)("Oh my word, it really works!");
cin.get();
return 0;
}

Заметьте, я еще не запускал его бесконечно, так что, извините, я добавлю его в ближайшее время.

3

Решение

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

  1. Найдите метод в памяти. Для этого я сначала отключил ASLR (рандомизация размещения адресного пространства), затем создал указатель на мой метод локально в целевой программе, прежде чем использовать iostream для вывода указателя на экран, теперь я знаю адрес метода.

  2. Создайте typedef в dll для внедрения. Это то, где я застрял, но я знаю некоторых парней, которые делают это довольно часто, поэтому мне удалось вытащить это из них. В моем случае вот так выглядит typedef:

    typedef int __printPrototype(char* text);
    
  3. Привязать адрес метода в целевом приложении к его воспроизведению во введенной dll:

    int (*Print)(char*);
    Print = (__printPrototype*)0x0041121C;
    Print("I'm injecting myself into you.");
    

Отлично!

Спасибо dauphic и хорошему другу по имени DarkstaR.

5

Другие решения

Других решений пока нет …