Перейти к содержанию

[Help] Расчитываем прыжки в x64


Рекомендуемые сообщения

Столкнулся с проблемой , никак не могу расчитать прыжок с адреса до кейва и обратно.

Смотрел давно-давно, помоймку Coder выкладывал видео по расчету, сделал функцию, в x86 все работало как часы, а вот в x64 по отладке смотрю,

выдает фигню...

 

И так:

0x7ff7cf646f3c //Адрес в процессе игры0x7ffe4e052730 //Адрес куда я хочу прыгнуть (тут кейв)//Начинаю расчитывать:0 - (0x7ff7cf646f3c  - 0x7ffe4e052730) - 5 //5б прыжкаDWORD64 jmpAdress = 0 - (target - (DWORD64)ptr) - 5; //Как у меня в коде//Получаю на выходе:0x67EA0B7EF//Дописываю: E9 и переворачиваю и дописываю 4байта, получаю:E9 EF B7 A0 7E//Вписываю ручками в CE... и получаю:jmp 7FF84E052730 //Что получилосьjmp 7FFe4E052730 //Это правильный(Куда мне нужно)

Подскажите, где собака зарыта?

Ссылка на комментарий
Поделиться на другие сайты

elvis66666, наверное, нужна другая формула для расчета, для x64. Попробуй поменять 5 на другое число.

use64mov rax  ,123456789h;offset of hookjmp raxСгерененый код:0x48, 0xB8, 0x89, 0x67, 0x45, 0x23, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xE0

Пока нашел такое решение. С http://wasm.ru/forum/viewtopic.php?id=39109

Изменено пользователем 2zolo2
Ссылка на комментарий
Поделиться на другие сайты

Во тут обсуждают HOOK х64, две ссылки одна на русском, другая на английском http://www.rohitab.com/discuss/topic/41624-x64-iat-hook/ http://ru.vingrad.com/Perekhvat-vyzova-API-pod-x64-id51dec9da6ccc19d02b000002

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Во тут обсуждают HOOK х64, две ссылки одна на русском, другая на английском http://www.rohitab.com/discuss/topic/41624-x64-iat-hook/ http://ru.vingrad.com/Perekhvat-vyzova-API-pod-x64-id51dec9da6ccc19d02b000002

увы, но ничего там не углядел полезного(

Ссылка на комментарий
Поделиться на другие сайты

rax <- место патчаmov word[rax],0x15FF ;call qword[xxx]mov dword[rax+2],0x2 ;skip jmpmov word[rax+6],0x0AEB ;jmp word+qword+trashlea rcx,[InfiniteNitroHook]mov [rax+8],rcx
на jmp неудобно. иногда надо все регистры сохр...

NullAlex: Для кода необходимо использовать специальный тег. Читай правила и FAQ.

Ссылка на комментарий
Поделиться на другие сайты

Сделал!

Вот такое вот решение:

VirtualProtect(ptr, 12, PAGE_EXECUTE_READWRITE, &old_protection);memcpy(ptr, "\x48\xB8\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xE0", 12);memcpy((BYTE*)ptr + 2, &target, sizeof(void*));VirtualProtect(ptr, 12, old_protection, &old_protection);

Собственно ptr - начальный адресс куда мы будем писать JMP...

\x48\xB8 - на асме это MOV RAX,

дальше 8 байт (8 нопов), которые мы запишем адресом.

А вконце у нас \xFF\xE0 - это на асме JMP RAX

 

в сумме имеем

 

mov rax, адресс

jmp rax

 

fuck yeah) ^_^ пару чашек кофе и дезасемблер помогли... А насчет формулы, я бы все же не отказался, если кто ее имеет!

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Вот еще нашел, ссылка https://bitbucket.org/NtQuery/scyllahide/src/540ec6e2d29b9e9fd4355c7a9c7e3a1099da298a/HookLibrary/Hook.cpp?at=master&fileviewer=file-view-default.
Как понял, там без формулы, просто, берут адрес функций хука и вставляют.

Пример:

 1. 2 байта: на JMP ( FF 25 ).

 2. 4 байта: это 0.

 3. 8 байта: на HOOK функцию.

Ссылка на комментарий
Поделиться на другие сайты

Пример для

jmp far 000007FEF5822000
Через qword ptr на указатель

03A90000 - FF 25 00000000 - jmp qword ptr [03A90006]
03A90006 - указатель на адрес, по которому будет прыжок с перевернутыми байтами 000007FEF5822000

03A90006: 00 20 82 F5 FE 07 00 00
*Только вот адрес в квадратных скобках не может быть больше 4-х байт.

А насчет формулы, я бы все же не отказался, если кто ее имеет!

 

Как я понял по документации от интелов длинные прыжки на 8-ми байтный адрес не поддерживаются. Если интересно вбей в Гугл "64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf"

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.