Русское сообщество по скриптингу

Работа с памятью

Все вопросы по скриптингу для Metamod, помощь в редактировании плагинов.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для
Metamod.


Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [pawn], в противном случае, если тег [pawn] не отображает ваш код, можно использовать тег [code].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник плагина.

Работа с памятью

Сообщение Alexander.3 » 07 фев 2013, 18:22

Всем привет.
Очень любопытно и интересно стало изучить работу с памятью. Сразу предупреждаю - извращаюсь пару дней, если выражаюсь не правильно/грамотно, прошу прощения.

Для начала я бы хотел показать пример, как я посылаю функции...

Шаг 1. ( Поиск функции )
1.1
Для примера и обучения, я решил взять не сложную функцию и попробовать послать мессгу по центру.
Я знал, что через данную структуру отправляются такие сообщения как RoundEnd.
Начнем же сам поиск функции:
CTRL+F и ищем "World triggered \"Round_End\"\n"


1.2.
Далее пролистаем в начало шаблона данной функции. Мы видим, что сообщение через которое отправлено, будет возвращено в sub_10093C70


1.3.
Теперь когда я знаю какого тело функции мы используем, найдем его указатели.
Жмем CTRL+F и ищем sub_10093C70
Находим:

В данном случае это int значение. Нужно знать это для будущих операций.
Arg1 - Это будет наше сообщение
Arg2 - Это список эвентов ( сам не разобрался для чего и как их использовать )
[spoiler]
Код: Выделить всё
#define Target_Bombed                       1
#define VIP_Escaped                         2
#define VIP_Assassinated                    3
#define Terrorists_Escaped                  4
#define CTs_PreventEscape                   5
#define Escaping_Terrorists_Neutralized     6
#define Bomb_Defused                        7
#define CTs_Win                             8
#define Terrorists_Win                      9
#define Round_Draw                          10
#define All_Hostages_Rescued                11
#define Target_Saved                        12
#define Hostages_Not_Rescued                13
#define Terrorists_Not_Escaped              14
#define VIP_Not_Escaped                     15
[/spoiler]

Шаг 2
: ( Теперь приступим к нашему первому C++ коду )
Получаем оффсету:
sub_10093C70 = 093C70 = 0x093C70


Полный код:
[spoiler][pawn]
  1. #include "amxxmodule.h"

  2.  

  3. void *base;

  4. void Message(char *Message);

  5.  

  6. void FN_ClientCommand(edict_t *pEntity) {

  7.     const char* cmd = CMD_ARGV(0);

  8.  

  9.     if (strcmp(cmd, "test")  == 0) {

  10.        

  11.         Message("Alexander.3 watching you");

  12.    

  13.         RETURN_META(MRES_SUPERCEDE);

  14.     }

  15.     RETURN_META(MRES_IGNORED);

  16. }  

  17.  

  18. int DispatchSpawn( edict_t *pEdict ) {

  19.     base = GetModuleHandleA("mp.dll");

  20.     return 0;

  21. }

  22.  

  23. void Message(char *Message) {

  24.     typedef void (*FN_Msg)(int v);

  25.     FN_Msg MessageCenter = (FN_Msg)((DWORD)base + 0x093C70);

  26.     MessageCenter((int)Message);

  27. }  
[/pawn][/spoiler]

Результат:
[spoiler][/spoiler]

Вроде работает...

Теперь у меня нарастают такие вопросы...
-- Как блокировать функцию, тело фукнции.
-- Как люди пишут свои "патчи", как узнать какой адрес вставить?
-- Как вообще подменить/вставить свой адрес и заблокировать текущий?
-- Для чего нужен второй аргумент и как его используют?

Далее хотел бы для примера заблокировать сообщение в чат, но для начала нужно узнать как не имитировать сообщения, отправляя их через функцию, зная адрес. а как отловить и блокнуть их.
Аватара пользователя
Alexander.3
 
Сообщения: 19
Зарегистрирован: 05 фев 2010, 21:12
Откуда: Волжский
Благодарил (а): 17 раз.
Поблагодарили: 4 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Работа с памятью

Сообщение Fedcomp » 07 фев 2013, 18:26

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


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: Работа с памятью

