darthmaul Опубликовано 29 января, 2017 Поделиться Опубликовано 29 января, 2017 как найти кусок кода связанный с исполнением команды alias? чтоб занопить. Ссылка на комментарий Поделиться на другие сайты Поделиться
2zolo2 Опубликовано 29 января, 2017 Поделиться Опубликовано 29 января, 2017 darthmaul, поиск по 0 - 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 29 января, 2017 Поделиться Опубликовано 29 января, 2017 (изменено) 2 часа назад, darthmaul сказал: как найти кусок кода связанный с исполнением команды alias? чтоб занопить. Открывай sdk, ищи ближайшие ошибки или текст к необходимой функции, ищи этот же текст в дизассемблере и восстанавливай код. Или alias 26267272, получаешь ошибку и ищешь её. Вроде бы там получение адреса рассчитывается через вызов функции с аргументом cvar команд и возвращает адрес функции из виртуальной таблицы. Изменено 29 января, 2017 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
darthmaul Опубликовано 30 января, 2017 Автор Поделиться Опубликовано 30 января, 2017 (изменено) вот что нарыл в sdk Скрытый текст #define MAX_ALIAS_NAME 32 typedef struct cmdalias_s { struct cmdalias_s *next; char name[ MAX_ALIAS_NAME ]; char *value; } cmdalias_t; static cmdalias_t *cmd_alias = NULL; /* =============== Cmd_Alias_f Creates a new command that executes a command string (possibly ; seperated) =============== */ void Cmd_Alias_f (void) { cmdalias_t *a; char cmd[1024]; int i, c; char *s; if (Cmd_Argc() == 1) { Con_Printf ("Current alias commands:\n"); for (a = cmd_alias ; a ; a=a->next) Con_Printf ("%s : %s\n", a->name, a->value); return; } s = Cmd_Argv(1); if (strlen(s) >= MAX_ALIAS_NAME) { Con_Printf ("Alias name is too long\n"); return; } // copy the rest of the command line cmd[0] = 0; // start out with a null string c = Cmd_Argc(); for (i=2 ; i< c ; i++) { strcat (cmd, Cmd_Argv(i)); if (i != c) strcat (cmd, " "); } strcat (cmd, "\n"); // if the alias allready exists, reuse it for (a = cmd_alias ; a ; a=a->next) { if (!strcmp(s, a->name)) { if ( !strcmp( a->value, cmd ) ) // Re-alias the same thing return; delete[] a->value; break; } } if (!a) { a = (cmdalias_t *)new cmdalias_t; a->next = cmd_alias; cmd_alias = a; } strcpy (a->name, s); a->value = CopyString (cmd); } static ConCommand alias("alias",Cmd_Alias_f); Через CE нашел сначала строку "Current alias commands:", поставил брейк поинт на чтение, при выполнении комнады alias вышло две функции: https://www.dropbox.com/s/960r1oe5j4yez2e/%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%202017-01-30%2014.50.23.png?dl=0 Но что то думаю что копаю не в ту сторону. По коду есть ConCommand alias("alias",Cmd_Alias_f); т.е. регистрация команды alias. по идее эту строку и нужно занопить, но вот как словить это событие если регистрация команды происходит сразу после старта игры. Изменено 30 января, 2017 пользователем darthmaul Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 30 января, 2017 Поделиться Опубликовано 30 января, 2017 (изменено) 1 час назад, darthmaul сказал: но вот как словить это событие если регистрация команды происходит сразу после старта игры. Нопить во время старта игры, запустил программу она в цикле ищет модуль игры, если находит, то патчит необходимые тебе байты и закрывается. Изменено 30 января, 2017 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
darthmaul Опубликовано 30 января, 2017 Автор Поделиться Опубликовано 30 января, 2017 2 минуты назад, partoftheworlD сказал: Нопить во время старта игры, запустил программу она в цикле ищет игру, если находит, то патчит необходимые тебе байты и закрывается. это понятно. но как адреса этих байтов найти? Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 30 января, 2017 Поделиться Опубликовано 30 января, 2017 (изменено) 2 часа назад, darthmaul сказал: это понятно. но как адреса этих байтов найти? Находишь к примеру ConCommand alias("alias",Cmd_Alias_f); ПКМ на функцию -> Follow и пишешь внутри функции ret Так что при обращении к ней краша не будет и сразу после обращения функция завершит выполнение и передаст управление дальше Изменено 30 января, 2017 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения