Aug 30 2006
by Xieon


-----------------------------------------------------------------
  Grand Theft Auto: San Andreas Mission Coding Patch
-----------------------------------------------------------------

   [1]. Что это?

   Сей патч - развитие концепции, которую делал CyQ для VC 1.0
   (оставшийся топик - http://www.gtaforums.com/index.php?showtopic=217910),
   а именно: изменение большинства адресов игровой памяти прямо из main.scm,
   это могло бы стать чрезвычайно полезной вещью для GTA:SA (ведь зная адрес памяти
   можно менять все что угодно - от физики машин на лету и свойств звука/видео до 
   написания своих читов, трейнеров (скриптом), внедрения текстов, создавать
   самомодифицирующиися скрипты, делать новые опкоды и многое, многое другое).

   Как выяснилось, в "Сане" невозможно применить ту же технику, как в VC, 
   т.к. любой доступ к таблицам переходов для опкодов в памяти, даже
   если он был сделан опкодом (фича у CyQ работала через опкод 03FD), 
   вызывает ошибку Access Violation и вылет из игры. Однако, я нашел другой
   способ. Эта версия патча добавляет в игру три новых опкода - для чтения 
   адресов памяти, для записи и опкод, вызывающий WinAPIшную функцию 
   VirtualProtect, для того, чтобы работать с теми адресами, которые при чтении/записи
   вызывают вылет из игры. Эти опкоды заменяют собой опкоды-"пустышки" (NOP) 
   и ведут себя также, как любой другой игровой опкод.



   [2]. Как это работает?

   Это чистый ассемблерный код, который положен в одно из пустых мест
   в EXEшнике игры, ну и десяток новых байтов в таблицах опкодов, для "подмены" 
   старых пустых опкодов новыми.



   [3]. Инструкции по установке.

   Сначала запустите патч, и жмите на кнопку "Patch!". Прога сама сделает бэкап 
   и найдет папку с игрой автоматически, если же этого не произошло, то выберите
   папку нажатием на ".." самостоятельно.
   
   Затем откройте SASCM.INI из комплекта вашего редактора миссий (Sanny Builder или SAMB)
   и найдите следующие строки:

   00c3=0,nop
   00c4=0,nop

   Измените их на следующие:

   00c3=3,read_mem_address %1d% type %2d% value_to %3d%
   00c4=3,write_mem_address %1d% type %2d% value %3d%

   После этого найдете эту строку:

   0181=0,nop

   И поменяйте на:

   0181=3,virtual_protect_change_at %1d% size %2d% new_protect %3d%

   Все, вы получили три новых опкода :) Пример их использования:

   0181: virtual_protect_change_at 8796548 size 4 new_protect 4
   00C4: write_mem_address 8796548 type 2 value 0.002
   0181: virtual_protect_change_at 8796548 size 4 new_protect -1 

   8796548 (0x863984) - это адрес памяти в игре, где хранится значение гравитации, 
   мы умешньили его для того, чтобы прыгать по городу как на Луне :) Из-за того, что
   простое его изменение вызовет ошибку и вылет из игры, мы удалили защиту адреса
   опкодом 0181.



   [4]. Описание новых опкодов.

   00C3, 00C4:

   	Имена говорят сами за себя, от вас требуется только указать адрес (который
              можно взять с gtamodding.com или с топика по адресам на GTAForums, или же
              найденный вами), его новое значение и сколько нужно изменить (тип):

   	0  Байт 		(1 байт)
   	1  Слово		(2 байта)	
   	2  Двойное слово 	(4 байта)

  	Вы можете использовать в параметрах как переменные, так и простые числа, исключая
	случай, когда вы читаете адрес 00C3 - параметр, куда записывается значение адреса, должен
	быть переменной.

   0181:

	Этот опкод просто вызывает функцию VirtualProtect из kernel32.dll, который является 
	частью библиотеки Win32 API (кто программил - тот знает :)), потому что без него, как уже было сказано,
	изменение или даже чтение многих адресов памяти моментально влечет за собой вылет из игры.

	Вы указываете адрес, размер (в байтах) и тип новой защиты, который может быть:

   	1 	 PAGE_NOACCESS			(нет доступа)
   	2 	 PAGE_READONLY
   	4 	 PAGE_READWRITE		(доступ на чтение и запись)
   	8 	 PAGE_WRITECOPY
   	16 	 PAGE_EXECUTE		
   	32 	 PAGE_EXECUTE_READ
   	64 	 PAGE_EXECUTE_READWRITE	(доступ на чтение, запись и выполнение кода)	
   	128 	 PAGE_EXECUTE_WRITECOPY
   	256 	 PAGE_GUARD
   	512 	 PAGE_NOCACHE

	Если вы напишите -1 (как в примере), то опкод будет использовать тип последней убранной защиты.
	Вы также можете использовать переменную для этого параметра и комбинировать/указывать нужные флаги
	опкодом set_bit. 

	Используйте режим 4 (PAGE_READWRITE) когда хотите сделать какой-либо адрес памяти читаемым и записываемым.


   [5]. Конец readme.

   Я не несу ни малейшей ответственности за использование этого патча, используйте это на свой страх и риск.

   Какая-то проблема, заметка и т.д.: напишите мне на mail@sannybuilder.com

   Удачи и счастливого GTA моддинга! =)

 