Подскажите, как быть. Нашел временный адрес, где хранится нужное значение. В АМ на него более 200 указателей. И как узнать, какой из них нужен?
В Олли щелкал по тому же адресу references, нашел опять-таки за 200 адресов. Но как там искать нужное - тем более не знаю.
Найди участок кода, где используется адрес и посмотри там, с помощью какого указателя он получен.
Как при обращении к адресу A (на который стоит хук) заменить процедуру в адресе B? Например, изначально в адресе B стоит "MOV ECX 4", а надо, чтобы было "MOV 8". Имеется в виду код в Паскале.
Посмотри в Оле, сколько байтов занимает сама команда, а сколько константа. Например, если 2 байта команда, то прибавь к адресу 2, а затем напиши: PINTEGER(адрес)^:=8. Если константа однобайтовая, то PBYTE(адрес)^:=4;
Ссылка в первом сообщении темы не работает.
Berserker, можно подробнее для идиота?
1. Что подразумевается под константой? Адрес хука?
2. Где смотреть, что сколько байт занимает?
Простите, если мои вопросы кажутся непроходимо тупыми...
Для идиота смысла нет, а умному человеку почему бы не объяснить?

Видишь, B9 - байт-команда = MOV ECX, SomeConst, а сама константа занимает 4 байта и находится, естественно, байтом правее от адреса команды. Соответственно, нужно записать по адресу 701001(в моём случае) 8.
PINTEGER($701001)^:=8.
Однако это только для кода вога, для которого разрешена запись. Для остального нужно использовать процедуру:
Code:
PROCEDURE WriteAtCode (Addr: POINTER; Buf: POINTER; Count: INTEGER);
VAR
OldPageProtect: INTEGER;
BEGIN
{!} ASSERT(CodeAddr <> NIL);
{!} ASSERT(Buf <> NIL);
{!} ASSERT(Count > 0);
Windows.VirtualProtect(CodeAddr, Count, PAGE_READWRITE, @OldPageProtect);
MOVE(Buf^, CodeAddr^, Count);
Windows.VirtualProtect(CodeAddr, Count, OldPageProtect, NIL);
END; // .PROCEDURE WriteAtCode
Вызывать так.
Code:
VAR
Patch: INTEGER;
Patch:=8;
WriteAtCode(Ptr(адрес), @Patch, 4);
Quote:Однако это только для кода вога, для которого разрешена запись.
А разве то ли в ТЕ, то ли в Эре защита со всех секций не снята?
___________
Где хранятся записи о требованиях к отстройке? Раскуривание CD:B результатов не дало.
Не снята. Просто воговская часть имеет флаг на запись и расценивается как данные. А вот содовская, как и ранее, сгенерит исключение.
Quote:А вот содовская, как и ранее, сгенерит исключение.
Хм..у меня не генерит, не смотря на то, что я делаю, скажем, так:
Code:
*(int*)(0x59F898+1) = CREATURE_ENERGY_ELEM;
Перепроверил. Был не прав. Очень странно. Выходит теперь любая ошибка запросто портит код, а когда уже будет исключение, анализировать будет нечего.
Подскажите, пожалуйста, каков адрес x-переменных функций? Возможно ли вывести какую-нибудь общую формулу в духе [адрес функции 1 * номер функции] + [адрес x1 * номер x]?
Здравствуйте!
Никто случаем не занимался изменением главного меню игры? Меня интересует дизабил некоторых кнопок. Как, например, это реализовано, если ваш компьютер клиент в сетевой игре:
Позарез нужно отключить или убрать из меню вообще кнопку "Показать дополнительные опции", чтоб на серваке ее тоже нельзя было использовать. Нашел дефку кнопки - gspbutt.def, текста на ней в genrltxt.txt.
Почитал данную ветку, полез на wasm.ru начал читать "Крекинг с нуля"

, скачал Olly. Даже бряк поставил на gspbutt.def

И только потом понял, что я вообще не соображаю, что дальше делать

Видать в моем возрасте уже позновато с нуля начать програмировать, при том что общие навыки в этом деле + знание языков = 0,000

На фига бряк-то? Смещай координаты просто за пределы экрана.
Или забей нопами отрисовку.
Мастера, подскажите, пожалуйста, как по умному сделать. Нужно, чтобы при хуке на адресе A:
1) сравнивалось значение по адресу B с -1 (CMP DWORD [адресB], -1);
2) если по адресу B и вправду -1, то команда по адресу C будет MOV ECX, DWORD [EDX*4+$68A36C];
3) если по адресу B отличное от -1 значение, то команда по адресу C будет MOV ECX, DWORD [адресB*4+$68A36C].
Я пробовал менять опкод и аргумент через PINTEGER, но у меня выходит хрень какая-то. Помогите, пожалуйста!