Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
L2 PTS
#11
Возник вопрос о работе на 64 бит приложениях
В 32бит приложении вызов хукнулся и все окей, а в 64бит приложении все через попу..
Как видно на скрине в коде появляется несуществующий адрес, который не относится к моей dll
Есть у кого мысли по этому поводу?Smile
Скрин
Код
Ответ
#12
У x64 адреса длиннее. kappa
Попробуйте чето типа этого:
Код:
;если надо, то делаем lea rax,[adr_param] вместо мува
mov rax,0x100500
jmp rax

Код:
48 b8 //mov rax
00 00 00 00 00 00 00 00 //наш_адрес_на_8_байт
ff e0 //jmp rax

Ну и конечно же, это все займет 12 байт, а не 5, как в x86. А вообще, не забываем о релатив адресации.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#13
n3k0nation Написал:У x64 адреса длиннее. kappa
Попробуйте чето типа этого:
Код:
;если надо, то делаем lea rax,[adr_param] вместо мува
mov rax,0x100500
jmp rax

Код:
48 b8 //mov rax
00 00 00 00 00 00 00 00 //наш_адрес_на_8_байт
ff e0 //jmp rax

Ну и конечно же, это все займет 12 байт, а не 5, как в x86.

Длиннее то длиннее, однако вот тут
Vavilon Написал:Или вот экстендер с гф до эпалога https://bitbucket.org/l2shrine/extender-public/src
реализовано так же как у меня, а это судя по всему длл под 64 бит..
UDP: Беру слова назад. То что по ссылке это не 64 бит длл. Однако как тогда реализовать это на плюсах?На си++ никогда не кодил и вот ток ща опыта набираюсь
Ответ
#14
Sojang;417404 Написал:Однако как тогда реализовать это на плюсах?На си++ никогда не кодил и вот ток ща опыта набираюсь
Почти так же, как и для х86, но с кодом, как я показал выше. И да, на MSVC x64 нет inline asm, поэтому компилим кусок кода на АСМе и берем оттуда "готовый" код, который будет выполнять роль нашего трамплина.
Если не нравится метод через jmp, то можно через возврат:
Код:
push adr
ret
Уже в сишной программе просто вставляем нужный адрес, не забывая его рассчитать.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#15
n3k0nation Написал:Почти так же, как и для х86, но с кодом, как я показал выше. И да, на MSVC x64 нет inline asm, поэтому компилим кусок кода на АСМе и берем оттуда "готовый" код, который будет выполнять роль нашего трамплина.
Если не нравится метод через jmp, то можно через возврат:
Код:
push adr
ret
Уже в сишной программе просто вставляем нужный адрес, не забывая его рассчитать.

Блин, что то не доходит до меня:redlol:
asm
Как можно заюзать это из с++?
Ответ
#16
Вот так:
[SRC="c++"] __asm
{
push adr
ret
}[/SRC]
[Изображение: 4e38c909fcd08c5fcdf363b54a62.png]
Ответ
#17
Zubastic Написал:Вот так:
[SRC="c++"] __asm
{
push adr
ret
}[/SRC]

так выше же написали что инлайн вставок в 64бит нетуSmile
Ответ
#18
Sojang Написал:Блин, что то не доходит до меня:redlol:
asm
Как можно заюзать это из с++?

А нафига Вы компилите под 386й?)

Качаете, например, fasm и пишите чето типа этого:
Код:
use64
push 0x7fffffff
ret

Компилите это:
Код:
fasm tramp.asm tramp.bin

Открываете в хексе аутпут и видите чето типа этого:
[Изображение: dfbcb93fdce44ed4b10a448c11352eb4.png]

Берем эти замечательные байты и пихаем в сишную прогу. Должно получится чето типа:
Код:
unsigned char trampTemplate[ ] = {
0x68, //push
0x00, 0x00, 0x00, 0x00 //address
0xc3 //ret
};
Адрес кодируется, как беззнаковое 4х байтовое слово. В общем, через костыль и жопу, грубо говоря (вместо того, чтобы дать нормальную поддержку push 8bytes). Пляшем с бубном, вычисляем наш адрес.
Готовим трамплин (псевдокод):
Код:
unsigned char* tramp = new unsigned char[6];
memcpy(tramp, trampTemplate, 6);
((DWORD*)(&tramp[1]))* = adr;

А далее, как обычно, даем через VirtualProtect права на запись куска памяти, где будем переписывать код и пишем наш трамплин туда.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#19
n3k0nation Написал:А нафига Вы компилите под 386й?)

Качаете, например, fasm и пишите чето типа этого:
Код:
use64
push 0x7fffffff
ret

Компилите это:
Код:
fasm tramp.asm tramp.bin

Открываете в хексе аутпут и видите чето типа этого:
[Изображение: dfbcb93fdce44ed4b10a448c11352eb4.png]

Берем эти замечательные байты и пихаем в сишную прогу. Должно получится чето типа:
Код:
unsigned char trampTemplate[ ] = {
0x68, //push
0x00, 0x00, 0x00, 0x00 //address
0xc3 //ret
};
Адрес кодируется, как беззнаковое 4х байтовое слово. В общем, через костыль и жопу, грубо говоря (вместо того, чтобы дать нормальную поддержку push 8bytes). Пляшем с бубном, вычисляем наш адрес.
Готовим трамплин (псевдокод):
Код:
unsigned char* tramp = new unsigned char[6];
memcpy(tramp, trampTemplate, 6);
((DWORD*)(&tramp[1]))* = adr;

А далее, как обычно, даем через VirtualProtect права на запись куска памяти, где будем переписывать код и пишем наш трамплин туда.

спасибо за развернутый ответSmile
но чет я кажись кривой и он пишет в память не push адрес ret а бред полный

код
Ответ
#20
все еще актуально..........
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)