PDA

Просмотр полной версии : [Урок] Работа с памятью сервера



Пельмень
30.01.2015, 01:05
Всем привет, в этой теме я буду вести уроки, по работе с памятью сервера sa-mp
И так, я покажу примеры работы с адресами, а также отдельно напишу их.
Для того, чтобы работать с памятью сервера, нам потребуется плагин, для работы с памятью.
Я выбрал Memory access plugin (http://forum.sa-mp.com/showthread.php?t=451381)(Link)
Но, также подойдёт и y_malloc и ему подобные, что выбрать, решать вам!
Итак, начнём.



0x0018FE50 = Кол-во слотов (DWORD)
0x004E2438 = Chatlogging (BYTE)
0x004E2430 = Stream Rate (DWORD)
0x004E242C = Stream Distance (FLOAT)
0x004E2424 = Weapon Rate (DWORD)
0x004E2420 = InCar Rate (DWORD)
0x004E241C = Onfoot Rate (DWORD)
0x0018FE54 = Порт (DWORD) Только для чтения







new Pointer:p = Pointer:0x0018FE50; //Установим указатель на адрес памяти, например, в OnGameModeInit.
MEM::set_val(p, _, 100); //Установим число в адрес памяти, т.е установим кол-во слотов на 100
p = Pointer:NULL; //Уберём указатель на адрес памяти.

Важно!
1. GetMaxPlayers() также примет значение 100.
2. Плагин sscanf и некоторые другие будут брать кол-во слотов из файла, по-этому адрес sscanf.DLL+A39C будет равен не 100, а тому числу, которое имеет maxplayers в server.cfg, однако, его также можно изменить. Хотел бы отметить, что указатель на адрес sscanf.DLL+A39C я искать не буду.




new Pointer:sr = Pointer:0x004E2430; //Установим указатель на адрес памяти, например, в OnGameModeInit.
printf ("%d", MEM::get_val(sr)); //Узнаем текущий Stream Rate





new Pointer:sd = Pointer:0x004E242C; //Установим указатель на адрес памяти, например, в OnGameModeInit.
MEM::set_val(sd, _, 800.0); //Установим Stream Distance на 800.0


Остальные - аналогично


Тема будет обновляться, если это, конечно, потребуется читателям. Жду предложения, по поводу того, какие адреса памяти нужно найти.
Btw, с каждой новой версией сервера могут обновляться и адреса памяти, будьте внимательны.
Адреса памяти представлены для версии сервера Windows 0.3z (NOT R-2,3,4)

I'm Cobra
30.01.2015, 08:44
Ну и для чего это?

Пельмень
30.01.2015, 11:43
Ну и для чего это?

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

Lars Keller
31.01.2015, 02:19
Ну, знаешь, способов применения очень много, например, теперь не придётся изменять бинарники, чтобы отредактировать данные. Возможности не ограничены лишь примерами, если что.

А чем стандартные функций не катят?

Пельмень
31.01.2015, 21:00
А чем стандартные функций не катят?

Что то я не припомню, чтобы была функция, на изменение слотов, стрим рейта и прочего.

Maranzalla
06.02.2015, 00:54
то есть покупая у хостера 20 слотов можно менять их на 100 или на любое другое значение ?

Mazzilla
06.02.2015, 15:06
то есть покупая у хостера 20 слотов можно менять их на 100 или на любое другое значение ?
Это будет равносильно тому, что вы это значение измените в server.cfg

Пельмень
09.02.2015, 22:35
то есть покупая у хостера 20 слотов можно менять их на 100 или на любое другое значение ?

Вполне, только у сервера linux будут другие адреса памяти

- - - Добавлено - - -


Это будет равносильно тому, что вы это значение измените в server.cfg

Не совсем, сервер сампа при запуске считывает из файла кол-во слотов в переменную, а хостеры лишь запрещают устанавливать это значение больше, чем заказано слотов, однако по моему примеру можно обойтись без файла, установи хоть 0 слотов : )

$continue$
25.02.2015, 01:57
Вполне, только у сервера linux будут другие адреса памяти

- - - Добавлено - - -



Не совсем, сервер сампа при запуске считывает из файла кол-во слотов в переменную, а хостеры лишь запрещают устанавливать это значение больше, чем заказано слотов, однако по моему примеру можно обойтись без файла, установи хоть 0 слотов : )

Можно указатель на память, скрытой функций SA-MP где узнается серийный номер компьютера?

L0ndl3m
25.02.2015, 19:28
Можно указатель на память, скрытой функций SA-MP где узнается серийный номер компьютера?
Зачем он Вам нужен? В нём смысла нет.

IceShock
25.02.2015, 22:11
Пельмень достань указатель на адресс слотов под линукс 0.3z-R4 (500-слотовый дистрибутив) очень прошу, или подскажи что хоть на линукс есть за штуки которыми можно адресс найти(типо читенджайна).

Пельмень
27.02.2015, 15:01
Можно указатель на память, скрытой функций SA-MP где узнается серийный номер компьютера?

Функции можно достать из того же IDA, если она будет не павн функцией, для её вызова придётся писать плагин.

- - - Добавлено - - -


Пельмень достань указатель на адресс слотов под линукс 0.3z-R4 (500-слотовый дистрибутив) очень прошу, или подскажи что хоть на линукс есть за штуки которыми можно адресс найти(типо читенджайна).

Можешь на линуксе под wine запустить чит енджин

IceShock
27.02.2015, 18:53
Функции можно достать из того же IDA, если она будет не павн функцией, для её вызова придётся писать плагин.

- - - Добавлено - - -



Можешь на линуксе под wine запустить чит енджин

Спасибо, попробую.

Daniel_Cortez
06.07.2015, 13:35
Посмотрел пример с модификацией MAX_PLAYERS и сразу назрел такой вопрос: подобные значения выровнены хотя бы на 4/8 байт в памяти сервера? Если нет, то наверняка вместе с MAX_PLAYERS будет модифицироваться что-то ещё, т.к. плагин пишет значения типа DWORD (4 байта), а MAX_PLAYERS имеет тип WORD (всего 2 байта).

Пельмень
06.07.2015, 14:16
Посмотрел пример с модификацией MAX_PLAYERS и сразу назрел такой вопрос: подобные значения выровнены хотя бы на 4/8 байт в памяти сервера? Если нет, то наверняка вместе с MAX_PLAYERS будет модифицироваться что-то ещё, т.к. плагин пишет значения типа DWORD (4 байта), а MAX_PLAYERS имеет тип WORD (всего 2 байта).

Без понятия, не вижу смысла устанавливать значение больше, чем доступно. Дело в том, что подобным способом можно заказать хост на 10 слотов, и изменить на те же 100. Но опять же, суть темы заключается в другом, в том, что с помощью плагина можно работать с памятью сервера в pawn, а это для pawn уже является слишком многим :grin:

Daniel_Cortez
06.07.2015, 16:14
Без понятия, не вижу смысла устанавливать значение больше, чем доступно.
Я и не говорил, что кто-то будет ставить значения больше 65535. Речь была о том, что значение MAX_PLAYERS находится в младших 16 битах по указанному адресу, а что находится в старших 16 - неизвестно.
Там может находиться какое-нибудь другое значение, если компилятор не выровнял его на 4 байта. И если попробовать перезаписать значение MAX_PLAYERS, то и старшие 16 бит с неизвестным значением тоже будут изменены. В плагине нельзя указать размер записываемых данных, поэтому он всё время будет записывать по 4 байта.