Указатель на область памяти

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.09.2004 (Пн) 19:13

BP писал(а):Не думаю что для подсчёта линейного адреса нужен Си. По моему это можно сделать так: Сегмент * Длина Сегмента + Смещение.

Что за бред, о каких вообще сегментах в плоской модели памяти идёт речь?
Не говоря уже о том, что в ДОС-е линейный адрес считается не так.
Мне кажется, у человека есть какой-то древний код, который он хочет перенести на Win32 посредством переписывания на Си. Что ж, флаг в руки :-)
Если серьёзно, Aleksej, ты уверен, что под Win32 вообще возможно прочитать содержимое адреса F000:0000? Уверяю тебя, это от языка не зависит.
Изображение

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 06.09.2004 (Пн) 20:02

Aleksej, адрес F000:0000 подразумевается 0f0000000h? Я правильно понял?

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 06.09.2004 (Пн) 20:52

Что за бред, о каких вообще сегментах в плоской модели памяти идёт речь?

Ну что заладил как сорока. Все уже поняли что ты знаешь это слово. Плоская - это такая модель, в которой базы всех регистров установлены в ноль, а лимиты — в 4 Гб. Хотя при чём тут я собственно? Тебе не с кем поговорить о плоской модели памяти?

Не говоря уже о том, что в ДОС-е линейный адрес считается не так.

Скорее всего ты прав. А как считается адрес?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.09.2004 (Пн) 22:11

Нет. Он всегда со мной может поговорить о плоской модели памяти :roll:
Просто он прав, вот и выражает свою т.з., раз истина пока не установлена :)
И вообще, "можно ли прочитать" - есть функции isbadreadptr и isbadwriteptr.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 06.09.2004 (Пн) 22:55

Что то я не помню что-бы я заикнулся(посмел в твоём присутствии) об использовании сегментов в Windows. Хотя в принципе Виндовс можно было бы и на сегметной модели памяти организовать. Но раз уж она плоская, то никто о них и не говорит ничего. Меня такие беспочвенные обвинения не радуют. Начинают мерещится сговоры и.т.д. и т.п.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.09.2004 (Вт) 5:15

BP писал(а):Но раз уж она плоская, то никто о них и не говорит ничего.

А перед этим, ты писал(а):Не думаю что для подсчёта линейного адреса нужен Си. По моему это можно сделать так: Сегмент * Длина Сегмента + Смещение.
Изображение

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 07.09.2004 (Вт) 8:40

Если серьёзно, Aleksej, ты уверен, что под Win32 вообще возможно прочитать содержимое адреса F000:0000?

Конечно можно. Вот объяснения:
Я взял библиотеку MemoryAccess и передал туды адрес &HF13E0 (к примеру) и эта зараза вернула 3А8113E0 (к примеру значение постоянно изменяется при каждом вызове).
И если использовать этот адрес то всё что надо возвращается. И всё это упирается в вызов функции VMMCall_MapPhysToLinear. И вся проблема в том, что в Win 2000 и Win XP запрещено работать с некоторыми участками памяти на прямую. В Win 98 такой проблемы нет и поэтому этот код работает:
Код: Выделить всё
Private Function GetBIOSDate() As String
  Dim p As Byte, MemAddr As Long, sBios As String
  Dim i As Integer
 
  MemAddr = &HF13E0
  For i = 0 To 4
      Call GetMem2(MemAddr + i, p)
      sBios = sBios & Chr$(p)
  Next i
  GetBIOSDate = sBios
End Function

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 08.09.2004 (Ср) 2:55

BP писал(а):Если не трудно, покажи в каком именно месте не работает

Exported fn(): GetMem1 - Ord:013Dh
:660F6EC6 8B442404 mov eax, dword ptr [esp+04]
:660F6ECA 8B4C2408 mov ecx, dword ptr [esp+08]
:660F6ECE 8A00 mov al, byte ptr [eax]
:660F6ED0 8801 mov byte ptr [ecx], al
:660F6ED2 33C0 xor eax, eax
:660F6ED4 C20800 ret 0008


А права доступа к сегменту? :) см. ниже.

tyomitch писал(а):
BP писал(а):Не думаю что для подсчёта линейного адреса нужен Си. По моему это можно сделать так: Сегмент * Длина Сегмента + Смещение.

Что за бред, о каких вообще сегментах в плоской модели памяти идёт речь?


