#26 02-03-2007 15:00

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [SA] Выполняем ассемблерный код из main.scm

Еще один лимит в скриптинге был устранен: я смог реализовать VirtualProtect через скрипты, поэтому теперь вовсе не требуется патчить exe, для того чтобы менять некоторые адреса - теперь тоже самое можно делать через СКМ.

Сейчас думаю над оптимизацией.

Offline

#27 02-03-2007 16:47

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [SA] Выполняем ассемблерный код из main.scm

Вот полностью автономная процедура записи значения с опр. длиной (1, 2, 4 байта) по любому адресу, защищенному Virtual Protect'ом, без использования патча.
Работает на версии 1.0 US

:MemoryProofWrite
3@ == 1
jf @_____novp
4@ = -429863
&0(4@,1i) =  0xA49960
&0(4@,1i) += @_____vpsv
0052: gap 0 virtual_protect_at_address 0@ size 1@ newprotect 4 gap 0 0
0572: 1
gosub @MemoryWrite
0052: gap 0 virtual_protect_at_address 0@ size 1@ newprotect -1 gap 0 0
0572: 1
&0(4@,1i) = 0
end_thread

:_____novp
gosub @MemoryWrite
end_thread

:MemoryWrite
3@ = -429864
&0(3@,1i) =  0xA49960
&0(3@,1i) += @_____mwss
0052: gap 0 target_address 0@ size 1@ value 2@ gap 0 0
0A3D: 1
&0(3@,1i) = 0
return

:_____vpsv
hex
 68 F4 3C A4 00 83 3D 84 3C A4 00 FF
 75 08 FF 35 F4 3C A4 00 EB 06 FF 35 
 84 3C A4 00 FF 35 80 3C A4 00 FF 35 
 7C 3C A4 00 FF 15 2C 80 85 00 C3
end

:_____mwss
hex
 8B 15 7C 3C A4 00 8B 05 84 3C A4 00 
 83 3D 80 3C A4 00 01 75 03 88 02 C3 
 83 3D 80 3C A4 00 02 75 04 66 89 02 
 C3 89 02 C3
end

Это по сути поток, который выполняется однократно. При его создании передаются 4 параметра

create_thread @MemoryProofWrite address XXX size XXX value XXX VirtualProtect XXX

Все параметры те же, что и для процедуры WriteMem в хелпе к саннику.

Пример использования: меняем гравитацию через SCM /c VirtualProtect

create_thread @MemoryProofWrite address 0x00863984 size 4 value 0.002 VirtualProtect 1

Этим самым мы запишем по адресу 0x00863984 число 0.002 (пример из патча). Можно использовать переменные.



Пример 2. Убираем сообщение, которое появляется когда Карл садится в машину в первый раз /без VirtualProtect

create_thread @MemoryProofWrite address 0xC0BC15 size 1 value 1

SCM+исходник для тех, кто не понял

Last edited by Seemann (03-03-2007 10:20)

Offline

#28 04-03-2007 13:19

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: [SA] Выполняем ассемблерный код из main.scm

Круто ! Теперь надо бы написать процедуру , чтобы определять размер exe ...

Offline

#29 05-03-2007 11:42

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [SA] Выполняем ассемблерный код из main.scm

Здесь лежит доработанный поток, позволяющий записывать/читать адреса с Virtual Protect'ом. Там же есть вариант и для обеих версих игры
http://www.gtaforums.com/index.php?show … &p=4078156

Offline

#30 17-06-2009 13:33

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: [SA] Выполняем ассемблерный код из main.scm

Sanchez wrote:

Думаю никому это не надо sad

Почему же не надо?
Мне было бы очень интересно почитать, и времени свободного, вагон и маленькая тележка. smile

Offline

Board footer

Powered by FluxBB