Объявления |
---|
Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru. Я оторву свою задницу от всех дел и обязательно Вас активирую! Добро пожаловать на геройский форум! |
Re: Улучшение ИИНу а Роузовский совет то всегда будет работать ? &myDouble будет в 4 байта укладываться ?
|
Re: Улучшение ИИЦитата: В самом начале темы про плагины, вроде бы, были примеры. |
Re: Улучшение ИИЦитата: Не знаю, что он имел в виду. Double по частям можно засунуть в два dword'а, а в 4 байта - никак. Только сослаться можно 4-байтовым указателем. Последний раз редактировалось AlexSpl 07 май 2020, 20:47, всего редактировалось 1 раз.
|
Re: Улучшение ИИОн имел в виду адрес для Double. А адрес вполне может уложиться в 4 байта.
Вот только всегда ли ? Для экзешника мы видим что адреса 4-байтные, правда, один байт - нули. А для Дллки насколько помню, значащих цифр больше, но, возможно, тоже в 4 байта укладываются. |
Re: Улучшение ИИЦитата: Это не два адреса, а одно 8-байтное число double, похожее на 1.0, если мы про одно и то же Так, понял. Для dll всё то же самое. Нули в 64-х разрядных приложениях. В 32-х разрядных адреса от 0 до 0x7FFFFFFF (для пользовательского режима; выше - уже ядро). |
Re: Улучшение ИИВот, нашёл в теме про плагины (пример из Орлоглаза):
Здесь мы меняем значение локальной переменной var_14. Там же про float (но работало бы и с double):
|
|
Re: Улучшение ИИAFAIK, pointers in X86 are always 4 bytes wide.
My suggestion was indeed to direct the code to your double by address. It's different than overwriting the actual value as was done for Eagle Eye, but gives you more flexibility.
I've changed a lot of variables on the stack using patcher_x86, even adding this to HookContext to make it direct. Referring to unassigned stack addresses as in your example *should* not result in a crash, Patcher's LoHook even does this to recover ESP... |
Re: Улучшение ИИWouldn't it be easier just to compare?
Provided [ebp + 0xC] is double. Or
for float. Anyway in both cases we compare long doubles. |
Re: Улучшение ИИЕщё интересна тема точности чисел с плавающей точкой: float (32 бита), double (64 бита) и long double (80 бит).
Например, в следующем листинге при наведении курсора на любое число с плавающей точкой получаем подсказку о том, что это long double:
Хотя, как мы знаем, вещественный литерал без суффикса по умолчанию есть double (например, 7.0 = 7.0 double). Понятно, что и float, и double, и long double попадают в регистры FPU с расширением до long double. Но 1.0f != 1.0 != 1.0l* (в условии равны, а вот в памяти нет). Вот интересный пример:
Как бы обычно за точностью мы не гонимся особо. Но в Героях есть алгоритмы, где точность вещественных чисел может сделать разницу (например, в алгоритме определения штрафов за стрельбу через крепостные стены). Поэтому вопрос: правильно ли писать в листинге декомпиляции a3 + a3 - 2.0 здесь (4A74AD):
или нужно a3 + a3 - 2.0f? Всё-таки есть же разница, какую 2 отнимать, 2.0 или 2.0f? * * * * Хотя с 1.0f неудачный пример. Проверил, 1.0f загружается как 1.0 в ST0, а вот 1.1f уже как 1.1000000238418579102. И в коде 1.1f == 1.1 - false. 1.1 (double) загружается в ST0 как 1.1000000000000000888, но в коде почему-то 1.1 == 1.1l - уже true. * * * Вот, млин, sizeof(long double) == 8 Почему? https://docs.microsoft.com/en-us/cpp/cpp/data-type-ranges?view=vs-2019 Короче, Bytes, Range of Values - same as double. Цитата: А когда-то в Паскале был такой тип как Extended... Целых 10 байт! До сих пор думал, что long double есть аналог Extended, а тут такой облом. |
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1