:) :) :) :) :) :) :) :)

Сегменты есть ВСЕГДА. Иначе не бывает. В "плоской модели" организации памяти ВСЕГДА существует, КАК МИНИМУМ ТРИ СЕГМЕНТА: сегмент данных, сегмент кода, сегмент стека...
На самом же деле, в "плоской модели" огранизации памяти в одной программе бывает более трёх сегментов. Другой вопрос, что АДРЕСНОЕ ПРОСТРАНСТВО плоское. То есть адресация внутри этого адресного пространства сквозная. Однако, друзья мои, и тут бывают различия. Как вы думаете, если адресовать относительно ds и fs регистров в "плоской модели" организации памяти получишь одинаковый результат? Ну-ну... попробуйте на досуге, видимо, сильно удивитесь...

P.S. Когда-то сегментация была связана с ограничениями адресных возможностей процессоров. Сегодня сегментация связана с уровнем организации прав доступа к различным сегментам адресного пространства программы.
С уважением, Approximator.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 08.09.2004 (Ср) 3:11

Aleksej писал(а):
Если серьёзно, Aleksej, ты уверен, что под Win32 вообще возможно прочитать содержимое адреса F000:0000?

Конечно можно. Вот объяснения:
Я взял библиотеку MemoryAccess и передал туды адрес &HF13E0 (к примеру) и эта зараза вернула 3А8113E0 (к примеру значение постоянно изменяется при каждом вызове).
И если использовать этот адрес то всё что надо возвращается. И всё это упирается в вызов функции VMMCall_MapPhysToLinear. И вся проблема в том, что в Win 2000 и Win XP запрещено работать с некоторыми участками памяти на прямую. В Win 98 такой проблемы нет и поэтому этот код работает:
Код: Выделить всё
Private Function GetBIOSDate() As String
  Dim p As Byte, MemAddr As Long, sBios As String
  Dim i As Integer
 
  MemAddr = &HF13E0
  For i = 0 To 4
      Call GetMem2(MemAddr + i, p)
      sBios = sBios & Chr$(p)
  Next i
  GetBIOSDate = sBios
End Function


Ну, сказано же уже было: Read/WriteProcessMemory помогут полностью вылечить твою проблему.
С уважением, Approximator.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.09.2004 (Ср) 12:09

Approximator писал(а):
tyomitch писал(а):
BP писал(а):Не думаю что для подсчёта линейного адреса нужен Си. По моему это можно сделать так: Сегмент * Длина Сегмента + Смещение.

Что за бред, о каких вообще сегментах в плоской модели памяти идёт речь?


:) :) :) :) :) :) :) :)

Сегменты есть ВСЕГДА. Иначе не бывает. В "плоской модели" организации памяти ВСЕГДА существует, КАК МИНИМУМ ТРИ СЕГМЕНТА: сегмент данных, сегмент кода, сегмент стека...
На самом же деле, в "плоской модели" огранизации памяти в одной программе бывает более трёх сегментов. Другой вопрос, что АДРЕСНОЕ ПРОСТРАНСТВО плоское. То есть адресация внутри этого адресного пространства сквозная. Однако, друзья мои, и тут бывают различия. Как вы думаете, если адресовать относительно ds и fs регистров в "плоской модели" организации памяти получишь одинаковый результат? Ну-ну... попробуйте на досуге, видимо, сильно удивитесь...

P.S. Когда-то сегментация была связана с ограничениями адресных возможностей процессоров. Сегодня сегментация связана с уровнем организации прав доступа к различным сегментам адресного пространства программы.

Я знал, что кто-нибудь придерётся. Но думал, что BP, а не ты.
Есть два разных понятия - сегменты и сегментные регистры. Когда-то они были связаны, сейчас сегментов нет и поэтому связи между ними нет.
Я говорил именно про то, что запись F000:0000 не имеет смысла в Win32, потому что номер "сегмента" не задаёт место памяти, а задаёт как раз права. И следовательно, доступ по этому "адресу" не есть чтение данных БИОСа.

Approximator, про нервную систему червей я скорее всего знаю меньше тебя, но уж про систему адресации - достаточно. Не надо вести себя так некрасиво.
Изображение

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 08.09.2004 (Ср) 12:23

Ну, сказано же уже было: Read/WriteProcessMemory помогут полностью вылечить твою проблему.

