когда чтение и запись в память разрешены? - PullRequest
6 голосов
/ 07 февраля 2012

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

Сегодня в школе я узнал, что когда процесс (программа) выполняется, операционные системы дают ему место в памяти. Возьмем для примера две программы:

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, в которой эта программа позволяет вам получать ручки (указатели) элементов управления в окнах. Например, я мог видеть дескриптор элемента управления окна, перетаскивая инструмент поиска к элементу управления, который мне нужен для получения информации:

enter image description here

На этой картинке я перетаскиваю инструмент поиска в элемент управления вводом калькулятора. Я мог бы также перетащить его на кнопку 7, например.

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


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

Шаг 1) Получить указатель на любое окно с информацией об окне autoit

Шаг 2) На моем компьютере этот указатель:

enter image description here

Это окно 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));

тогда я отправлю это окно обратно


Я публикую несколько примеров, чтобы проиллюстрировать свою точку зрения. Но мой вопрос: когда вам разрешен доступ к другим частям памяти? Если я сделаю свою переменную общедоступной, другие программы смогут получить к ней доступ? Почему я могу получить доступ к некоторым элементам управления окнами из моей собственной программы?

1 Ответ

5 голосов
/ 07 февраля 2012

Вы путаете "Ручки" и "Указатели".Просто потому, что это выглядит как адрес, это не так.В Windows используется множество дескрипторов, и ОС может позволить вам что-то делать с дескрипторами, даже если вы их не создавали.Вы можете представить дескриптор как IntPtr, но если бы вы фактически обращались с ним напрямую как с указателем, вы бы (вероятно) потерпели крах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...