Пожалуйста, поправьте меня, если я ошибаюсь. Я задаю этот вопрос, чтобы уточнить некоторые мои идеи.
Сегодня в школе я узнал, что когда процесс (программа) выполняется, операционные системы дают ему место в памяти. Возьмем для примера две программы:
Program1:
static void Main(string[] args)
{
unsafe // in debug options on the properties enable unsafe code
{
int a = 2;
int* pointer_1 = &a; // create pointer1 to point to the address of variable a
// breakpoint in here !!!!!!!!!!!!!!!!!
// in the debug I should be able to see the address of pointer1. Copy it and
// type it in the console
string hexValue = Console.ReadLine();
// convert the hex value to base 10
int decValue = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
// create a new pointer that point to the address that I typed in the console
IntPtr pointer_2 = new IntPtr(decValue);
Console.WriteLine("The address of a: {0} Value {1}", ((int)&a), a);
try
{
Console.WriteLine("The address of {0} points to value {1}", (int)&pointer_1, (int)pointer_2);
// different approach of acomplishing the same
Console.WriteLine(Marshal.ReadInt32(pointer_2));
}
catch
{
Console.WriteLine(@"you are supposed to be debuging this program.");
}
}
Программа 2
static void Main(string[] args)
{
unsafe
{
IntPtr pointer_0 = new IntPtr(95151860); // see address of variable from program1
int* pointer_1 = (int*)pointer_0;
// try to access program's 1 object
Console.WriteLine("addrees of {0} points to value {1} ", (int)&pointer_1, *pointer_1);
}
}
Так что я понимаю, что в программе 2 я получу ошибку. Я буду получать доступ к ограниченной памяти. Пока то, что я узнал, имеет смысл.
Хорошо, знайте, что здесь вещи не имеют смысла.
Существует очень хорошая программа под названием AutoIt , используемая для автоматизации задач. Например, он может отправлять щелчки мыши, перемещать мышь, отправлять нажатия клавиш и т. Д.
В любом случае autoit поставляется с программой AutoIt Window Info, в которой эта программа позволяет вам получать ручки (указатели) элементов управления в окнах. Например, я мог видеть дескриптор элемента управления окна, перетаскивая инструмент поиска к элементу управления, который мне нужен для получения информации:
На этой картинке я перетаскиваю инструмент поиска в элемент управления вводом калькулятора. Я мог бы также перетащить его на кнопку 7, например.
Так что, если вы видите на картинке, у меня теперь есть адрес этого элемента управления. После этого я смогу получить к нему доступ из своей программы !!
Еще один пример того, как вы можете получить доступ к памяти, которая не принадлежит моей программе
Шаг 1) Получить указатель на любое окно с информацией об окне autoit
Шаг 2) На моем компьютере этот указатель:
Это окно Google Chrome, где я набираю этот вопрос.
Этот класс отправит окно назад:
public static class SendWndToBack
{
[DllImport("user32.dll")]
static extern bool SetWindowPos(
IntPtr hWnd,
IntPtr hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
uint uFlags);
const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;
const UInt32 SWP_NOACTIVATE = 0x0010;
static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
static readonly IntPtr k = new IntPtr(12);
public static void WindowHandle(IntPtr windowHandle)
{
SetWindowPos(windowHandle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
}
}
и затем, если я вызову метод с помощью poniter, который я только что получил с помощью autoit, и вызову его как:
SendWndToBack.WindowHandle(new IntPtr(0x00000000000510B2));
тогда я отправлю это окно обратно
Я публикую несколько примеров, чтобы проиллюстрировать свою точку зрения. Но мой вопрос: когда вам разрешен доступ к другим частям памяти? Если я сделаю свою переменную общедоступной, другие программы смогут получить к ней доступ? Почему я могу получить доступ к некоторым элементам управления окнами из моей собственной программы?