А какой процесс передавать в функцию?

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 08.09.2004 (Ср) 15:32

Approximator писал(а):Ну, сказано же уже было: Read/WriteProcessMemory помогут полностью вылечить твою проблему.



Одна маленькая ремарка
на NT* платформах WriteProcessMemory на VB6 практически не реализуем.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.09.2004 (Ср) 17:23

codemaster писал(а):
Approximator писал(а):Ну, сказано же уже было: Read/WriteProcessMemory помогут полностью вылечить твою проблему.



Одна маленькая ремарка
на NT* платформах WriteProcessMemory на VB6 практически не реализуем.
Почему это?
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.09.2004 (Ср) 17:38

Дык... Права доступа.
Даже под админом не все решаемо, что уж говорить о пользователе.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.09.2004 (Ср) 18:15

Я язык-то здесь причём? Приложения на VB6 ограничены в правах? :-)
Дискриминация! :-)
Изображение

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 09.09.2004 (Чт) 1:53

tyomitch писал(а):
Approximator писал(а):
tyomitch писал(а):
BP писал(а):Не думаю что для подсчёта линейного адреса нужен Си. По моему это можно сделать так: Сегмент * Длина Сегмента + Смещение.

Что за бред, о каких вообще сегментах в плоской модели памяти идёт речь?


:) :) :) :) :) :) :) :)

Сегменты есть ВСЕГДА. Иначе не бывает. В "плоской модели" организации памяти ВСЕГДА существует, КАК МИНИМУМ ТРИ СЕГМЕНТА: сегмент данных, сегмент кода, сегмент стека...
На самом же деле, в "плоской модели" огранизации памяти в одной программе бывает более трёх сегментов. Другой вопрос, что АДРЕСНОЕ ПРОСТРАНСТВО плоское. То есть адресация внутри этого адресного пространства сквозная. Однако, друзья мои, и тут бывают различия. Как вы думаете, если адресовать относительно ds и fs регистров в "плоской модели" организации памяти получишь одинаковый результат? Ну-ну... попробуйте на досуге, видимо, сильно удивитесь...

P.S. Когда-то сегментация была связана с ограничениями адресных возможностей процессоров. Сегодня сегментация связана с уровнем организации прав доступа к различным сегментам адресного пространства программы.

Я знал, что кто-нибудь придерётся. Но думал, что BP, а не ты.
Есть два разных понятия - сегменты и сегментные регистры. Когда-то они были связаны, сейчас сегментов нет и поэтому связи между ними нет.

Ты что издеваешься? Или просто у тебя такое чувство юмора? Как нет сегментов?
IA-32 Intel Archtecture Software Developers Manual, Volume 3 писал(а):The simplest memory model for a system is the basic “flat model,” in which the operating system and application programs have access to a continuous, unsegmented address space. To the greatest extent possible, this basic flat model hides the segmentation mechanism of the architecture...
To implement a basic flat memory model with the IA-32 architecture, at least two segment descriptors must be created, one for referencing a code segment and one for referencing a data segment (see Figure 3-2). Both of these segments, however, are mapped to the entire linear
address space: that is, both segment descriptors have the same base address value of 0 and the same segment limit of 4 GBytes.

Я говорил именно про то, что запись F000:0000 не имеет смысла в Win32, потому что номер "сегмента" не задаёт место памяти, а задаёт как раз права.

Да? А что вопрос шёл только о сегментных регистрах? Вопрос не только о сегментных селекторах, но и о линейном адресе. Вот ещё одна цитата оттудаже:
IA-32 Intel Archtecture Software Developers Manual, Volume 3 писал(а):To select the various table entries, the linear address is divided into three sections:
• Page-directory entry—Bits 22 through 31 provide an offset to an entry in the page directory. The selected entry provides the base physical address of a page table.
• Page-table entry—Bits 12 through 21 of the linear address provide an offset to an entry in the selected page table. This entry provides the base physical address of a page in physical memory.
• Page offset—Bits 0 through 11 provides an offset to a physical address in the page.
Memory management software has the option of using one page directory for all programs and tasks, one page directory for each task, or some combination of the two.

Так, что BP был на правильном пути, при составлении своей формулы. Конечно ошибся, но ведь не в том, что нет сегментов, а лишь в способе вычисления физического адреса. Так?


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

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

Извини, если обидел. Не со зла, я :) Мир?
С уважением, Approximator.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 09.09.2004 (Чт) 4:25

codemaster писал(а):
Approximator писал(а):Ну, сказано же уже было: Read/WriteProcessMemory помогут полностью вылечить твою проблему.



Одна маленькая ремарка
на NT* платформах WriteProcessMemory на VB6 практически не реализуем.


Ну, это уж полная ерунда. :) Ведь Read/WriteProcessMemory по сути используют функции экспортируемые из ntdll.dll.
С уважением, Approximator.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 09.09.2004 (Чт) 4:35

alibek писал(а):Дык... Права доступа.
Даже под админом не все решаемо, что уж говорить о пользователе.


Права доступа можно получить, как через OpenProcess, так и через другие :) места. Ведь даже работая из приложения можно передать управление на "ядерную функцию" (на самом деле собрать native dll с такими правами - ерунда) и уже оттуда сделать всякие "бяки". Кстати, как по-твоему работают функции Read/WriteProcessMemory? Особливо, когда в качестве указателя на процесс передаётся банальная -1 (:) именно это значение возвращает функция GetCurrentProcess :))? Что именно делается в этом случае в этих функциях? Ведь (!) запись из них можно вести сразу (всё-таки kernel). Проверяют они права. Если же обращаться напрямую к ядерным функциям из ntdll.dll, тогда можно записывать всё, что хочешь, хоть по диагонали...
С уважением, Approximator.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.09.2004 (Чт) 9:08

Approximator, после того, как мне один товарисч подарил одну книжку :) я тебе скажу, что все зависит от того, какой уровень доступа был изначально проставлен. Если грамотно проставить ACL, то до процесса тебе не достучаться.
Некоторые права доступа можно получить "нечестным" способом, потому что у админа есть несколько привелегий, которые позволяют ему использовать эти способы. Если программа запускается под учетной записью пользователя на машине, где безопасность настроена грамотно, ничего ты сделать не сможешь.
Lasciate ogni speranza, voi ch'entrate.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 09.09.2004 (Чт) 10:54

Approximator писал(а):Права доступа можно получить, как через OpenProcess, так и через другие :) места. Ведь даже работая из приложения можно передать управление на "ядерную функцию" (на самом деле собрать native dll с такими правами - ерунда) и уже оттуда сделать всякие "бяки". Кстати, как по-твоему работают функции Read/WriteProcessMemory? Особливо, когда в качестве указателя на процесс передаётся банальная -1 (:) именно это значение возвращает функция GetCurrentProcess :))? Что именно делается в этом случае в этих функциях? Ведь (!) запись из них можно вести сразу (всё-таки kernel). Проверяют они права. Если же обращаться напрямую к ядерным функциям из ntdll.dll, тогда можно записывать всё, что хочешь, хоть по диагонали...


To:Approximator

Ты хоть малость предсавляеш себе о чем идет речь
(я о памяти чужого процесса )?

Судя по твоему упорству и постам нет.
Почитай книжку по архитектуре NT*
особенно раздел касающийся менеджера mem. RING и пр.

Рекомендую также посмотреть как работает антивирусник
при сканировании памяти - очень поучительный пример.
Кстати на сайтах посвященных Vir scene полно описаний как это обойти *8)

А тебя почитать так и прямо подумаешь:
" Новый продукт от M$ теперь Вы можно читать и писать в mem
любого процесса на Ваш выбор. Секретность и Стабильность по вкусу !"
:lol: :lol:

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 09.09.2004 (Чт) 11:39

Так вопрос остался открытий. Можно из VB считать данные из адреса F000:xxxx или линейного адреса &HFxxx? Или эта проблема решаема только на С++ или на асме?

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 09.09.2004 (Чт) 12:48

Если гооврить по твоей теме: работа с SMBIOS
то на NT это в принципе не возможно

В NT общение с устройствами ведется через Driver устройства.

Примеров написания Drv предостаточно на сайте MS
(к сожалению не на VB :wink: :wink: )

Кстати в WMI есть Win32_VoltageProbe и Темperature_probe этого разве не достаточно?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.09.2004 (Чт) 14:14

