![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Самомодифицирующийся код [D6, Win95/98, WinME, NT4, Win2k, WinXP]
Александр К © (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]Есть, но зачем?