L2 PTS
Вопрос следующий:
Как доводят старые птс сборки до новых версий л2 без сорцов? |
Re: L2 PTS
Экcтендер.
|
Re: L2 PTS
Цитата:
|
Re: L2 PTS
Цитата:
Как пример экста: https://sourceforge.net/p/coep/code/66/ |
Re: L2 PTS
Или вот экстендер с гф до эпалога https://bitbucket.org/l2shrine/extender-public/src
|
Re: L2 PTS
Цитата:
Но, насколько я знаю, полноценной платформой, с гордым званием "PTS", являться оно не будет. |
Re: L2 PTS
Цитата:
Цитата:
|
Re: L2 PTS
Это называется эмулятор на Си. :D
|
Re: L2 PTS
Цитата:
|
Re: L2 PTS
Цитата:
того что скинули выше оказалось достаточно |
Re: L2 PTS
Возник вопрос о работе на 64 бит приложениях
В 32бит приложении вызов хукнулся и все окей, а в 64бит приложении все через попу.. Как видно на скрине в коде появляется несуществующий адрес, который не относится к моей dll Есть у кого мысли по этому поводу?:) Скрин:Развернуть ↓Код:Развернуть ↓ |
Re: L2 PTS
У x64 адреса длиннее. kappa
Попробуйте чето типа этого: Код:
;если надо, то делаем lea rax,[adr_param] вместо мува Код:
48 b8 //mov rax |
Re: L2 PTS
Цитата:
Цитата:
UDP: Беру слова назад. То что по ссылке это не 64 бит длл. Однако как тогда реализовать это на плюсах?На си++ никогда не кодил и вот ток ща опыта набираюсь |
Re: L2 PTS
Цитата:
Если не нравится метод через jmp, то можно через возврат: Код:
push adr |
Re: L2 PTS
Цитата:
asm:Развернуть ↓Как можно заюзать это из с++? |
Re: L2 PTS
Вот так:
__asm { push adr ret } |
Re: L2 PTS
Цитата:
|
Re: L2 PTS
Цитата:
Качаете, например, fasm и пишите чето типа этого: Код:
use64 Код:
fasm tramp.asm tramp.bin http://image.prntscr.com/image/dfbcb...8c11352eb4.png Берем эти замечательные байты и пихаем в сишную прогу. Должно получится чето типа: Код:
unsigned char trampTemplate[ ] = { Готовим трамплин (псевдокод): Код:
unsigned char* tramp = new unsigned char[6]; |
Re: L2 PTS
Цитата:
но чет я кажись кривой и он пишет в память не push адрес ret а бред полный код:Развернуть ↓ |
Re: L2 PTS
все еще актуально..........
|
Re: L2 PTS
Удивительно как можно совершить столько ошибок в паре строчек кода :(
tramp = new unsigned char[6];Memory leak без delete[] в конце. Лучше сразу на стеке объявить char tramp[6]; tramp[1] = (char)pNewFunc;Это копирует только один младший байт адреса. WriteMemory(pAddress, &tramp, sizeof(tramp));Cразу две ошибки. У тебя tramp - это указатель, следовательно &tramp - адрес этой переременной, а не самого буфера с кодом; по той же причине sizeof(tramp) будет == 4, а не 6. char trampoline[6]; trampoline[0] = 0x68; // push imm32 memcpy(&trampoline[1], pNewFunc, 4); // тут я не понял. pNewFunc у тебя это уже адрес новой функции или это указатель на переменную с адресом новой функции? trampoline[5] = 0xС3; // ret WriteMemory(pAddress, trampoline, sizeof(trampoline)); |
Re: L2 PTS
Да уж, как можно так издеваться над c++
|
Re: L2 PTS
Цитата:
только теперь адрес то верно пишет, но когда выполняется патченый код то приложение крашится тупо..в чем может быть проблема? UDP: Посмотрел дебагером, а там по адресу pNewFunc расположено что то очень странное.. https://pp.vk.me/c604724/v604724067/...eaOr9BBnL4.jpg |
Re: L2 PTS
Просто длл не загружена, если не ошибаюсь.
А вообще критует из-за ошибки записи скорее всего. Писать через виртуалпротект же надо :) Добавлено через 1 минуту void HookFunction(void* dest, void* src, int countBytes) { DWORD dwProtect = PAGE_READWRITE; VirtualProtect(dest, countBytes, dwProtect, &dwProtect); *(int*)dest = (int)src; VirtualProtect(dest, countBytes, dwProtect, &dwProtect); }Для моих нужд этого хватает. |
Re: L2 PTS
Цитата:
Добавлено через 19 минут Я тут подумал, а у меня вообще адрес функции правильно определятся?:D CPatchEngine::Instance()->WriteCall((BYTE *)0x14010DF47, (DWORD *)PatchInit); void CPatchEngine::WriteCall(BYTE *pAddress, DWORD *pNewFunc) { char trampoline[6]; trampoline[0] = 0x68; // push imm32 memcpy(&trampoline[1], &pNewFunc, 4); trampoline[5] = 0xC3; // ret WriteMemory(pAddress, trampoline, sizeof(trampoline)); } |
Re: L2 PTS
Функция называется WriteCall, но вообще-то равносильна jmp, а не call. Предварительно на стек следует положить адрес, куда вернётся управление после возврата из функции.
|
Re: L2 PTS
Цитата:
мне в начале темы говорили про: push Adr ret я как понял в данном случае это не верно будет для call? |
Re: L2 PTS
Такс ладно собравшись с мыслями я что то вообще в тупик попал.
Размер push Adr ret6 байт, а размер call Adr5 байт и вот тут и получается бред какой то... Далее нужно же после вызова моей функции вернуться к оригинальной и тут я вообще в тупик попал что то Тогда нужно писать что то вроде mov rax, Adr // моя функция call rax mov rax, Adr // оригинал call raxи опять же размер больше 5 байт и все пойдет через попу..:redlol: :):Развернуть ↓ |
Re: L2 PTS
Sojang, для начала определитесь вообще, что Вы хотите, а не бездумно копируйте код)
jmp - безусловный переход и не более того. push/ret - аналог jmp. call - кидает на стек текущий адрес и прыгает на указанный адрес; если функция ret-ается, то у нас происходит возврат туда откуда был call (адрес caller'a на стеке же есть). Для вызова оригинальной функции нужно выполнить, то что было затерто переходом (jmp/push-ret/call), обычно это пролог функции по какому-нибудь calling conventions, а-ля, stdcall для win32. При вызове оригинальной функции, мы смещаемся на то количество байтов, которое мы перетерли. Пример: адрес функции 0x1000, мы переписали первые 5 байт на jmp, значит мы реализуем перетертые 5 байт и делаем переход на 0x1005, грубо говоря. Если затерто было БОЛЬШЕ пролога, да и вообще чето как-то получилось, то что размер перетертых команд не совпадает с размером команд, которыми мы заменили, то пишем дизассемблер длин, нопим кривые куски команд и делаем все то же самое, но реализовывать обратный переход надо уже с учетом того, что мы нопнули. Можно конечно оботись костылем такого вида: если у нас перехваченная функция гарантированно дергается в один поток, то можно просто снимать хук, когда мы хотим перейти назад и ставить его опять, после того, как мы получим результат работы функции. Главное не забыть сбросить instruction cache, иначе ничего не поменяется;) |
Re: L2 PTS
Цитата:
Я вообще туплю что то и нихуа не понимаю :redlol::redlol: |
Re: L2 PTS
Окей, вот такая штука:
http://klikr.org/b3681a10f4268d699e2421aa4fbc.png Это и есть пролог. Вообще рекомендую прочитать про calling convention. Многое станет ясно. Вот ты это заменяешь на jmp addr.В конце выполнения ты можешь сделать jmp в то место откуда пришел и программа продолжит выполнение. Или же сделать ret и она вернет значение. |
Re: L2 PTS
Цитата:
однако остались вопросы про Цитата:
|
Re: L2 PTS
Я думаю стоит начать с литературы, а то кол-во вопросов так и будет увеличиваться.
|
Re: L2 PTS
Цитата:
что нибудь посоветовать можете из книг? |
Re: L2 PTS
Sojang, Крупника\Юрова можно почитать. У них там вроде и учебники есть для вышек и простые книги для масс.
С забугорными не знаком. |
Re: L2 PTS
Цитата:
Ты берешь 5 байт и копируешь их к себе. Затем вместо 5 байт пишешь jmp в свою функцию. Там делаешь все, что нужно, после этого вызываешь 5 байт, которые перенес после чего делаешь jmp обратно (на тот же адрес который ты заменил +5 байт). http://coderx.ru/showthread.php?t=3609 Вот почитай. Вообще зря ты на х64 полез, не разобравшись с х32. Я могу ошибаться, более опытные форумчане думаю поправят. |
Re: L2 PTS
Цитата:
|
Re: L2 PTS
Ну я уверен, что есть более легальные способы, вот мои идеи:
делаешь dummy функцию, например с мессадж боксом и вместо ее пишешь jump |
Re: L2 PTS
Цитата:
спасибо в любом случае:) |
Re: L2 PTS
появилась новая проблема :D
Меняю начало функции на свой код(mov rax, адрес jmp rax) и все окей функция из моей длл вызывается, но как только я пытаюсь выполнить свой asm код(нужен что бы продолжить работу программы) приложение зависает и закрывается.. Из за чего это происходит?( Немного инфы из Dump File:Развернуть ↓Оригинал код:Развернуть ↓Мой код:Развернуть ↓ |
Текущее время: 16:14. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot