Сообщений: 357
Тем: 58
Зарегистрирован: Jan 2016
Репутация:
116
Возник вопрос о работе на 64 бит приложениях
В 32бит приложении вызов хукнулся и все окей, а в 64бит приложении все через попу..
Как видно на скрине в коде появляется несуществующий адрес, который не относится к моей dll
Есть у кого мысли по этому поводу?
Код
[SRC="c++"]void CPatchEngine::WriteCall(BYTE *pAddress, DWORD *pNewFunc)
{
BYTE pCall = 0xE8;
DWORD pNewFuncAddr = (DWORD)pNewFunc - (DWORD)(pAddress + 5);
WriteMemory(pAddress, &pCall, sizeof(pCall));
WriteMemory(pAddress + 1, &pNewFuncAddr, sizeof(pNewFuncAddr));
}[/SRC]
[SRC="c++"]
void CPatchEngine::WriteMemory(BYTE *pAddress, LPCVOID pData, SIZE_T nSize)
{
VirtualProtectEx(hL2Server, (LPVOID)(pAddress), nSize, PAGE_EXECUTE_READWRITE, &dwOldProtect)
WriteProcessMemory(hL2Server, (LPVOID)(pAddress), pData, nSize, NULL)
}
[/SRC]
Сообщений: 2,454
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
У 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.
Гадаю по капче.
Сообщений: 357
Тем: 58
Зарегистрирован: Jan 2016
Репутация:
116
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 бит длл. Однако как тогда реализовать это на плюсах?На си++ никогда не кодил и вот ток ща опыта набираюсь
Сообщений: 2,454
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
Sojang;417404 Написал:Однако как тогда реализовать это на плюсах?На си++ никогда не кодил и вот ток ща опыта набираюсь Почти так же, как и для х86, но с кодом, как я показал выше. И да, на MSVC x64 нет inline asm, поэтому компилим кусок кода на АСМе и берем оттуда "готовый" код, который будет выполнять роль нашего трамплина.
Если не нравится метод через jmp, то можно через возврат:
Уже в сишной программе просто вставляем нужный адрес, не забывая его рассчитать.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Сообщений: 357
Тем: 58
Зарегистрирован: Jan 2016
Репутация:
116
n3k0nation Написал:Почти так же, как и для х86, но с кодом, как я показал выше. И да, на MSVC x64 нет inline asm, поэтому компилим кусок кода на АСМе и берем оттуда "готовый" код, который будет выполнять роль нашего трамплина.
Если не нравится метод через jmp, то можно через возврат:
Уже в сишной программе просто вставляем нужный адрес, не забывая его рассчитать.
Блин, что то не доходит до меня:redlol:
asm
[SRC="pascal"]
.386
.model fastcall
.code
start:
push adr
ret
end start
[/SRC]
Как можно заюзать это из с++?
Сообщений: 5,862
Тем: 105
Зарегистрирован: Sep 2010
Репутация:
13,014
Вот так:
[SRC="c++"] __asm
{
push adr
ret
}[/SRC]
Сообщений: 357
Тем: 58
Зарегистрирован: Jan 2016
Репутация:
116
Zubastic Написал:Вот так:
[SRC="c++"] __asm
{
push adr
ret
}[/SRC]
так выше же написали что инлайн вставок в 64бит нету
Сообщений: 2,454
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
Sojang Написал:Блин, что то не доходит до меня:redlol:
asm
[SRC="pascal"]
.386
.model fastcall
.code
start:
push adr
ret
end start
[/SRC]
Как можно заюзать это из с++?
А нафига Вы компилите под 386й?)
Качаете, например, fasm и пишите чето типа этого:
Код: use64
push 0x7fffffff
ret
Компилите это:
Код: fasm tramp.asm tramp.bin
Открываете в хексе аутпут и видите чето типа этого:
Берем эти замечательные байты и пихаем в сишную прогу. Должно получится чето типа:
Код: 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.
Гадаю по капче.
Сообщений: 357
Тем: 58
Зарегистрирован: Jan 2016
Репутация:
116
n3k0nation Написал:А нафига Вы компилите под 386й?)
Качаете, например, fasm и пишите чето типа этого:
Код: use64
push 0x7fffffff
ret
Компилите это:
Код: fasm tramp.asm tramp.bin
Открываете в хексе аутпут и видите чето типа этого:
![[Изображение: dfbcb93fdce44ed4b10a448c11352eb4.png]](http://image.prntscr.com/image/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 права на запись куска памяти, где будем переписывать код и пишем наш трамплин туда.
спасибо за развернутый ответ 
но чет я кажись кривой и он пишет в память не push адрес ret а бред полный
код
[SRC="c++"]void CPatchEngine::WriteCall(BYTE *pAddress, DWORD *pNewFunc)
{
unsigned char trampTemplate[ ] = {0x68, 0x00, 0x00, 0x00, 0x00, 0xc3 };
unsigned char* tramp = new unsigned char[6];
memcpy(tramp, trampTemplate, 6);
tramp[1] = (char)pNewFunc;
WriteMemory(pAddress, &tramp, sizeof(tramp));
}[/SRC]
Сообщений: 357
Тем: 58
Зарегистрирован: Jan 2016
Репутация:
116
все еще актуально..........
|