Сообщение Alexander.3 » 07 фев 2013, 18:40

Да, действительно .so проще. DJ_WEST даже описывал это.
Однако проблема не в получении адреса.. интересно как его заблочить/заменить и как вообще составить самому патч. Как всё это делают? Хотя бы не большое понятие иметь.
Аватара пользователя
Alexander.3
 
Сообщения: 19
Зарегистрирован: 05 фев 2010, 21:12
Откуда: Волжский
Благодарил (а): 17 раз.
Поблагодарили: 4 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Работа с памятью

Сообщение 6a6kin » 07 фев 2013, 19:31

Alexander.3, Вы должны зарегистрироваться, чтобы видеть ссылки.

Чтобы отловить функцию, нужно вместо первой микрокоманды отлавливаемой функции вставить безусловный переход на нашу функцию, которая будет принимать решение: заблокировать отлавливаемую функцию или нет.

Обычно поиск функции идёт по сигнатуре или имени(в случае linux библиотек).

Вы должны зарегистрироваться, чтобы видеть ссылки. ... ngFunc.cpp
Вот ссылка на файл, как я сделал это когда-то. Там основные функции CreateFunctionHook, SetHook, UnsetHook. В исходных файлах с названиями функций (вроде fSV_ConnectClient.cpp), непосредственно описание самих функций, с помощью специальной структуры, а также функция-блокировщик.
На заказ не пишу.
Аватара пользователя
6a6kin
Скриптер
 
Сообщения: 332
Зарегистрирован: 09 мар 2010, 16:40
Благодарил (а): 38 раз.
Поблагодарили: 278 раз.

Re: Работа с памятью

Сообщение Fedcomp » 07 фев 2013, 19:36

опа, за флудблокер сурсы благодарю.
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: Работа с памятью

Сообщение Bos93 » 07 фев 2013, 19:51

Fedcomp писал(а):опа, за флудблокер сурсы благодарю.

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

Nosce animum tuum.

А осознание и есть, что понял и осмыслил..
А коль не думал ты о том, то кто о том замыслил..?
Аватара пользователя
Bos93
 
Сообщения: 1425
Зарегистрирован: 03 апр 2010, 13:44
Благодарил (а): 149 раз.
Поблагодарили: 514 раз.

Re: Работа с памятью

Сообщение 6a6kin » 07 фев 2013, 20:06

Вообще, переделать бы там всё))
На заказ не пишу.
Аватара пользователя
6a6kin
Скриптер
 
Сообщения: 332
Зарегистрирован: 09 мар 2010, 16:40
Благодарил (а): 38 раз.
Поблагодарили: 278 раз.

Re: Работа с памятью

Сообщение Alexander.3 » 07 фев 2013, 20:09

Может быть я не внимательно прочитал, но откуда эти заветные числа взять? =)
func->patch[0]=0xE9;
Аватара пользователя
Alexander.3
 
Сообщения: 19
Зарегистрирован: 05 фев 2010, 21:12
Откуда: Волжский
Благодарил (а): 17 раз.
Поблагодарили: 4 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Работа с памятью

Сообщение Bos93 » 07 фев 2013, 20:16

6a6kin писал(а):Вообще, переделать бы там всё))


6a6kin писал(а):Вообще, написать бы статью,про патчинг памяти))


:-[
Всем добра, любви и осознанности.

Nosce animum tuum.

А осознание и есть, что понял и осмыслил..
А коль не думал ты о том, то кто о том замыслил..?
Аватара пользователя
Bos93
 
Сообщения: 1425
Зарегистрирован: 03 апр 2010, 13:44
Благодарил (а): 149 раз.
Поблагодарили: 514 раз.

Re: Работа с памятью

Сообщение 6a6kin » 07 фев 2013, 20:19

Bos93, ага, то времени нету, то желания.
Alexander.3, это число постоянное — это опкод команды безусловного перехода.
На заказ не пишу.
Аватара пользователя
6a6kin
Скриптер
 
Сообщения: 332
Зарегистрирован: 09 мар 2010, 16:40
Благодарил (а): 38 раз.
Поблагодарили: 278 раз.

След.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3