Berserker, это была новая таблица. Простите, что непонятно объяснил, у меня, просто, уже немного крыша едет от новой информации
В общем, задачу я все-таки решил и сейчас расскажу как, чтобы в будущем по аналогии мог сделать любой.
Первое, что понадобилось сделать, это найти место между функциями (можно где-то еще), где нет вообще ничего. Полистав виртуальные адреса в Олли я заметил, что после 0х401121 идет десятка два "нопов", я выбрал понравившийся (0х401127) и поместил туда функцию, которая будет возвращать нужный мне указатель:
Code:
; В Data.asm пишем следующее (там, где стоят все остальные хуки)
Hook 401127h, GetPreventiveCounterstrikeTable, TCall;
...
; Далее в Functions.asm соответственно нужно создать функцию с таким названием
proc GetPreventiveCounterstrikeTable
; Ядро всей операции - помещение в регистр esi указателя на таблицу
mov esi, PreventiveCounterstrikeTable
ret
endp
Теперь о том, как это использовать в плагине. Кстати, я специально оставил здесь "несколько нестандартный" показ сообщения - это просто пример того, как можно передать адрес или значение ЕРМ-скрипту для каких бы то ни было целей.
Code:
int PreventiveCounterstrikeTable;
__asm
{
push eax;Сохраняем старое значение, хранящееся в eax
push esi;Сохраняем старое значение, хранящееся в esi
mov eax, 00401127h; Помещаем в eax адрес функции
call eax; Вызываем(теперь в esi хранится нужный адрес)
mov PreventiveCounterstrikeTable, esi;Сохраняем адрес в переменную для дальнейшего использования
pop esi ;Восстaнавливаем старое значение, хранивщееся в esi
pop eax ;Восстaнавливаем старое значение, хранивщееся в eax
}
ostringstream stream;
stream << "IF:M^" << *(_ptr_*)(PreventiveCounterstrikeTable+200) << " " << *(_ptr_*)(PreventiveCounterstrikeTable + 201) << "^";
ExecErmCmd(stream.str().c_str());
У существа 200 есть превентивный контрудар, у 201 - нет. Результат налицо:
Кстати, что-то такое я уже предлагал раньше:
Quote:Правда, у меня имеется иная идея: что, если на месте какой-то не используемой больше функции создать новую, которая будет попросту записывать в какой-то регистр адрес таблицы? Я тогда смогу вызвать ее где-то ещё, сохранив при этом предыдущее значение, хранящееся в регистре, куда-нибудь скопировать указатель, а затем восстановить данные в том регистре, куда я его сохранял.
Итак, это было мое первое практическое применение ассемблера - можно считать, очередное достижение получено
Глобальный мод я уже создавал, исследования кода проводил, осталось выпустить плагин для всеобщего использования и написать туториал