Approximator, мы с тобой друг друга не поняли.
У слова "сегмент" очень много значений. Я шёл от изначального - "отрезок, обрезок".
В реальном режиме сегмент соответствует именно отрезку памяти.
В huge модели - у сегмента появляются права, но он по-прежнему соответствует отрезку памяти.
В плоской модели сегмент(ы) занимают всю память, и поэтому говорить о них как об отрезках не имеет смысла. Можно назвать весь круг - круговым сегментом с раствором 360°, но это лишено смысла.
В этом понимании - сегментов как отрезков памяти - сегментов в плоской модели действительно нет. Я думаю, ты согласишься, что не может быть сегментов без сегментации, а даже в твоей же цитате сказано: "The simplest memory model for a system is the basic “flat model,” in which the operating system and application programs have access to a continuous, unsegmented address space."
"Сегмент" в Win32 остался только как воплощение прав доступа к памяти; именно в этом смысле я говорил, что сегментов нет.
В реальном режиме адрес F000:0000 укзывает на данные BIOS-а. В защищённом - селектор F000 может указывать куда угодно, а скорее всего его нет вообще. Получить доступ по нему, если и возможно, ни на йоту не приближает Andrej к чтению данных BIOS-а. Согласен?
Я говорил не о том, что адресу F000:0000 BP неправильно сопоставил физический, а о том, что он наводит Andrej на совершенно неправильный путь. Его задача няп - не прочитать данные по адресу F000:0000, а прочитать данные BIOS-а. Согласен?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.09.2004 (Чт) 17:26

alibek писал(а):Approximator, после того, как мне один товарисч подарил одну книжку :)


alibek, это случаем не та книжка, которую и мне подарил один товарищ? :D
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.09.2004 (Чт) 17:32

GSerg, она самая :)
Lasciate ogni speranza, voi ch'entrate.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 10.09.2004 (Пт) 1:58

alibek писал(а):Approximator, после того, как мне один товарисч подарил одну книжку :) я тебе скажу, что все зависит от того, какой уровень доступа был изначально проставлен. Если грамотно проставить ACL, то до процесса тебе не достучаться.
Некоторые права доступа можно получить "нечестным" способом, потому что у админа есть несколько привелегий, которые позволяют ему использовать эти способы. Если программа запускается под учетной записью пользователя на машине, где безопасность настроена грамотно, ничего ты сделать не сможешь.
Если у пользователя нет возможности запускать свои приложения тогда, да. Но это уже не "правильно настроенная безопасность", а распятие пользователя... Если же пользователь хотя бы может запускать СВОИ приложения, то получить "права доступа" не есть проблема. При обращении к функциям kernel32 мы всегда переходим в другой уровень привелегий. Просто вызываемые функции проверяют права доступа и "если что" отказывают. Права доступа к памяти сами "ядерные функции" "открывают" себе через NtProtectVirtualMemory. Сама функция NtProtectVirtualMemory НИКОГДА НЕ ПРОВЕРЯЕТ КТО ИМЕННО К НЕЙ ОБРАЩАЕТСЯ. Это же относится и к функции NtWriteVirtualMemory. Так, что у тебя сильно преувеличенное мнение о возможностях "настраиваемой безопасности".
С уважением, Approximator.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 10.09.2004 (Пт) 2:07

codemaster писал(а):
Approximator писал(а):Права доступа можно получить, как через OpenProcess, так и через другие :) места. Ведь даже работая из приложения можно передать управление на "ядерную функцию" (на самом деле собрать native dll с такими правами - ерунда) и уже оттуда сделать всякие "бяки". Кстати, как по-твоему работают функции Read/WriteProcessMemory? Особливо, когда в качестве указателя на процесс передаётся банальная -1 (:) именно это значение возвращает функция GetCurrentProcess :))? Что именно делается в этом случае в этих функциях? Ведь (!) запись из них можно вести сразу (всё-таки kernel). Проверяют они права. Если же обращаться напрямую к ядерным функциям из ntdll.dll, тогда можно записывать всё, что хочешь, хоть по диагонали...


To:Approximator

Ты хоть малость предсавляеш себе о чем идет речь
(я о памяти чужого процесса )?

Судя по твоему упорству и постам нет.
Почитай книжку по архитектуре NT*
особенно раздел касающийся менеджера mem. RING и пр.

Рекомендую также посмотреть как работает антивирусник
при сканировании памяти - очень поучительный пример.
Кстати на сайтах посвященных Vir scene полно описаний как это обойти *8)

