Я видел похожий, но все же другой вопрос к этому, так что просто чтобы уточнить, это не обман 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;
}
Заметьте, я еще не запускал его бесконечно, так что, извините, я добавлю его в ближайшее время.
Дауфика в значительной степени ударили, я имею полный контроль, как дико хотелось бы, на целевой процесс. Итак, вот что я делаю, чтобы вызвать метод целевых процессов (для любого будущего интереса читателей):
Найдите метод в памяти. Для этого я сначала отключил ASLR (рандомизация размещения адресного пространства), затем создал указатель на мой метод локально в целевой программе, прежде чем использовать iostream для вывода указателя на экран, теперь я знаю адрес метода.
Создайте typedef в dll для внедрения. Это то, где я застрял, но я знаю некоторых парней, которые делают это довольно часто, поэтому мне удалось вытащить это из них. В моем случае вот так выглядит typedef:
typedef int __printPrototype(char* text);
Привязать адрес метода в целевом приложении к его воспроизведению во введенной dll:
int (*Print)(char*);
Print = (__printPrototype*)0x0041121C;
Print("I'm injecting myself into you.");
Отлично!
Спасибо dauphic и хорошему другу по имени DarkstaR.
Других решений пока нет …