Очень любопытно и интересно стало изучить работу с памятью. Сразу предупреждаю - извращаюсь пару дней, если выражаюсь не правильно/грамотно, прошу прощения.
Для начала я бы хотел показать пример, как я посылаю функции...
Шаг 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
Шаг 2: ( Теперь приступим к нашему первому C++ коду )
Получаем оффсету:
sub_10093C70 = 093C70 = 0x093C70
Полный код:
[spoiler][pawn]
- #include "amxxmodule.h"
- void *base;
- void Message(char *Message);
- void FN_ClientCommand(edict_t *pEntity) {
- const char* cmd = CMD_ARGV(0);
- if (strcmp(cmd, "test") == 0) {
- Message("Alexander.3 watching you");
- RETURN_META(MRES_SUPERCEDE);
- }
- RETURN_META(MRES_IGNORED);
- }
- int DispatchSpawn( edict_t *pEdict ) {
- base = GetModuleHandleA("mp.dll");
- return 0;
- }
- void Message(char *Message) {
- typedef void (*FN_Msg)(int v);
- FN_Msg MessageCenter = (FN_Msg)((DWORD)base + 0x093C70);
- MessageCenter((int)Message);
- }
Результат:
[spoiler][/spoiler]
Вроде работает...
Теперь у меня нарастают такие вопросы...
-- Как блокировать функцию, тело фукнции.
-- Как люди пишут свои "патчи", как узнать какой адрес вставить?
-- Как вообще подменить/вставить свой адрес и заблокировать текущий?
-- Для чего нужен второй аргумент и как его используют?
Далее хотел бы для примера заблокировать сообщение в чат, но для начала нужно узнать как не имитировать сообщения, отправляя их через функцию, зная адрес. а как отловить и блокнуть их.