Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Другие игры / Other games (https://forum.zone-game.info/forumdisplay.php?f=24)
-   -   L2 PTS (https://forum.zone-game.info/showthread.php?t=41215)

Sojang 19.08.2016 16:54

Re: L2 PTS
 
Возник вопрос о работе на 64 бит приложениях
В 32бит приложении вызов хукнулся и все окей, а в 64бит приложении все через попу..
Как видно на скрине в коде появляется несуществующий адрес, который не относится к моей dll
Есть у кого мысли по этому поводу?:)

Код:
Свернуть ↑Развернуть ↓

n3k0nation 19.08.2016 17:26

Re: L2 PTS
 
У 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. А вообще, не забываем о релатив адресации.

Sojang 19.08.2016 17:38

Re: L2 PTS
 
Цитата:

Сообщение от n3k0nation (Сообщение 417403)
У 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 (Сообщение 416712)
Или вот экстендер с гф до эпалога https://bitbucket.org/l2shrine/extender-public/src

реализовано так же как у меня, а это судя по всему длл под 64 бит..
UDP: Беру слова назад. То что по ссылке это не 64 бит длл. Однако как тогда реализовать это на плюсах?На си++ никогда не кодил и вот ток ща опыта набираюсь

n3k0nation 19.08.2016 22:10

Re: L2 PTS
 
Цитата:

Сообщение от Sojang (Сообщение 417404)
Однако как тогда реализовать это на плюсах?На си++ никогда не кодил и вот ток ща опыта набираюсь

Почти так же, как и для х86, но с кодом, как я показал выше. И да, на MSVC x64 нет inline asm, поэтому компилим кусок кода на АСМе и берем оттуда "готовый" код, который будет выполнять роль нашего трамплина.
Если не нравится метод через jmp, то можно через возврат:
Код:

push adr
ret

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

Sojang 20.08.2016 14:22

Re: L2 PTS
 
Цитата:

Сообщение от n3k0nation (Сообщение 417414)
Почти так же, как и для х86, но с кодом, как я показал выше. И да, на MSVC x64 нет inline asm, поэтому компилим кусок кода на АСМе и берем оттуда "готовый" код, который будет выполнять роль нашего трамплина.
Если не нравится метод через jmp, то можно через возврат:
Код:

push adr
ret

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

Блин, что то не доходит до меня:redlol:
asm:
Свернуть ↑Развернуть ↓

Как можно заюзать это из с++?

Zubastic 20.08.2016 17:03

Re: L2 PTS
 
Вот так:
	__asm
	{
		push adr
		ret
	}
Code: C++

Sojang 20.08.2016 17:17

Re: L2 PTS
 
Цитата:

Сообщение от Zubastic (Сообщение 417430)
Вот так:
	__asm
	{
		push adr
		ret
	}
Code: C++

так выше же написали что инлайн вставок в 64бит нету:)

n3k0nation 20.08.2016 22:02

Re: L2 PTS
 
Цитата:

Сообщение от Sojang (Сообщение 417427)
Блин, что то не доходит до меня:redlol:
asm:
Свернуть ↑Развернуть ↓

Как можно заюзать это из с++?

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

Качаете, например, fasm и пишите чето типа этого:
Код:

use64
push 0x7fffffff
ret

Компилите это:
Код:

fasm tramp.asm tramp.bin
Открываете в хексе аутпут и видите чето типа этого:
http://image.prntscr.com/image/dfbcb...8c11352eb4.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 права на запись куска памяти, где будем переписывать код и пишем наш трамплин туда.

Sojang 20.08.2016 23:37

Re: L2 PTS
 
Цитата:

Сообщение от n3k0nation (Сообщение 417443)
А нафига Вы компилите под 386й?)

Качаете, например, fasm и пишите чето типа этого:
Код:

use64
push 0x7fffffff
ret

Компилите это:
Код:

fasm tramp.asm tramp.bin
Открываете в хексе аутпут и видите чето типа этого:
http://image.prntscr.com/image/dfbcb...8c11352eb4.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 права на запись куска памяти, где будем переписывать код и пишем наш трамплин туда.

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

код:
Свернуть ↑Развернуть ↓

Sojang 21.08.2016 22:56

Re: L2 PTS
 
все еще актуально..........


Текущее время: 13:38. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot