Вызов функции из удаленного процесса с помощью внедренной 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 полностью получает собственное пространство, имеет ли она более высокий доступ к целевому процессу? Как я могу это узнать?

Спасибо за ваше время, Джош

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

Редактировать № 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;
}

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


person XtrmJosh    schedule 05.11.2013    source источник
comment
Ваша внедренная DLL имеет полный доступ к процессу, в который она была внедрена.   -  person Collin Dauphinee    schedule 06.11.2013
comment
Не могли бы вы дать мне более четкое определение, пожалуйста? Извините, что... Не знаю, что я такое, может, нуб? Но в данном случае мне нужен скорее толчок, чем толчок. Могу ли я просто указать указатель на адрес? Я предполагаю, что мне нужно добавить базовый адрес целевого модуля и добавить к нему адрес метода, который я получаю, чтобы вызвать метод? Спасибо, кстати, вы меня хоть как-то вдохновили на продолжение!   -  person XtrmJosh    schedule 06.11.2013


Ответы (1)


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

  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.

person XtrmJosh    schedule 06.11.2013