Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Самомодифицирующийся код [D6, Win95/98, WinME, NT4, Win2k, WinXP]


Страницы:   1 2

Александр К ©   (2003-02-01 23:06:00) 

Есть ли способ изменения кода приложения и нормально работающий под Windows 95/98/Me/NT/2000/XP?
Спасибо!


Ice   (2003-02-03 01:07:00) [21]


> Alex Konshin © (02.02.03 00:22)


> Nick_N_A © (02.02.03 06:17)

Mда...

На самом деле – есть по крайней мере два легальных способа изменения кода приложений, вполне доступных гостевому пользователю и нормально работающих под Windows 95/98/Me/ NT/2000/XP.

Во-первых, kernel32.dll экспортирует функцию WriteProcessMemory, прямо предназначенную для модификации памяти процесса.

Во-вторых, практически все ОС (включая Windows и Linux) разрешают выполнение и модификацию кода, размещенного в стеке.

В принципе, можно создать самомодифицирующийся код исключительно средствами языков высокого уровня - таких как С++, Delphi - без применения ассемблера.

Для адресации 4 ГБ виртуальной памяти, выделенной в распоряжение процесса, Windows использует два селектора; один загружается в сегментный регистр CS, а другой – в регистры DS, ES и SS. Оба селектора ссылаются на один и тот же базовый адрес памяти (равный нулю), и имеют лимит в 4 ГБ. (Замечание: кроме перечисленных, Windows использует еще и регистр FS, в который загружает селектор сегмента, содержащего информационный блок потока).Фактически существует всего один сегмент, вмещающий в себя и код, и данные, и стек процесса. Благодаря этому передача управления коду, расположенному в стеке, осуществляется близким (near) вызовом или переходом, и для доступа к содержимому стека использование префикса "SS" совершенно необязательно. Несмотря на то, что значение регистра CS не равно значению регистров DS, ES и SS, команды MOV dest,CS:[src]; MOV dest,DS:[src] и MOV dest,SS:[src] в действительности обращаются к одной и той же ячейке памяти. Отличия между регионами кода, стека и данных заключаются в атрибутах принадлежащих им страниц: страницы кода допускают чтение и исполнение, страницы данных – чтение и запись, а стека – чтение, запись и исполнение одновременно.
Помимо этого, каждая страница имеет специальный флаг, определяющий уровень привилегий, необходимых для доступа к этой странице. Некоторые страницы – например, те, что принадлежат ОС, требуют наличия прав супервизора, которыми обладает только код нулевого кольца. Прикладные программы, исполняющиеся в кольце 3, таких прав не имеют, и при попытке обращения к защищенной странице вызывают исключение. Манипулировать атрибутами страниц, равно как и ассоциировать страницы с линейными адресами, может только операционная система (или код, исполняющийся в нулевом кольце), но, старая песня про маздай продолжается. Судя по всему кроме кернела и кодовых секций программ не предполагалось защищать вообще ничего. Таким образом ВО ВСЕХWindows можно произвести запись В ЛЮБОЕместо памяти не переходя для этого в нулевое кольцо.
Замечание: среди начинающих программистов ходит совершенно нелепая байка о том, что, дескать, если обратится к коду программы командой, предваренной префиксом DS, Windows якобы беспрепятственно позволит его изменить. На самом деле это ерунда; обратиться-то она позволит, а вот изменить – нет, каким бы способом ни происходило обращение, т.к., защита работает на уровне физических страниц, а не логических адресов.


Alex Konshin   (2003-02-02 06:43:00) [22]

2Nick_N_A: А ты попробуй это под NT.


Nick_N_A   (2003-02-02 06:17:00) [23]

ССылками, и поинтерами пользыватся умеем - вперед,
делфя линкует процедуры последовательно

Procedure A;
Begin
end;
Procedure B;
Begin
end;

Type TAByte=array[0..$FFFFFFFF] of byte;
proca:pointer;
size:integer;

size:=integer(@B)-integer(@A);
proca:=GetMemory(size);
move((@A)^,proca^,size);
теперь прога А находится в TAByte(proca^)
зная ассемблер ее можно подкорректировать


Alex Konshin   (2003-02-02 00:22:00) [24]

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/virtualprotect.asp


Александр К   (2003-02-01 23:49:00) [25]

Под MS-DOS широко использовался самомодифицирующийся код, без которого не обходилась практически ни одна мало-мальски серьезная защита. Хотелось бы узнать как это можно сделать в Windows.


Alex Konshin   (2003-02-01 23:10:00) [26]

Есть, но зачем?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо