Wake of Gods Forum | Форум Во Имя Богов

Full Version: Исследование героев
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Подскажите, как быть. Нашел временный адрес, где хранится нужное значение. В АМ на него более 200 указателей. И как узнать, какой из них нужен?
В Олли щелкал по тому же адресу references, нашел опять-таки за 200 адресов. Но как там искать нужное - тем более не знаю.
Найди участок кода, где используется адрес и посмотри там, с помощью какого указателя он получен.
Как при обращении к адресу A (на который стоит хук) заменить процедуру в адресе B? Например, изначально в адресе B стоит "MOV ECX 4", а надо, чтобы было "MOV 8". Имеется в виду код в Паскале.
Посмотри в Оле, сколько байтов занимает сама команда, а сколько константа. Например, если 2 байта команда, то прибавь к адресу 2, а затем напиши: PINTEGER(адрес)^:=8. Если константа однобайтовая, то PBYTE(адрес)^:=4;
Ссылка в первом сообщении темы не работает.
Berserker, можно подробнее для идиота?
1. Что подразумевается под константой? Адрес хука?
2. Где смотреть, что сколько байт занимает?
Простите, если мои вопросы кажутся непроходимо тупыми...
Для идиота смысла нет, а умному человеку почему бы не объяснить? Sm
Image: original.jpg
Видишь, 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]?
Здравствуйте!
Никто случаем не занимался изменением главного меню игры? Меня интересует дизабил некоторых кнопок. Как, например, это реализовано, если ваш компьютер клиент в сетевой игре:

Image: 8397f4f51de37314eb76b6f63954a254.jpeg

Позарез нужно отключить или убрать из меню вообще кнопку "Показать дополнительные опции", чтоб на серваке ее тоже нельзя было использовать. Нашел дефку кнопки - gspbutt.def, текста на ней в genrltxt.txt.

Почитал данную ветку, полез на wasm.ru начал читать "Крекинг с нуля" 141, скачал Olly. Даже бряк поставил на gspbutt.def 147
И только потом понял, что я вообще не соображаю, что дальше делать105 Видать в моем возрасте уже позновато с нуля начать програмировать, при том что общие навыки в этом деле + знание языков = 0,000108
На фига бряк-то? Смещай координаты просто за пределы экрана.

Или забей нопами отрисовку.
Мастера, подскажите, пожалуйста, как по умному сделать. Нужно, чтобы при хуке на адресе 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, но у меня выходит хрень какая-то. Помогите, пожалуйста!
Reference URL's