А тебя почитать так и прямо подумаешь:
" Новый продукт от M$ теперь Вы можно читать и писать в mem
любого процесса на Ваш выбор. Секретность и Стабильность по вкусу !"
:lol: :lol:


Можно. Для этого не обязательно меня читать. Но голову иметь нужно. Ладно, здесь не ликбез для крякеров. Просто я тебе, дАрАгОй, скажу, что пилювал я на операционную систему. Нет такой системы, котроая могла бы, что-то запретить сама по себе (если она ХОТЯ БЫ вообще разрешает в ней работать). Есть процессоры и их способы защиты. Так вот:
Call Gates
Call gates facilitate controlled transfers of program control between different privilege levels. They are typically used only in operating systems or executives that use the privilege-level protection mechanism.
С уважением, Approximator.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 10.09.2004 (Пт) 2:21

tyomitch писал(а):Approximator, мы с тобой друг друга не поняли.
У слова "сегмент" очень много значений.

:)
Я шёл от изначального - "отрезок, обрезок".

И я тоже.
В реальном режиме сегмент соответствует именно отрезку памяти.
В huge модели - у сегмента появляются права, но он по-прежнему соответствует отрезку памяти.
В плоской модели сегмент(ы) занимают всю память, и поэтому говорить о них как об отрезках не имеет смысла. Можно назвать весь круг - круговым сегментом с раствором 360°, но это лишено смысла.
В этом понимании - сегментов как отрезков памяти - сегментов в плоской модели действительно нет. Я думаю, ты согласишься, что не может быть сегментов без сегментации, а даже в твоей же цитате сказано: "The simplest memory model for a system is the basic “flat model,” in which the operating system and application programs have access to a continuous, unsegmented address space."

:) А нафига тогда DT, TSS и проч.? :) Там ведь не только ПРАВА, но и физические адреса для сегментов. Что же иначе такое сегментный селектор?
"Сегмент" в Win32 остался только как воплощение прав доступа к памяти; именно в этом смысле я говорил, что сегментов нет.

См. выше.
В реальном режиме адрес F000:0000 укзывает на данные BIOS-а. В защищённом - селектор F000 может указывать куда угодно, а скорее всего его нет вообще. Получить доступ по нему, если и возможно, ни на йоту не приближает Andrej к чтению данных BIOS-а. Согласен?
Я говорил не о том, что адресу F000:0000 BP неправильно сопоставил физический, а о том, что он наводит Andrej на совершенно неправильный путь. Его задача няп - не прочитать данные по адресу F000:0000, а прочитать данные BIOS-а. Согласен?

Согласен. Видимо форма твоего ответа меня сбила с толку.
С уважением, Approximator.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 10.09.2004 (Пт) 10:27

Approximator, вообще-то права доступа себе никакая программа/процесс не может (исключая случаи багов в самой ОС). Программа может получить определенную привилегию (например, SE_TCB_PRIVILEGE) только если политиками безопасности эта привилегия разрешена тому аккаунту, в контексте которого выполняется процесс. Если же у аккаунта нет возможности воспользоваться рядом "специальных" привилегий, то соответственно и у процесса никаких возможностей.
Видимо ты на своей машине локальный администратор, а ограничение пользователей поставлено недостаточно жестко. В грамотно сконфигурированной системе возможностей поднять свои привилегии нет.
Lasciate ogni speranza, voi ch'entrate.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 10.09.2004 (Пт) 11:32

Approximator писал(а):Можно. Для этого не обязательно меня читать. Но голову иметь нужно. Ладно, здесь не ликбез для крякеров. Просто я тебе, дАрАгОй, скажу, что пилювал я на операционную систему. Нет такой системы, котроая могла бы, что-то запретить сама по себе (если она ХОТЯ БЫ вообще разрешает в ней работать). Есть процессоры и их способы защиты. Так вот:
Call Gates
Call gates facilitate controlled transfers of program control between different privilege levels. They are typically used only in operating systems or executives that use the privilege-level protection mechanism.


Самому не смешно?
Давай поступим так: ты этого не писал мы "это" не читали :wink: :wink:

Для повышения занний по NT* попробуй почитать вот эту книгу

http://www.ozon.ru/context/detail/id/116525/#vote

Вообще все книги у Рихтера заслуживают внимание
но эта особенно

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 1

    TopList