20.08.2016, 23:37
|
#19
|
Пользователь
Регистрация: 09.01.2016
Адрес: Москва
Возраст: 34
Сообщений: 357
Отблагодарили 19 раз(а)
|
Re: L2 PTS
Цитата:
Сообщение от n3k0nation
А нафига Вы компилите под 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 права на запись куска памяти, где будем переписывать код и пишем наш трамплин туда.
|
спасибо за развернутый ответ
но чет я кажись кривой и он пишет в память не push адрес ret а бред полный
Свернуть ↑
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));
}Code: C++
Свернуть ↑Развернуть ↓
|
|
|