пример является рабочим, однако есть непонимание расчета адреса функции, на которую потом будет совершен абсолютный переход.
relative_offset = (DWORD*)(dst - src);
В моем случае получаются следующие значения 97108c - 75c50ea5 = 8ad201e7. Но почему из меньшего числа вычитается большее?
Программа при этом работает корректно. DWORD это unsigned long, то есть происходит переполнение.
Код на PasteBin: https://pastebin.com/Q6QedYW4
Там из системной библиотеки (адрес большой) происходит прыжок в пользовательский код (адрес маленький). Прыжок относительный, к адресу инструкции, которая следует за jmp прибавляется смещение (со знаком). Размер джампа 5 байт (опкод и смещение). Соответственно jmp_addr + 5 + x = target; x = target - (jmp_addr + 5). Получается отрицательное число (-0x72dfe19, -0x72dfe19 & 0xffffffff == 0x8ad201e7).
Найди в Ютубе канал Tempesta torres. В последних роликах чувак как раз эту тему на пальцах разъясняет.
Обсуждают сегодня