Просмотр полной версии : Радар своими руками
Ребят, кто с пакетами работает, подскажите какая сейчас там структура NetworkPacket?
такая же как и много страниц назад http://coderx.ru/showpost.php?p=89200&postcount=73
Хм, значит что-то я недопонимаю...
Т.к. аналогичную структуру и юзаю, но такое ощущение, что с данными что-то не то....
Ладно, буду вечером дома, надо будет внимательнее посмотреть...
Просто как только не пробовал считывать - никак не могу получить норм данные пакета(т.е. то на что указывает последний параметр), вот и предположил, что мб просто структура изменилась...
Добавлено через 4 часа 2 минуты
Тааакс))
Вроде бы разобрался)))
Это мне уже начинает нравиться))
Теперь никто не поделится структурой основных пакетов? пока то что нашел - не хило устарело... А все разбирать самому - довольно муторно будет)
Aries, скачай с этого сайта пакет хак там есть инишник с описанием пактов вплоть до фреи.
спс, за подсказку)
Никогда не юзал и даж не смотрел пакетхак, вот и не знал, что там пакеты в инишках хранятся))))
Ща буду разбираться)))
Добавлено через 1 час 15 минут
Хм, эт получается каждый элемент в перевернутом виде в пакете что ли хранится?
Взял для начала
09=CharSelectionInfo:d(ListSize:Loop.03.0066)d(7)c (0)s(Name)...
Получается вот так приходит...
05 00 00 00 07 00 00 00 00 42...
1. Первые 4 байта - количество чаров на аккаунте (5)
2. 4 байта под цифру 7
3. 1 байт - 0
4. дальше имя и т.д.
Так ведь все?
Если так, то в какой кодировке имя передается?(ну или сразу скажите как его разобрать)
n1ghtmare
11.02.2011, 21:19
Ну байты в числах всегда задом на перед, а строка в юникод формате, 2 байта на символ, окончание это 2 нулевых байта подряд.
Все, спасибо большое)) действительно так)))
Блин, все ведь прям в явной форме, а я ток ща это заметил.....
обьект лежит в какойто глобальной переменной поэтому смещение должно на разных осях совпадать. Пока не перекомпилят енгине.длл)
Добавлено через 3 минуты
если знать иерархию обьектв то можно найти хандлер хукнув какойнить другой обьект.
Да в юзере есть все. Но привязыватса к таким недокументированым данным не есть хорошая манера имхо
Ну попробовав что такое пакеты, я понял, что это куда проще)))) и возможностей куда больше)))
А в юзере пока разберешься, где что есть(кроме самых основных показателей) уже помоему весь мозг убьешь)))
supernewbie
24.03.2011, 16:22
как лучше\проще отправлять пакеты от имени сервера? добавлять через Add или как-нибудь через Dispatch
PS Add почему-то не добавляет мой PNetworkPacket :\
где-то на страницах этой темы говорится о том что надо как-то особенно выделять память через апи клиента, так ли это?
Добавлено через 16 минут
уф, ну хоть пакет убился в диспатче, и то ладно
PS нашёл ошибку, хендлер не тот получал, щас клиент как раз сказал типо хочу освободить память а там шайтайн бугульмэ..
я щас отказалса от использования диспатча. Слишком заметное влияние тормозов програмы/клиента друг на друга. Если клиент лагает тормозит бот.
supernewbie
25.03.2011, 16:38
у адда буфера, сокеты и тд, так что даж хз че делать
я симитировал механизм клиента. В хуке адднетворка я буферизирую пакет в свою очередь. Поток проги ее разбирает и диспетчирует по аналогии с диспатчнетгоркквеи.
supernewbie
25.03.2011, 19:24
интересно, сколько ты на это времени потратил?)
supernewbie
25.03.2011, 22:20
хех, над будет посмотреть, а то всё времени нет, эти лейм гвард какие проверки только не придумают, по факту наверное придется жить в engine.dll чтобы что-то делать вообще)
// если у нас для этого пакета имеетса обработчик то выполняем
if assigned(phTable[ppacket.id]) then if (ppacket.id<>$1F) then begin
// копируем пакет и его содержимое в буффер
ntb:=@ntbuffer;
pdata:=pointer(DWORD(ntb)+sizeof(TNetworkPacket));
ntb^:=ppacket^;
CopyMemory(pdata,ppacket.data,ppacket.size);
ntb.data:=nil;
// сохраняем содержимое буффера в очередь пакетов
if not TL2C.nhandler.netbuffer.Write(ntb,sizeof(TNetworkP acket)+ ppacket.size)then begin
transmessage('netbuffer overflow');
end;
end;
все что делаетса в хуке адднетворка.
Добавлено через 56 секунд
Е*УЧИЕ ТЕГИ ФОРУМА о5 ЧЕРЕЗ жопу. лано итак понятно
supernewbie
27.03.2011, 01:55
это ещё пол беды, защиты в своей криптопроцедуре изменяют пакет (добавление хвид в AuthLogin, etc), а она под темидой, чежеделать...
Добавлено через 23 часа 47 минут
// если у нас для этого пакета имеетса обработчик то выполняем
if assigned(phTable[ppacket.id]) then if (ppacket.id<>$1F) then begin
// копируем пакет и его содержимое в буффер
ntb:=@ntbuffer;
pdata:=pointer(DWORD(ntb)+sizeof(TNetworkPacket));
ntb^:=ppacket^;
CopyMemory(pdata,ppacket.data,ppacket.size);
ntb.data:=nil;
// сохраняем содержимое буффера в очередь пакетов
if not TL2C.nhandler.netbuffer.Write(ntb,sizeof(TNetworkP acket)+ ppacket.size)then begin
transmessage('netbuffer overflow');
end;
end;
все что делаетса в хуке адднетворка.
Добавлено через 56 секунд
Е*УЧИЕ ТЕГИ ФОРУМА о5 ЧЕРЕЗ жопу. лано итак понятно
больше интересно как ты его потом разбираешь
это ещё пол беды, защиты в своей криптопроцедуре изменяют пакет (добавление хвид в AuthLogin, etc), а она под темидой, чежеделать...
Добавлено через 23 часа 47 минут
больше интересно как ты его потом разбираешь
я тоже дошол до того места где начинаетса полиморфичная обфускация кода) дальше понял что нужны большие вложения времени и сил и забил =) пока петух не клюнет наф нада
Добавлено через 6 минут
repeat
rdsize:=TL2C.nhandler.netbuffer.Read(pckBuffer);
if assigned(TL2C)then inc(TL2C.clientdata.disp_perf); // bedug
if rdsize>buffer_size then begin
smessage('netbuffer oversize');
end;
if rdsize<>0 then begin
pckBuffer.data:=pointer(DWORD(pckBuffer)+sizeof(TN etworkPacket));
//IDirect3DDevice9H(idev_).StrWrite('pread '+inttohex(pckbuffer.id,2)+' '+inttostr(rdsize),0);
DispatchNetwork_handler(pckBuffer);
end;
until rdsize=0;
except
smessage('netbuffer process exception');
exit;
end;
разбираетса еще проще (кусок кода из потока бота выбирающий пакеты)
DispatchNetwork_handler(pckBuffer); - вот тут поток бота разбирает пакет вытащенный из буффера. здесь он может его обсчитывать сколь угодно =)
Добавлено через 16 минут
да и кстати, если хукаеш диспатч при переключении окна во 2 план клиент резко сбрасывает скорость опроса в диспатче от чего бот начинает зверски тупить. если заблочить переход в экономящий режим (тотже -nosleep) то фоновой клиент будет эпически грузить процессор.
бот жрущий 25% проца это экстрим :)
supernewbie
27.03.2011, 18:59
то есть ты свой диспатч не написал, насколько я понял ты сделал свой UNetworkHandler::Tick
во 2 план клиент резко сбрасывает скорость опроса в диспатче
угу, эт по ходу от фпс зависит, тоже надо решать как-то, скорее всего также как у тебя сделаю)
в адднетворке пакет сохраняетса в очередь. Поток проги как в тике клиента каждые 10мс проверяет очередь обрабатывая все накопленые в ней пакеты.
Вот тока этому потоку пох и на фпс и на лаги клиента)
supernewbie
28.03.2011, 16:10
в адднетворке пакет сохраняетса в очередь. Поток проги как в тике клиента каждые 10мс проверяет очередь обрабатывая все накопленые в ней пакеты.
Вот тока этому потоку пох и на фпс и на лаги клиента)
как он их обрабатывает? просто вызывает клиентский диспатч?
нет клиентский диспатч разбирает пакеты из своей очереди как и должен. Поток проги из своей очереди. В итоге бот и клиент работают независимо друг от друга. Адднетворк в оригинале скидывал пакеты в очередь клиента, щас скидывает в 2.
Этот алгоритм счел оптимальным и менять уже не буду.
supernewbie
29.03.2011, 18:16
а, в две, я то думал ты из своего массива и боту и клиенту как-то раздаёшь)
а, в две, я то думал ты из своего массива и боту и клиенту как-то раздаёшь)
и чем бы это отличалось от хука диспатча :cool:
цель была нежно разделить поток клиента и бота чтоб не мешали друг другу делать вещи
supernewbie
30.03.2011, 03:08
дак че будем делать с так называемой обфускацией? темиду вообще как-то можно снимать?
ну есть деобфускаторы кода вроде как в виде плагинов ольки. Сам неюзал не уверен что решат проблему) а вообще отдельные гении за круглую сумму это деалают. Но как не делятса. Если тока както наипать фиму чтоб она распаковала этот код не как защищеный в памяти но возможно ли
Добавлено через 3 минуты
распаковщики тоже есть но по факту работают тока в пределах каковато билда винлиценза я бы даже сказал приложения.
supernewbie
31.03.2011, 08:01
как думаешь, чем они читают данные об обордовании? через WMI или это слишком просто?
врятли, вми не на всех виндах работает как положено. Посмари монитором реестра куда лезет клиент (он дохера куда лезет) но пара веток интересны.
Регмон не юзай его фима детектит)
supernewbie
31.03.2011, 09:30
че ж заюзать то такое тогда)
если инфа беретса неоттуда то по крайней мере можна спалить какие драйвера запрашивает для этова. Хотя ореанс хитрые могли и тут схитрить))
Добавлено через 2 минуты
непомню какой но юзал 100500 работал.загугли. Нетмон как и другие утилиты от сисинтерналс в черном списке у фимы
supernewbie
31.03.2011, 12:00
и чем бы это отличалось от хука диспатча :cool:
цель была нежно разделить поток клиента и бота чтоб не мешали друг другу делать вещи
интересно кстати как ты убиваешь пакет от сервера если вычисления в адд нетворке проводить нельзя
конечно можно удалять по иду, а если надо по содержимому пакета определить удалять или нет?
Добавлено через 21 минуту
бааалииин) если хукать после входа в крт секцию то переполнения буфера, или чего там ещё из-за чего вылетало, не будет, щет..
убиваю в адднетворке ненужные тупо заменяя ид пакета на 1f это не требует никаких существеных задержек.
Добавлено через 5 минут
ну вот смари. Сокет при инициализации создает кольцевой буфер(блок памяти) все пакеты приходящие с сети копятса в нем
Добавлено через 1 минуту
приложение по мере возможности достает их оттуда и обрабатывает
Добавлено через 2 минуты
но если програма иза долгих расчетов или тормозов начнет доставать пакеты медленее их поступленйя буфер переполнитса и драйверу сокета будет негде сохранять принятые даные
Добавлено через 1 минуту
это приведет к потере пакетов или крашу
Добавлено через 3 минуты
поэтому в клиенте сделали механизм адднетворк/диспатч чтобы можно было накапливать огромное колво пакетов более гибко не грузя сокет.
supernewbie
31.03.2011, 12:36
а если надо вычеслить, что если то-то то-то то-то, там то там то, ну вообщем задействовать мозги бота, и только обдумав удалить пакет, че тогда делать?
не если там перебрать масив из 30 элементов и какиенить переменные то пож. Если здоровые масивы строк, файловые и графичиские операции, работа с бд, звуком, слипы - то не стоит
Добавлено через 1 минуту
понято что в аднетворке не стоит по ряду причин слать ответный пакет)
supernewbie
31.03.2011, 12:56
ну вообщем пока эксперементально сделаю...
я разуметса тоже разбираю в аднетворке пакет перед удалением. И чето там вычисляю нужен он мне или не. Если требуетса убиваю, если он нужен боту то скидываю его копию в очередь бота. Он там уже разберетса че с ним делать далее)
supernewbie
31.03.2011, 13:31
*ля, по-моему клиент в энергосберегающем режиме даже адд нетворк как-то тормазнуто вызывает, или тут просто всё тормазит
старая пх через сокеты слала пакеты быстрее, инфа 100%)
я наепываю клиент и он не переходит в лайт-моде) тик клиента торможу сам до фпс 2к/с. В итоге он не знает ниче про этот режим но почти не грузит проц и ниче не рисует вообще в фоновом режиме -)
supernewbie
31.03.2011, 14:33
как ты это сделал ты естесна не скажешь?)
ну тут небуду это писать чтоб не нарушать сон разрабов защит)
supernewbie
31.03.2011, 15:19
хех, ладно, судя по всему что-то связанное с MainLoop там точно присутствует)
PS они не спят..
PSS опробуй своего бота на rp g-cl ub.com, потом сообщишь результат :rolleyes:
че там за защитка? поди ище и хвид банит при инжекте? =)
Добавлено через 1 минуту
нет не на майнлуп, все на более примитивном (низком) уровне. скажу так - из апи клиента вообще ничего не хукаю кроме адднетворка
supernewbie
31.03.2011, 19:22
че там за защитка? поди ище и хвид банит при инжекте? =)
не не, там по ходу побайтовая проверка апи клиента
Добавлено через 37 секунд
Добавлено через 1 минуту
нет не на майнлуп, все на более примитивном (низком) уровне. скажу так - из апи клиента вообще ничего не хукаю кроме адднетворка
пакеты от клиента то не нужны?)
не не, там по ходу побайтовая проверка апи клиента
Добавлено через 37 секунд
пакеты от клиента то не нужны?)
ну да сендпакет тоже перехвачен) хотя это больше для исследовательской цели чем для функционала
supernewbie
31.03.2011, 21:06
я для исследовательской цели ещё логин сенд пакет хукнул :)
Что-то решил я свой радар переписать заново, привести к более человеческому виду все, и тут вдруг стал ломать голову, где же лучше проводить все вычисления: конкретно в моей проге или все же прямо внутри клиента в заинжекченной дллке?
У кого какие есть доводы, как лучше бы сделать?))))
И аналогичный вопрос и со скриптовым языком, где лучше его выполнять?
у тебя радар чтоли в отдельном процессе?) а как у тя выводитса тогда спискок целей?
Канечно все в длл делать
Добавлено через 12 минут
так.. Вроде все щас работает как хотел, пользователи счастливы.
Можно занятса доведением интелекта ботов до совершенства и доработать движок интерфейса, наделать всяких красивых менюшек и окошек)
у меня все через ж... сделано было, т.к. я конечно посчитав себя мега умным xD стал изучать все и сразу, при этом на первом удачном варианте прекращал поиск каких-либо более правильных решений и переходил дальше)) в итоге получилось щас такое, что я сам не понимаю как это все еще может работать xD xD
по сути принцип работы был такой, что дллка помещает в маппед память всю нужную мне инфу, а уже сам радар обрабатывает ее ну и т.д....
Но вот как-то вариант с маппед памятью уже помоему заранее обречен)) Особенно при учете подключения радара к нескольким клиентам...
Вот и теперь интересует как все-таки более правильно бы организовать все взаимодействие, чтобы потом не было опять такой мысли : "Пля, как то мну не нравится это все, дай ка я все снова перепишу"))))
у меня тоже маппед память но для взаимодействия между клиентами)
supernewbie
07.04.2011, 23:18
почему-то клиент в свернутом режиме и AddNetwork редко вызывает, в чём прикол то?
почему-то клиент в свернутом режиме и AddNetwork редко вызывает, в чём прикол то?
наскока редка?
supernewbie
09.04.2011, 01:46
ну не в свернутом сразу приходят пакеты
А при запуске клиента с опцией -nosleep ? Но опция скоко понимаю добавлена только разработчиками сср в кач-ве компенсации ботов.
supernewbie
11.04.2011, 11:44
я и говорю, в нослипе приходят сразу пакеты, и это не опция ссра, таже самая галка в игре есть епт
Ну тогда тоже тебе придетса извращнутса заблочив стандартный режим экономии и при желании сделать свой
Добавлено через 3 минуты
Как это делаетса хз стоит ли тут писать
supernewbie
11.04.2011, 15:51
ну можешь в пм яхз
Ну если там ничего сверхсекретного нет, то почему бы и нет?))
Я бы вот тож не отказался взглянуть... Хотя пока мну это не напрягало особо, т.к. в большинстве своем с активными окнами взаимодействую, но явно потом такая же проблема появится (хотя, как мну кажется, проблем там много не возникнет, но зачем в лишний раз ковырять, если кто-то уже решил эту проблему?)))
ЗЫ mira, а народ иногда не напрягает этот интерфейс радара прямо в клиенте?(или ты реализовывал и функции его скрытия?) а то на этапе переработке своих решений стал задумываться, мб тоже стоит так делать)))
supernewbie
11.04.2011, 16:16
блин, а я до рисования не допёр ещё, там легко хоть? или также как путь по геодате искать?
Добавлено через 6 минут
+ ещё вопрос, надо ж как-то получать PoastMessage, о5 хук или че-то другое?
Добавлено через 3 минуты
ну там для получения сообщений кто че нажал кто куда тыкнул или я че-то нетак понимаю?)
блин, а я до рисования не допёр ещё, там легко хоть? или также как путь по геодате искать?
Моих поверхностных взглядов хватило, чтоб нарисовать пару примитивов и на этом все закончилось)) В принципе, ничего сложного вроде, хотя без всяких листвью и т.п., я пока хз как там вообще реализовать все отображение))) Полностью описывать свои классы для них - эт ппц будет)
Кстати в ХФ4 ничего не менялось особо в плане графических методов?
Добавлено через 1 минуту
Добавлено через 6 минут
+ ещё вопрос, надо ж как-то получать PoastMessage, о5 хук или че-то другое?
Добавлено через 3 минуты
ну там для получения сообщений кто че нажал кто куда тыкнул или я че-то нетак понимаю?)
Эм, а цели - для чего оно надо?
supernewbie
11.04.2011, 16:53
ну дак, создаешь так Тбаттон, по клику должно че-то произойти, вот
ну дак, создаешь так Тбаттон, по клику должно че-то произойти, вот
если захочеш создать Тбаттон как дочерний элемент окна игры (типа внутриигровой интерфейс) то надо будет хукать процедуру обработки сообщений (WndProc) для "по клику должно че-то произойти" (экспортируемая, вроде в коре). А по хорошему все бы делать на директХ - у меня не хватило терпения в нем разбираться ) там ппц кодоемко все
supernewbie
11.04.2011, 17:20
лан, с этим потом, над разобратся уже с пакетами и с геодатой, а то этот придурок так клева обходит препятствия
supernewbie
11.04.2011, 17:47
мб кто загуглит че-нить нормальное с сорцами на делфе по теме поиска путей?)
я хз, волновой алгоритм - наше все)))))
по-моему ничего больше знать не надо))
А про сорцы, нужны ли вообще?))) там все пишется не так долго
supernewbie
11.04.2011, 20:15
волновой? нук..
мб кто загуглит че-нить нормальное с сорцами на делфе по теме поиска путей?)
поищи курсовые с 1го-2го курса
supernewbie
11.04.2011, 20:20
дык а стар и есть волновой
ну да, Стар - направленный волновой, т.е. более быстрый, но не факт что найдет лучшее решение да и не факт, что вообще найдет...
Но в чем проблема?))) Чем тебя не устраивает то?
Кстати, а там вообще какие-то подводные камни есть с геодатой или все довольно просто и ясно?) а то линейку ковыряю недавно и на все пока времени не хватило еще))))
Разумеетса у меня скрытие по хоткею всего интерфейса. Но это скорей чтоб скрины были чистыми, а в процессе игры окно проги мне нужно скажем не менше чем панелька со скилами.
Добавлено через 7 минут
если захочеш создать Тбаттон как дочерний элемент окна игры (типа внутриигровой интерфейс) то надо будет хукать процедуру обработки сообщений (WndProc) для "по клику должно че-то произойти" (экспортируемая, вроде в коре). А по хорошему все бы делать на директХ - у меня не хватило терпения в нем разбираться ) там ппц кодоемко все
это ты еще очень упрощено написал) клиент например обрабатывает сообщения нажатия мышки тока для подсветки интерфейса а не для самого нажатия. Темболее окно будет прозрачным для клика даже если хукнеш оконную процедуру и погасиш месаги
Добавлено через 19 минут
Мне вот интересно. Какой процедурой рисуетса перс в игре и текстуры. Ченеть там еще завернуть) я хз че еще реализовать щас вроде все идеально.
supernewbie
12.04.2011, 12:37
я так понял там ещё хукать и хукать)
Мне вот интересно. Какой процедурой рисуетса перс в игре и текстуры. Ченеть там еще завернуть) я хз че еще реализовать щас вроде все идеально.
мне бы твои проблемы((((
У мну пока еще все настолько сыро, что ппц...
а самое паршивое, что максимум наверно час-полтора свободного времени в день есть...
Так что такими темпами мои идеи иссякнут и все станет "вроде идеально" походу через несколько лет xD
supernewbie
12.04.2011, 16:15
все идеально.
за тыха умеет гамать бот?) за спины забегать и тд)
за тыха умеет гамать бот?) за спины забегать и тд)
бек-атаки и антибеки я отношу к разряду плюшек которые реализовать в принципе не сложно только зачем)
говорю про качество работы ядра программы а не про возможности бот-движка, на это тоже времени толком нет да мб и необходимости. Каму нада в скрипте наколбасят
Добавлено через 13 минут
Вот например команда tryUseSkill в кач-ве параметров принимает набор флагов(характеристик) желаемово скила типа:
требует тарет+наносит урон+немассовый. Второй параметр опционально типа: должен рутить или шокировать.
ядро найдет в скиллисте список доступных скилов по параметрам:
скил соответствует хар-кам
скил уже откатилса
скил не нубо-лвла
скил совместим с таргетом
скил(по памяти)имеет шанс по цели хотябы 5%
персонаж не находитса в состоянии когда нельзя юзнуть(дебаф например или дохлый)
Добавлено через 3 минуты
Затем сортирует список по шансам успеха (по памяти) для данной цели и тока потом шлет пакет. Поидее этой команде ваще пох че за профа и лвл.
А состояние когда кастуется др скил не относится к пункту "персонаж не находитса в состоянии когда нельзя юзнуть"?))
Кстати, где-то у нас фиксируется время отката скилла и время на его каст, или придется самому писать алгоритмы рассчеты?
Ах да и вообще зачем такая извращенная функция, как tryUseSkil, может пригодиться?)
Команда при юзе ждет завершения каста или сообщения о том почему не получилось применить. Такчто пока не выполнитса запрос до конца второй раз ты его не вызовеш
Добавлено через 1 минуту
Ну например скрипт не нужно переписывать под конкретного чара с его линками и аугами и лвлом.
Добавлено через 2 минуты
Не будет пытатса юзать чего нет или невтему, и наоборот если есть чето другое все пойдет в оборот)
Добавлено через 3 минуты
Кстате в бд ауги невсе описаны) данные от бредфена были неполные а так работает четка)
Ну вобщем суть грубо говоря - юзаем все что есть... Типо если парик мобов, например, то юзаем все массовые дамажащие скилы по откату?
Ну в принципи, да - идея все таки хорошая)) Но по-сути такие функции используются довольно редко)
У неня все не так просто)
supernewbie
13.04.2011, 13:32
tryUseSkill
не хватает самой главной проверки)
Цель не за стеной?
У неня все не так просто)
ну видимо всю суть проблемы, какие методы реализовывать надо и т.п., я начну как следует осознавать только при написании этой части ядра))))
Проверка на 'цель не видна' 'далеко' итд входят в сообщение о невозможности применить. При этом функция вернет соответствующий код ошибки типа.
1-не видна
2-скил прерван
3-цель далеко
4-цель уже мертва
итд
Добавлено через 2 минуты
Ну не все предусмотрено канеш но там тупо лень
supernewbie
13.04.2011, 14:10
т.е. он ещё каких-то системных сообщений ждёт перед тем как вернуть значение?
Ждет с сервера магикскилюзед, либо сисмесаджа о проблеме или еще пары пакетов чтоб вернуть код выполнения запроса.
supernewbie
13.04.2011, 15:05
т.е. чисто в теории всё может *банутся и ждать пакетов?
Там 6 сек ожидания ответа вроде. Если ниче не пришло вернет ошибку 'скил невыполнен'.
в расширеном варианте функции есть параметр waittimeout где сам указываеш скока ждать.
Добавлено через 2 минуты
Мне всеравно кто что думает про мою камасутру, если я так сделал значит это нужно и это работает.
supernewbie
13.04.2011, 15:42
да не, по идее всё норм
над тока гео прикрутить и ваще за*бца
Там 6 сек ожидания ответа вроде. Если ниче не пришло вернет ошибку 'скил невыполнен'.
в расширеном варианте функции есть параметр waittimeout где сам указываеш скока ждать.
Добавлено через 2 минуты
Мне всеравно кто что думает про мою камасутру, если я так сделал значит это нужно и это работает.
Тут никто ничего плохого про твою камасутру не говорит)))
По мне - так просто интересно узнать кто и как различные вещи реализует, вдруг решу, что данная идея реализации явно лучше, чем у меня были мысли/или уже реализовано))))
Добавлено через 1 минуту
да не, по идее всё норм
над тока гео прикрутить и ваще за*бца
с кратчайшим путем разобрался?
С гео тоже лень/некогда. Готовую бы реализацию прикрутил если бы понравилось как сделано но нефакт. У меня очень жесткие требования к коду =) Его скорости ресурсоемкости и гибкости особенно.
Добавлено через 5 минут
Кстате галуха ты гео уже прикрутил? Тока поиск осталса?
Покажи как сделал, не думаю что там чтото сильно секретное
supernewbie
13.04.2011, 17:15
с поиском маюсь, как сделал..
код сразу грю что неочень, + пришлось неудобно делать для поиска пути, flat тип в 64 штуки переделывать вместо одной.
поиск пути почти сделал, доделываю
вернее сказать оптимизирую
Интересно, что там можно оптимизировать?)
Алгоритм он для всех, можно сказать, один))
ЗЫ Тут весь форум на делфях пишет?)))))
supernewbie
13.04.2011, 17:28
много чего, выделение памяти например
Ну как что. У кавото этот алгоритм жрет 10мб а у кавото 100 при это дико фрагментируя память и грузя проц. Код с утечками памяти вообще не рассматриваю.
supernewbie
13.04.2011, 17:42
алгоритм поиска вроде робит, но щас такой тупняк с мультилвлами начнётся яхз
я кстате так и непонял как они реализованы
Добавлено через 1 минуту
чар бежит и опа телепорт - и ты уже гдето выше на 5000 и левее
supernewbie, ты какую геодату юзаешь? Явовскую?
supernewbie
13.04.2011, 20:45
supernewbie, ты какую геодату юзаешь? Явовскую?
да, птс лучше штоле?
supernewbie, я просто алгоритм чтения гео от ПТС нашел а теперь не могу эту геодвту найти.
supernewbie
13.04.2011, 21:08
но тогда ты не пробывал алгоритм, тем более геодата от птс и явы не отличаются почти, алгоритм в студию
supernewbie, алгоритм поиска пути я еще не доделал. А вот про нахождение пути между слоями мне даже страшно подумать.
supernewbie
13.04.2011, 23:08
над проверить, сами сервера то умеют между слоями путь делать или нет
Я пробовал на ява сборке с геодатой бегать. Путь между слоями находит лишь в небольших пределах. Тоесть доводит до ближайшего перехода на тот слой и во втором слое ведет дальше. Но если нужно найти путь с первого слоя на третий минуя второй то уже ступор.
supernewbie
13.04.2011, 23:44
хм, неплохо)
Надо както аи протекции сделать полуше. Вчера на эпике кардинил из другой патьки пытаясь кидать босу мас-дебафы начал цеплять нашего флагнутово сопартийца без клана. От чего саппы принелись яростно нюкать и станить обидчика, как им было обьяснить что они не бухие.
Добавлено через 1 час 38 минут
Ептесь еще хф ставят хз из чего датапак билдить
supernewbie
14.04.2011, 13:47
откуда они сборку достали интересно,
и фениксы ли это? по-моему врятли..
откуда они сборку достали интересно,
и фениксы ли это? по-моему врятли..
99% тотже сервер с коррективами под хф. Клиент другой и о5 изменены с десяток пакетов. Феникс 100%
Добавлено через 12 минут
Снова нада пакеты разбирать или инфу искать. Интересно че там будет за защита)
supernewbie
14.04.2011, 15:36
думаю ничего особенного не поставят..
с*ка клиент не апдейтится
Prixmegently
14.04.2011, 20:31
фрост научился автобанить за хук / инжект? Сам не проверял, друг говорит.
supernewbie
14.04.2011, 20:57
врятли, он подождёт пока ты не спалишь 10 85+ персов, а потом уже..
фрост научился автобанить за хук / инжект? Сам не проверял, друг говорит.
На руофе забанили аккаунт со спойлером 74...
Крафтера 60 пока не трогают, хотя бегал со своим радаром на обеих.
А ведь предохранялся - поверх игрового окна ничего не рисовал, имена экспортов затирал сразу после инжекта...
Хотел же давно слезть с АддНетворкКуеуе...
фрост научился автобанить за хук / инжект? Сам не проверял, друг говорит.
сомневаюсь... Отслеживать перехват некоторых функций - мб и умеет, но не больше...
Или мну терь например за фаервол банить будут, который во все процессы тоже инжектится?))
А какже всякая там эвистика, проверка сигнатур итд)
Добавлено через 18 минут
Качайте win DDK пишите драйвер режима ядра и хукайте таблицу прерываний на kernel mode ))
если знаете c++ и невпадла перегружать комп при каждой ошибке драйвера в блю скрин то через пару месецов вы будете на планку выше фроста, и им придетса выходить на тотже уровень))
сразу говорю это еще хуже ручнуго рисования директом, крайне сложно отлаживаетса и есть шанс грохнуть ос.
писал както драйвер, щас уже си то забыл
А какже всякая там эвистика, проверка сигнатур итд)
Добавлено через 18 минут
Качайте win DDK пишите драйвер режима ядра и хукайте таблицу прерываний на kernel mode ))
если знаете c++ и невпадла перегружать комп при каждой ошибке драйвера в блю скрин то через пару месецов вы будете на планку выше фроста, и им придетса выходить на тотже уровень))
сразу говорю это еще хуже ручнуго рисования директом, крайне сложно отлаживаетса и есть шанс грохнуть ос.
писал както драйвер, щас уже си то забыл
Ну уж неееет)) Ради всего-лишь маленького хобби такие извраты)))))
Ну если бы мне не оставили вариантов проще пришлось бы лезть туда.
а так если не имееш четково представления о работе ОС и если не знаеш че там хочеш делать с этим луше не связыватса, только нервы испортиш))))
Ну если бы мне не оставили вариантов проще пришлось бы лезть туда.
Ну я бы не сказал, что сейчас та ситуация, когда иннова не оставила вариантов))))
Хотя... с другой стороны это был бы хороший стимул поизучать особенности написания драйверов... по сути это далеко не лишние знания)
Ну в любом случае я закончу написания ядра бота, а потом буду думать уже о всевозможных вариантах реализации перехвата)))
Добавлено через 4 минуты
Хотя прежде чем я закончу написание ядра, мну нужно разобраться с кучей вдруг резконавалившихся на мну проектов(((
ЗЫ нет у нас тут знающих людей, кто подкинул бы исходники многопоточного управления устройствами (через COM, USB и т.п.)?)) А то имхо бред разрабатывать с 0 все, когда явно готовые решения существуют, ток я не могу их найти xD
Добавлено через 33 минуты
ХМ, почему как только задаешь, вопрос, сразу сам же начинаешь находить решения?))))
Ну да, есть варианты) это решение приготовления обеда посредством квантовой физики)
Ну да, есть варианты) это решение приготовления обеда посредством квантовой физики)
научишь?))))))
Хукнул адднетворк и сендпакет не модифицируя не 1 байта енгине длл =)
supernewbie
28.04.2011, 11:04
скоро и там они спалят) инфа 100%
Добавлено через 4 минуты
иль ты всё-таки метнулся на уровень ядра?)
Кто они? На ядро пока рано отступать, у них в юзермоде еще сотня лазеек.
Хукнул адднетворк и сендпакет не модифицируя не 1 байта енгине длл =)
Аппаратные регистры отладки ? Установка исключения по доступу к участку памяти ? Все равно, небось дильлька в адресное пространство процесса подгружается. У меня в ней почищены все символьные имена, при подгрузе она копируется в системную директорию винды, но все-равно сцыкотно.
Посему подгрузка драйвера ядра, который позволяет лазить по памяти процессов более универсален. Тако-же есть стремление, детальнее изучить внутренние структуры енгины.длл, чтоб обойтись только чтением памяти для радара.
И вообще надо меньше писать о способах инжекта и больше о том, че потом делать с полученными пакетами.
Да, и еще... Кого-нибудь на руоффе забаннили на левеле меньше чем 62 ?
А то, может уже засекли, но ждут, когда перс прокачается до 74 или около того...
Я и непишу о том как. Нет драйвер нужен не для чтения адрессного пространства :)
да инжектитса, но фрост сами признали что не ставят себе цель искоренить инжект как таковой (много хороших програм его юзают) они отслеживают скорей активность програм и модулей и все посягнувшее на святая святых карают жестоко.
Добавлено через 21 минуту
Нет не одного способа дающего гарантию не быть спаленым как и нет такой защиты которую не пройти.
подскажите, пожалуйста, логику функции GetNextCreature. Если я правильно понял, то она поочередно возвращает указатель на структуру User всех "живых" объектов в пределах указанного радиуса?
К примеру я делаю так: вызываю ее с параметром prevID = 0 она мне возвращает структуру User, из которой я беру ID (это получается ID моего чара). Затем я ее опять вызываю с только что полученым ID в надежде, что функция вернет мне указатель на структуру User следующего чара в пределах радиуса. Однако она опять же возвращает мне User моего чара.
Или список UserID нужно брать из другой функции и уже по нему пробегаться функцией GetNextCreature?
Насколько помню у меня эта функция возвращала моегоже перса)
нормально работала только GetNextEnemy (оторая впрочем юзаетса нексттаргетом).
GetNextCreature помоему неюзабельна в данных версиях движка
Весьма печально.
А GetNextEnemy как и NextTarget вернет только мобов, флагнутых и иже с ними, в фиксированом маленьком радиусе? То есть получить список всех чаров вокруг уже не получится?
Может кто подскажет как на хрониках Freya+, юзая только апи клиента, без перехвата пакетов, получить список чаров находящихся в определенном радиусе?
Весьма печально.
А GetNextEnemy как и NextTarget вернет только мобов, флагнутых и иже с ними, в фиксированом маленьком радиусе? То есть получить список всех чаров вокруг уже не получится?
Может кто подскажет как на хрониках Freya+, юзая только апи клиента, без перехвата пакетов, получить список чаров находящихся в определенном радиусе?
это тоже что GetNextCreature 1 в 1 тока вернет все что attackable.
GetNextNPC еще есть аналог возвращающий нпс (непомню чем у меня кончилась игра с ней, но мне непонадобилась) и GetNextCreature возвращающая самого себя =) хотя попробуй радиус сделать большой может еще каво зацепит
там целая серия однотипных методов как раз вида GetNextCreature, GetNextEnemy и еще штук 5 наверно... Поройся в экспортируемых функциях...
По поводу того как оно работает могу сказать одно: криво))))
Попробуй просто взять id и зацикли вызов этой функции с постоянным id... Радиус задай 2к... Даю около 90%, что списочек будет состоять не из 1 твоего персонажа...
Почему у тебя не так работает, могу предположить, что выдергиваешь ты далеко не id из структуры, а что-то другое и поэтому вызываешь функцию, которая при любом неверном значении id изначально вернет указатель на тебя... Либо второй вариант - id в этой структуре давно не играет никакой роли)
Покумекал, работает нормально. GetNextCreature работает как и должна работать, возвращает всех чаров в указанном радиусе. Хроники ХФ. Проблема была в моей невнимательности. Я предавал радиус целым, а не вещественным типом )) Поменял тип переменной на single, заработало
Ну я так и думал что с радиусом напутал чето)
ковряюсь со структурой User, разобрал почти все основые параметры чара в хрониках ХФ4. но ни как не могу вдуплиться где хранится Location чара. смею предположить, исходя из структуры C6, что в структуре храниться только указатель на FVector, а где найти этот указатель и кроме того, правильно прочитать из этого указателя не получается. Вариант: побайтно перебрать структуру User в поисках указателя и анализировать память куда он указывает. Но это ж ппц, голова кругом идет. Может у кого есть описание структуры User для HighFive part4 ?
ковряюсь со структурой User, разобрал почти все основые параметры чара в хрониках ХФ4. но ни как не могу вдуплиться где хранится Location чара. смею предположить, исходя из структуры C6, что в структуре храниться только указатель на FVector, а где найти этот указатель и кроме того, правильно прочитать из этого указателя не получается. Вариант: побайтно перебрать структуру User в поисках указателя и анализировать память куда он указывает. Но это ж ппц, голова кругом идет. Может у кого есть описание структуры User для HighFive part4 ?
там указатель на обьект uPawn. если рассматривать его как структуру
в ней лежит вектора 3 или 4. причем там вроде как не single а double
Самый логичный выход: расковырять исходники ява сервера и посмотреть струкртуру User)))
Самый логичный выход: расковырять исходники ява сервера и посмотреть струкртуру User)))
это самый нелогичный вывод. так как char в сервере и pUser в клиенте вообще ничего общего не имеют и никак не связнаы структурно
вчера бегло осмотрел исходник UserInfo.java от Фреи, все параметры, которые я подобрал в программе, совпадают. возможно далее в структуре и будут расхождения при более детальном расмотрении яхз.
У меня сейчас другая проблема, GetNextCreature на руоффе возвращает только имя, расу и пол чара, остальные поля пустые. Это особенность ХФ4 или особенность руоффа?
Да... Не знаю конечно о совершенно всех показателях, но например ХП, ЦП и т.д. точно пустые.
GetNexCreature возвращает все показатели только если вызываешь ее с радиусом 1, ну то есть только для своего перса. И это помоему не особенности руоффа или ХФ4, а особенности самой функции. Вот же ж блин засада.... придется ковырять и ковырять
GetNexCreature возвращает все показатели только если вызываешь ее с радиусом 1, ну то есть только для своего перса. И это помоему не особенности руоффа или ХФ4, а особенности самой функции.
хм, кстати никогда не думал по этому поводу, ибо долго не возился и решил, что все ж пакеты куда эффективнее)
Смотря для каво ты смотриш мп хп и цп. Если для чара - то начиная вроде как с с4 клиенту (да и боту) эти данные серв не шлет и узнать их невозможно. Для моба можно узнать только выделив его в таргет
Смотря для каво ты смотриш мп хп и цп. Если для чара - то начиная вроде как с с4 клиенту (да и боту) эти данные серв не шлет и узнать их невозможно. Для моба можно узнать только выделив его в таргет
Спорный вопрос... Как минимум в самой первой грации на руоффе радары отлично отображали хп цели (и мобы, и игроки, и нпсы). Потом был фикс и хп стало возможно отображать только в процентном эквиваленте (опять же мобы, игроки,нпсы)... Как сейчас дела обстоят уже не знаю)
а никто не разлуливал как понять живая цель или трупик?)
а никто не разлуливал как понять живая цель или трупик?)
Думаю мне скоро предстоит с этим столкнуться. Если узнаю, отпишусь.
Ну тогда фиг со всем MP CP и прочими параметрами. Имя, раса, класс, пол и профа передаются, и хорошо. Осталось найти где прячется Location чаров, оно то полюбому передается. Сегодня хочу подробно разобраться со структурой юзер
Добавлено через 1 час 19 минут
это самый нелогичный вывод. так как char в сервере и pUser в клиенте вообще ничего общего не имеют и никак не связнаы структурно
Оказалось именно так. Совпала только часть струкруты. остально - хлам ((
Что за класс L2ParamStack? как с ним работать, передавать в хукнутую функцию?
UPD: Вопрос снимается )) опять моя невнимательность. перепутал местами параметры.
а никто не разлуливал как понять живая цель или трупик?)
Лучше поздно, чем ни когда. ))
Хук на функцию UGameEngine::OnDie(struct User *, class L2ParamStack &)
из User вытаскиваешь айдишник и смотришь кто там помер.
Вызывается не только в момент фактической смерти чара/нпц но и при его прогрузке, когда он уже лежит мертвый в какой нибдуь локе, а ты туда ТП к примеру делаешь. В общем, в любом случае, эта функция даст знать о том, что кто то подох.
Кто знает как используя Api клиента Л2 можно закрывать открытые в нем диалоги и окна?
Например я программно автоматически беру пати, но в клиенте л2 остается висеть диалог ("Да" / "Нет") который по истечению таймаута шлет пакет с отказом принять пати.
supernewbie
11.07.2011, 15:17
убивать пакет
supernewbie, так и делаю, а другие варианты?
Лучше поздно, чем ни когда. ))
Хук на функцию UGameEngine::OnDie(struct User *, class L2ParamStack &)
из User вытаскиваешь айдишник и смотришь кто там помер.
Вызывается не только в момент фактической смерти чара/нпц но и при его прогрузке, когда он уже лежит мертвый в какой нибдуь локе, а ты туда ТП к примеру делаешь. В общем, в любом случае, эта функция даст знать о том, что кто то подох.
неужто по другому никак, про эту штуку то я зная - только там злое слово - хук - а это уже палево, я свой продукт строю на основе "ниче не переписывать в клиенте"
Кто знает как используя Api клиента Л2 можно закрывать открытые в нем диалоги и окна?
Например я программно автоматически беру пати, но в клиенте л2 остается висеть диалог ("Да" / "Нет") который по истечению таймаута шлет пакет с отказом принять пати.
"Программно" берешь пати - это послыкой пакета или через АПИ?
неужто по другому никак, про эту штуку то я зная - только там злое слово - хук - а это уже палево, я свой продукт строю на основе "ниче не переписывать в клиенте"
ну на данный момент я не вижу других способов
почему в теме посты пропадают? :D
почему в теме посты пропадают? :D
мб консперация?) кто спрашивал прочел и типа хватит )))
Demion, Morfik, мордеры не дремлют, в удаленных сообщениях ничего нужного кому либо небыло...
подскажет кто такую дилему в тему радара - от сервера сначала приходит пакет 31=CharInfo о человеке и только после этого 89=PledgeInfo откуда можно вытащить имя клана - так вот как нормально отображать в радаре этого человека?
Morfik, эти пакеты ведь приходят почти одновременно. Сделай у себя в массиве с персами поле которое отвечает зи информацию о клане, пока оно не заполнено отображай этого перса как то иначе, типа - статус не определен. Я в не определенном статусе он будет отображатся не более долей секунды.
Morfik, эти пакеты ведь приходят почти одновременно. Сделай у себя в массиве с персами поле которое отвечает зи информацию о клане, пока оно не заполнено отображай этого перса как то иначе, типа - статус не определен. Я в не определенном статусе он будет отображатся не более долей секунды.
так не хотелось хранить всю эту кучу инфы о юзерах...
сделаю ка я так - если не определен клан не удалять пакет из своей очереди а запихивать его в конец очереди, пусть ждет пока прийдет на него КланИнфо
запихивать его в конец очереди, пусть ждет пока прийдет на него КланИнфо
Наверняка появятся подводные камни.
А что пинфа о юзерах вообще в радаре не будет храниться?
Наверняка появятся подводные камни.
как нистранно но вроде работает нормально
А что пинфа о юзерах вообще в радаре не будет храниться?
а вот ту я погорячился, хранить их придется (
так не хотелось хранить всю эту кучу инфы о юзерах...
сделаю ка я так - если не определен клан не удалять пакет из своей очереди а запихивать его в конец очереди, пусть ждет пока прийдет на него КланИнфо
у меня отдельный класс tpledgedata для этой цели с методами типа:
tpledgedata.GetClanName(clanid:dword):string
tpledgedata.isenemy(clanid:dword):boolean
Morfik, кстати ты разобрался по поводу мобов и чаров которых уже на карте как бы нет а сервер не прислал пакет DeleteObject? Так и не могу понять по какой логике клиент л2 их удаляет бех этого пакета.
Хз я при событии телепорт на всяк очищаю. Проблем нет
Хз я при событии телепорт на всяк очищаю. Проблем нет
кстати тоже так делаю)
Надо попробовать.
Но бывает и без телепорта на карте есть моб а реально его уже нет.
У меня проблема,может поможет кто =) Никак не могу сделать возврат таргета при агре танка,т.е. я,например, выделил биша,танк агром на себя таргет перекинул и нужно чтобы радар вернул таргет на биша. Помогите с алгоритмом, а то у меня с моим таргет начинает прыгать с танка на биша и обратно
Breadfan
26.08.2011, 12:47
так пока на тебе висит агр танка - сервер сам буит следить чтоб твой таргет был "заблокирован" на танке, если, конечно, это не забытая богами фришка. Никакие алгоритмы там не помогут.
так пока на тебе висит агр танка - сервер сам буит следить чтоб твой таргет был "заблокирован" на танке, если, конечно, это не забытая богами фришка.
Это то понятно.
Сделал чтобы запоминался Objectid при приеме пакета MyTargetSelected, когда приходит пакет таргет селектед или анселектед,пытаюсь вернуть таргет назад. Даже без танка получается карусель таргетов если я вначале выделил одного нпц,потом другого - по ним скачет таргет. ХЗ в чем проблема.
Breadfan
26.08.2011, 13:06
грубо говоря примерно так мб:
if !ImAgr and recieve(MyTargetSelected) then curtarget:=id(MyTargetSelected);
....
if ImAgr then SaveCurTarget:=curtarget;
.....
If !ImAgr and SaveCurTarget<>0 then Target(SaveCurTarget);SaveCurTarget=0;
Это то понятно.
Сделал чтобы запоминался Objectid при приеме пакета MyTargetSelected, когда приходит пакет таргет селектед или анселектед,пытаюсь вернуть таргет назад. Даже без танка получается карусель таргетов если я вначале выделил одного нпц,потом другого - по ним скачет таргет. ХЗ в чем проблема.
у тя рекурсия походу =)
пакеты:
таргет снят с цели а.
Выбрана цель б.
Прога:
хоп таргет потерян! Выбрать снова а!
Пакеты:
таргет снят с цели б.
Выбрана цель а.
Прога:
хоп таргет потерян! Выбрать снова б!
И поновой :)
Добавлено через 11 минут
Начиная с некоторых хроник скилы типа targetme накидывают дебаф ваще не дающий сменить цель. Недавно добавил обнаружение наличия таких абнормалов.
до этого делалу у биша примерно так:
settarget(кавонадаполечить);
casted:=useskill(мажор хил,...);
if not casted then begin
if lastskillfail=SF_INVALIDTARGET then useskill(масс мажор хил,...);
end;
Ребяты ктонеть разобралса где считывать направление взгляда камеры? Хотябы какая там апи
class DLL_IMPORT UWindowsViewport : public UViewport
{
char Unknown1[0x0224 - 0x01ac];
public:
virtual INT Exec(TCHAR const *, class FOutputDevice &);
virtual ~UWindowsViewport();
virtual void Destroy();
virtual void ShutdownAfterError();
virtual INT Lock(BYTE *, INT *);
virtual void Unlock();
virtual INT IsFullscreen();
virtual INT ResizeViewport(DWORD, INT, INT, INT);
virtual void SetModeCursor();
virtual void UpdateWindowFrame();
virtual void OpenWindow(DWORD, INT, INT, INT, INT, INT);
virtual void CloseWindow();
virtual void UpdateInput(INT, FLOAT);
virtual void * GetWindow();
virtual void SetMouseCapture(INT, INT, INT);
virtual void Repaint(INT);
virtual void TryRenderDevice(TCHAR const *, INT, INT, INT);
virtual TCHAR * GetLocalizedKeyName(enum EInputKey);
virtual void PlayForceFeedBack(INT, FLOAT);
virtual void TickForceFeedBack(FLOAT);
virtual void SetMouseDisable(INT);
virtual INT IsDefaultConsolePos();
virtual INT IsMouseCaptured();
private:
static class UClass PrivateStaticClass();
public:
INT CauseInputEvent(INT, enum EInputAction, FLOAT);
static struct IDirectInput8W * DirectInput8();
void EndFullscreen();
static INT STDCALL EnumAxesCallback(struct DIDEVICEOBJECTINSTANCEW const *, void *);
static INT STDCALL EnumEffectsInFileProc(struct DIFILEEFFECT const *, void *);
static INT STDCALL EnumJoysticksCallback(struct DIDEVICEINSTANCEW const *, void *);
static class L2FFEffect FFEffect();
class UWindowsClient * GetOuterUWindowsClient() const;
DWORD GetViewportButtonFlags(DWORD);
static void CDECL InternalConstructor(void *);
static struct IDirectInputDevice8W * Joystick();
static struct DIDEVCAPS JoystickCaps();
static struct IDirectInputDevice8W * Mouse();
void SetDefaultConsolePos(INT);
void SetTopness();
static class UClass * CDECL StaticClass();
void ToggleFullscreen();
UWindowsViewport();
UWindowsViewport(class UWindowsViewport const &);
long ViewportWndProc(unsigned int, unsigned int, long);
static void * CDECL operator new(unsigned int, class UObject *, class FName, DWORD);
static void * CDECL operator new(unsigned int, enum EInternal *);
class UWindowsViewport & operator=(class UWindowsViewport const &);
};
вьюпорт не совсем то что нужно :) камера скорее свойство какойнеть ugameengine. Вьюпорт в лице главного окна отвечает за весь конечный ввод-вывод user<->engine.
В UCanvas есть
virtual void DrawCameraSceneNode();
virtual void DrawCameraSceneNode(INT, INT, INT, INT, INT);
мб при перехвате их что то можно достать)
Я хз, камерами не занимался.
+ в UCanvas есть паблик переменные
class DLL_IMPORT UCanvas : public UObject
{
public:
class UFont* Font; //0034 0
FLOAT SpaceX; //0038 0
FLOAT SpaceY; //003c 0
FLOAT OrgX; //0040 0
FLOAT OrgY; //0044 0
FLOAT ClipX; //0048 0
FLOAT ClipY; //004c 0
FLOAT CurX; //0050 0
FLOAT CurY; //0054 0
FLOAT Z; //0058 0
BYTE Style; //005c 0
FLOAT CurYL; //0060 0
class FColor DrawColor; //0064 0
BITFIELD bCenter : 1; //0068 0
BITFIELD bNoSmooth : 1; //0068 0
INT SizeX; //006c 0
INT SizeY; //0070 0
...............................................
..............................................
Канвас помоему дря рендеренга на плоскости только.
Если метод есть там наверняка фигурирует ченеть типа FOV или view
Направление камеры -
Перехватываю ALineagePlayerController_PlayerCalcView
Запоминаю адрес класса
Перехват убираю
Угол поворота камеры получаю по по смещению 0x1C4 в классе
Кто-бы придумал, как вообще без перехвата этот угол получать.
Да и смещение может смениться...
void ALineagePlayerController_PlayerCalcView_hook(ALine agePlayerController *This, int /*edx*/, int Actor, FVector *Vector, FRotator *CameraRotation)
{
ALineagePlayerControllerThis = This;
ALineagePlayerController_PlayerCalcView(This, 0, Actor, Vector, CameraRotation);
Убираю перехват....
}
if (ALineagePlayerControllerThis) {
CameraYaw = *(PDWORD)((PBYTE)ALineagePlayerControllerThis+0x1C 4); //это работает Yaw тут
ну вот так и думал что какоенеть View )
Добавлено через 10 часов 33 минуты
А не пробывал взять в хуке сразу из rotator? В нем мб нече кроме yaw.pitch.roll кватерниона и нет нефига. А с таким смещением в контроллере тема не очень нравитса...
Так и делал раньше. Но хочется избавиться от хуков...
void __fastcall ALineagePlayerController_PlayerCalcView_hook(ALine agePlayerController *This, int /*edx*/, int Actor, FVector *Vector, FRotator *CameraRotation)
{
static int OldYaw;
ALineagePlayerController_PlayerCalcView(This, 0, Actor, Vector, CameraRotation);
if (CameraRotation->Yaw != OldYaw) {
OldYaw=CameraRotation->Yaw;
Отсылаем Yaw в модуль отрисовки радара..
}
}
в клиенте ГоД в некоторые функции добавили параметры. к примеру:
было
OnUserInfo(struct User *, class FVector, int, int, int, char, char)
стало
OnUserInfo(struct User *, class FVector, int, int, int, char, char, __int64 const &)
Как правильно передавать последний параметр (__int64 const &) из функции-ловушки в функцию-обработчик и потом в оригинальную функцию?
Старый кусок кода:
procedure OnUserInfo_Call(user: pointer; x,y,z: single; u1,u2,u3: single; s1,s2: integer); stdcall;
asm
push s2;
push s1;
push u3;
push u2;
push u1;
push z;
push y;
push x;
push user;
mov ecx, geh;
mov esp, ebp;
pop ebp;
jmp [OnUserInfo_Original];
end;
procedure OnUserInfo_New(h: integer; user: pointer; x,y,z: single; u1,u2,u3: single; s1,s2: integer); stdcall;
begin
...
//делаем свои делишки
...
OnUserInfo_Call(user, x,y,z, u1,u2,u3, s1,s2);
end;
procedure OnUserInfo_Hook(user: pointer; x,y,z: single; u1,u2,u3: single; s1,s2: integer); stdcall;
asm
push s2;
push s1;
push u3;
push u2;
push u1;
push z;
push y;
push x;
push user;
push ecx;
call OnUserInfo_New;
end;
Как теперь передавать этот последний параметр? Я просто не пойму синтаксис Си, что означает этот параметр? Если бы был простой int, char или pointer то вопросов не было бы. А вот с этим, яхз...
maxilam, а в чем проблема то int - 32битное целое, __int64 - 64битное. следовательно новое значение либо как два int передаёшь либо собсно сразу как int64, в дельфи int64 есть, правда не помню с какой версии начиная
ассемблер дельфийский не понимает int64 (Дельфи2010). при
push u; где u: int64 ругается Invalid combination of opcode and operands. Двумя интами пробовал передавать, клиент критует при вызове оригинальной функции.
Меня напрягает знак "&". Если не ошибаюсь, в Си это ссылка? Альтернативой в дельфи вижу pointer, но однако с поинтером тоже критует при вызове оригинальной функции.
Вот уже третий день ломаю голову. может просто кто нибудь уже сталкивался с int64 в хуках функций, ведь в клиенте она не одна такая функция.
supernewbie
21.09.2011, 09:08
вот так робит :D, но это явно какое-то извращение
procedure Test(const i:Int64); stdcall;
begin
ShowMessage(inttostr(i));
end;
var
i:Int64;
a:array [0..1] of integer;
i1,i2:integer;
begin
i:=874987897987;
Move(i,a,8);
i1:=a[0];
i2:=a[1];
asm
push i2
push i1
call test
end;
end.
Меня напрягает знак "&". Если не ошибаюсь, в Си это ссылка?
Да.Это ссылка)
Попробуй к примеру это значение принять и передать как DWORD (нам похрену сколько разрядов, передаем то только адрес значения)...
Вот не понятно только зачем по ссылке передавать константу
Вот не понятно только зачем по ссылке передавать константу
Ну чтобы случайно не изменить значение внутри функции... Это не означает, что само значение является константой
Не эт понятно, зачем тогда передавать по ссылке а не копию значения.
Скорее потому что в i32 архитектуре нет опкодов для маневра с непосредственными 64 битными операндами :)
строки константы передаютса именно по ссылке, и далеко не факт что данные эти нельзя изменить
Не эт понятно, зачем тогда передавать по ссылке а не копию значения.
Ну сам же понимаешь, если адрес занимает меньше памяти, чем значение, то лучше передать адрес)))
хотя насчет данной ситуации - другой вопрос)
Ну сам же понимаешь, если адрес занимает меньше памяти, чем значение, то лучше передать адрес)))
хотя насчет данной ситуации - другой вопрос)
Тут тогда возникает вопрос почему не использовали обычный указатель.
еманарот. блин, оказывается все банальнее было. в функции изменились первые пять байт и хук вставал криво. что ж я сразу то не посмотрел (((
Спасибо вам за советы, а эту ссылку int64 можно передать обычным pointer'ом.
Однако там в некоторых функциях есть и просто переменная int64, так что ваши подсказки бессомнения будут для меня важны в будущем.
Тут тогда возникает вопрос почему не использовали обычный указатель.
ну все нормальные люди вроде так и делают)))
а тут наверно корейцы таким способом решили типо имитировать "передачу по значению", чтоб не было возможности изменить исходное, но между тем выиграть во времени, не передавая само значение)
Короче по факту приписка const была чистой формальностью, чтобы сразу было видно, что это значение внутри функции изменять нельзя...
ЗЫ надо на заметку взять себе такую идею для оформления)
Корейцы ниче там не надумали а написали ченеть типа proc(const int64...)
компилятор сгенерил такой код, как он всегда впрочем и делает.
Корейцы ниче там не надумали а написали ченеть типа proc(const int64...)
компилятор сгенерил такой код, как он всегда впрочем и делает.
Вполне возможно, что и так...
Хотя сомневаюсь, что у них компилятор все выражения вида proc(const ...) переводит в proc(const &...).
Правда все равно смысла нет это обсуждать, т.к. эт ничего для нас не изменит))))
Кто знает что еще коренным образом изменится в клиенте ГОД. Движок хоть тот же анрыл остается?
движек анриловский остался. хуки старые работают, просто изменились параметры в некоторых экспортируемых функциях.
Возможно поменялись айдишники пакетов. или на фришке на которой я тестирую стоит шифрация.
Уже есть ГОД фришки????
ты отстал от жизни))
они появляться начали уже с тех пор как вышел корейский птс-клиент))))))
Aries, дай плиз ссылку на какую-нибудь из них.
Подскажите,какой пакет нужно перехватить,чтобы узнать свой персонаж в боевом режиме или не в боевом? в userinfo чет я не нашел
Тотже анрил 2.
На 3 пока не замахнули, добавили просто анимаций и спецэффектов красивых.
supernewbie
22.09.2011, 11:08
Подскажите,какой пакет нужно перехватить,чтобы узнать свой персонаж в боевом режиме или не в боевом? в userinfo чет я не нашел
AutoAttackStart/Stop, RelationChanged
AutoAttackStart/Stop, RelationChanged
т.е. для RelationChanged этот флаг:
public static final int RELATION_ATTACKER = 0x00400; // true when attacker?
и AutoAttackStart это когда встал в боевую стойку, а стоп когда стоишь руки в брюки?
supernewbie
22.09.2011, 19:01
не, релейшен_аттакер эт вроде че-то про кв
я имел ввиду
CE=RelationChanged:d(ObjectID)d(Relation)d(AutoAtt ackable)d(Karma)d(PvpFlag)
про AutoAttackStart - да
не, релейшен_аттакер эт вроде че-то про кв
я имел ввиду
CE=RelationChanged:d(ObjectID)d(Relation)d(AutoAtt ackable)d(Karma)d(PvpFlag)
про AutoAttackStart - да
я чето не смог отловить этот релейшн чанжед) мб не в удачное время ловил стоя в городе)
supernewbie
23.09.2011, 11:18
я чето не смог отловить этот релейшн чанжед) мб не в удачное время ловил стоя в городе)
он при каждом спавне персонажа шлется
айдишников проф перерожденных ни у кого нету?
Подскажите может кто сталкивался, делаю
@UNetworkHandler_MoveBackwardToLocation:= GetProcAddress(hModule,'?MoveBackwardToLocation@UN etworkHandler@@UAEXVFVector@@0@Z');
потом, как описано ранее,
procedure MoveTo(x,y,z,x1,y1,z1:single); stdcall;
asm
push z1
push y1
push x1
push z
push y
push x
mov ecx, nh
call UNetworkHandler_MoveBackwardToLocation
end;
все работает, только пакет на движение отправляется без последнего Dworda который указывает с клавы был сделан ввод или с мыши, на оффе это вроде прокатывает а на фришках банят.
Привожу код оригинальной ф-и с Иды, если чем-то поможет, я в ассемблере как в английском - половину понимаю, но сказать не могу :)
; int __stdcall UNetworkHandler__MoveBackwardToLocation(float, float, float, float, float, float)
public ?MoveBackwardToLocation@UNetworkHandler@@UAEXVFVec tor@@0@Z
?MoveBackwardToLocation@UNetworkHandler@@UAEXVFVec tor@@0@Z proc near
var_4= dword ptr -4
arg_0= dword ptr 4
arg_4= dword ptr 8
arg_8= dword ptr 0Ch
arg_C= dword ptr 10h
arg_10= dword ptr 14h
arg_14= dword ptr 18h
push ecx
fld [esp+4+arg_0]
push ebx
push ebp
push esi
push edi
mov [esp+14h+var_4], ecx
call __ftol2_sse
fld [esp+14h+arg_4]
mov esi, eax
call __ftol2_sse
fld [esp+14h+arg_8]
mov edi, eax
call __ftol2_sse
fld [esp+14h+arg_C]
mov ebx, eax
call __ftol2_sse
fld [esp+14h+arg_10]
mov ebp, eax
call __ftol2_sse
fld [esp+14h+arg_14]
mov [esp+14h+arg_0], eax
call __ftol2_sse
mov ecx, [esp+14h+var_4]
mov ecx, [ecx+48h]
mov edx, [ecx]
push eax
mov [esp+18h+arg_C], eax
mov eax, [esp+18h+arg_0]
push eax
push ebp
push ebx
push edi
push esi
push 0Fh
push offset aCdddddd ; "cdddddd"
push ecx
mov ecx, [edx+6Ch]
call ecx
mov edx, [esp+38h+arg_C]
mov eax, [esp+38h+arg_0]
mov ecx, ds:?GNetworkLog@@3PAVFOutputDevice@@A ; FOutputDevice * GNetworkLog
push edx
mov edx, [ecx]
push eax
push ebp
push ebx
push edi
push esi
push offset aSendMovebackwa ; "(Send)MoveBackwardToLocation X:%d Y:%d "...
push edx
call ds:?Logf@FOutputDevice@@QAAXPBGZZ ; FOutputDevice::Logf(ushort const *,...)
add esp, 44h
pop edi
pop esi
pop ebp
pop ebx
pop ecx
retn 18h
?MoveBackwardToLocation@UNetworkHandler@@UAEXVFVec tor@@0@Z endp
vahes, где то уже писали что клиент юзает не эту функцию для перемещения, эта устаревший балласт оставшийся с древних времён)
Добавлено через 3 минуты
вот сообщение об этом http://coderx.ru/showpost.php?p=162102&postcount=18
пасиба, вот вдруг кому пригодится:
@UNetworkHandler_MoveBackwardToLocation:= GetProcAddress(hModule,'?MTL@UNetworkHandler@@UAEX PAVAActor@@VFVector@@10HHH@Z');
procedure MoveTo(x,y,z,x1,y1,z1: single); stdcall;
var ms: integer;
begin
ms:=0;
asm
push ms
push ms
push ms
push ms
push z1
push y1
push x1
push z
push y
push x
push ms
mov ecx, nh
call UNetworkHandler_MoveBackwardToLocation
end;
end;
если не сложно подскажи какие ф-и л2 использует для взятия в таргет, юза скила и атаки?
Добавлено через 14 минут
public: virtual void __thiscall UNetworkHandler::RequestMagicSkillUse(class L2ParamStack &)
public: virtual void __thiscall UNetworkHandler::RequestActionUse(class L2ParamStack &)
; int __stdcall UNetworkHandler__RequestAttack(int, float, float, float) что-то из этого? если да где взять - L2ParamStack &?
...где взять - L2ParamStack &?
класс из Core.dll
Создавать и использовать через эти функции:
AdrL2StackCreate:=adrProc('core.dll','??0L2ParamSt ack@@QAE@H@Z');
AdrL2StackClear :=adrProc('core.dll','?Clear@L2ParamStack@@QAEXXZ' );
AdrL2StackPushBack:=adrProc('core.dll','?PushBack@ L2ParamStack@@QAEHPA_W@Z');
AdrL2StackTop :=adrProc('core.dll','?Top@L2ParamStack@@QAE_JXZ') ; //
AdrL2StackFree :=adrProc('core.dll','??1L2ParamStack@@QAE@XZ');
Be3geBJIa3
02.12.2011, 11:42
Подскажите пожалуйста, какую функцию в клиенте можно перехватить чтобы узнать, что произошел дисконект, кроме функций в ws2_32.dll.
supernewbie
02.12.2011, 12:10
Подскажите пожалуйста, какую функцию в клиенте можно перехватить чтобы узнать, что произошел дисконект, кроме функций в ws2_32.dll.
по идее должен внд мессадж оповещающей о дисконнекте приходить
так что начни с хука мессаджей
пасиба, вот вдруг кому пригодится:
@UNetworkHandler_MoveBackwardToLocation:= GetProcAddress(hModule,'?MTL@UNetworkHandler@@UAEX PAVAActor@@VFVector@@10HHH@Z');
procedure MoveTo(x,y,z,x1,y1,z1: single); stdcall;
var ms: integer;
begin
ms:=0;
asm
push ms
push ms
push ms
push ms
push z1
push y1
push x1
push z
push y
push x
push ms
mov ecx, nh
call UNetworkHandler_MoveBackwardToLocation
end;
end;
Кто то пытался использовать сию конструкцию?
Реально функция объявлена так:
UNetworkHandler::MTL(class AActor *,class FVector,class FVector,class AActor *,int,int,int)
Если пытатся как в примере выше вместо class AActor * подсовывать нулевой указатель то клиент L2 вылетает с критом (хроники GOD).
Что входит в класс AActor?
Кто то пытался использовать сию конструкцию?
Реально функция объявлена так:
UNetworkHandler::MTL(class AActor *,class FVector,class FVector,class AActor *,int,int,int)
Если пытатся как в примере выше вместо class AActor * подсовывать нулевой указатель то клиент L2 вылетает с критом (хроники GOD).
Что входит в класс AActor? Пробовал для фришек,нормально проходит. Для руоффа до сих пор использую MoveBackwardToLocation
Guzh, я тоже так для офа но возникло подозрение что оно палится.
Кто то пытался использовать сию конструкцию?
Реально функция объявлена так:
UNetworkHandler::MTL(class AActor *,class FVector,class FVector,class AActor *,int,int,int)
Если пытатся как в примере выше вместо class AActor * подсовывать нулевой указатель то клиент L2 вылетает с критом (хроники GOD).
Что входит в класс AActor?
а если подсунуть не нулевой указатель? А указатель на 0 или другое число?
в GOD (на руофе, про фришки не знаю) первый указатель class AActor * должен указывать на класс AActor вашего чара. Второй указатель class AActor * вроде бы можно заменить на 0 (точно уже не помню).
Получить эти указатели можно единожды хукнув MTL, в глобальные переменные скопировать указатели, расхучить MTL (у меня при вызове хукнутой MTL клиент критовал) и вызывать оригинальную MTL подставляя в AActor полученные ранее значения.
Минус этого способа в том, что при входе в игровой мир нужно мышкой сдвинуть чара, что бы вызвалась функция MTL и хук сделал свое дело.
procedure MTL_New(h: integer; A1: integer; x,y,z, x1,y1,z1: single; a2: integer; u1,u2,u3: integer); stdcall;
begin
Actor1:= a1;
Actor2:= a2;
UnHookCode(@MTL_Original);
MTL_Call(a1, x,y,z, x1,y1,z1, a2, u1,u2,u3);
end;
maxilam, наверно можно как то еще получить указатель на AActor.
supernewbie
23.12.2011, 17:37
да чем вам так сенд пакет то не угодил)
supernewbie
24.12.2011, 18:57
Yegor, почему я везде отправляю сенд пакетом и никаких автобанов нет?
supernewbie, потому что мы говорим про руофф, а там сам знаешь что бан приходит не сразу, но всегда неожиданно.
supernewbie
26.12.2011, 11:17
Yegor, то автобан, то не сразу
уже год на руоф захожу каждый месяц проверить че-нибудь, перехватываю в адднетворке, посылаю сенд пакетом - перс до сих пор не в бане
supernewbie, лично для меня использование АПИ дело привычки, тем более не вижу надобности переписывать софт, который и без перехвата пакетов работает замечательно.
Все верно пишет maxilam, используя Api почти ничего не нужно менять. При переходе на God я не изменил в механизме отправки ни одной функции. Только в последнем обновлении пришлось кое что подправить.
supernewbie
27.12.2011, 02:03
Yegor, долго разбирался как в клиенте всё работает? мб тоже попробовать на апи клиента че-нить сварганить
supernewbie, ты что уже доделал свой L2 сервер?
о! доделывай, а мы его про лэдвапэхакнем! :)
supernewbie
27.12.2011, 02:46
supernewbie, ты что уже доделал свой L2 сервер?
нет, но почему надо всё время заниматься только им)
вообще интересно сделать радар, который рисует с учетом поворота камеры в клиенте, тем более что в этой теме вроде была инфа по камере
Добавлено через 1 минуту
о! доделывай, а мы его про лэдвапэхакнем! :)
доп. шифрация пишется за час-два максимум
Доброго времени суток. Прошу подсказать неучу где я накосячил и как нужно правильно делать.
Почитал статьи Ms-Rem-а на wasm.ru по перехвату API функций, написал небольшой тестовый пример по перехвату функций из библиотеки wtsapi32, опробовал на своем проекте все нормально отрабатывает.
library WTSSession;
uses
Windows,
NativeAPI, Dialogs;
type
OldCode = packed record
One: dword;
Two: word;
end;
far_jmp = packed record
PuhsOp: byte;
PushArg: pointer;
RetOp: byte;
end;
_WTS_CONNECTSTATE_CLASS = (
WTSActive, // User logged on to WinStation
WTSConnected, // WinStation connected to client
WTSConnectQuery, // In the process of connecting to client
WTSShadow, // Shadowing another WinStation
WTSDisconnected, // WinStation logged on without client
WTSIdle, // Waiting for client to connect
WTSListen, // WinStation is listening for connection
WTSReset, // WinStation is being reset
WTSDown, // WinStation is down due to error
WTSInit); // WinStation in initialization
{$EXTERNALSYM _WTS_CONNECTSTATE_CLASS}
WTS_CONNECTSTATE_CLASS = _WTS_CONNECTSTATE_CLASS;
{$EXTERNALSYM WTS_CONNECTSTATE_CLASS}
TWtsConnectStateClass = WTS_CONNECTSTATE_CLASS;
PWTS_SESSION_INFOW = ^WTS_SESSION_INFOW;
{$EXTERNALSYM PWTS_SESSION_INFOW}
_WTS_SESSION_INFOW = record
SessionId: DWORD; // session id
pWinStationName: LPWSTR; // name of WinStation this session is connected to
State: WTS_CONNECTSTATE_CLASS; // connection state (see enum)
end;
{$EXTERNALSYM _WTS_SESSION_INFOW}
WTS_SESSION_INFOW = _WTS_SESSION_INFOW;
{$EXTERNALSYM WTS_SESSION_INFOW}
TWtsSessionInfoW = WTS_SESSION_INFOW;
PWtsSessionInfoW = PWTS_SESSION_INFOW;
var
JmpWTS: far_jmp;
OldWTS: OldCode;
PtrWTS: pointer;
function WTSEnumerateSessionsW(hServer: THandle; Reserved: DWORD; Version: DWORD;
var ppSessionInfo: PWTS_SESSION_INFOW; var pCount: DWORD): BOOL; stdcall; external 'wtsapi32.dll';
{$R *.res}
function TrueWTSEnumerateSessionsW(hServer: THandle; Reserved: DWORD; Version: DWORD;
var ppSessionInfo: PWTS_SESSION_INFOW; var pCount: DWORD): BOOL; stdcall;
var Written: dword;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @OldWTS, SizeOf(OldCode), Written);
Result := WTSEnumerateSessionsW(hServer, Reserved, Version, ppSessionInfo,pCount);
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @JmpWTS, SizeOf(far_jmp), Written);
end;
function NewWTSEnumerateSessionsW(hServer: THandle; Reserved: DWORD; Version: DWORD;
var ppSessionInfo: PWTS_SESSION_INFOW; var pCount: DWORD): BOOL; stdcall;
var i:Integer;
SI: PWTS_SESSION_INFOW;
begin
Result := TrueWTSEnumerateSessionsW(hServer, Reserved, Version, ppSessionInfo, pCount);
SI := ppSessionInfo;
if Result then
begin
for i:= 0 to Pred(pCount) do
begin
ShowMessage(SI.pWinStationName);
inc(SI);
end;
end
else
ShowMessage('False');
end;
Procedure SetHook();
var
Bytes: dword;
begin
PtrWTS := GetProcAddress(GetModuleHandle('wtsapi32.dll'), 'WTSEnumerateSessionsW');
ReadProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @OldWTS, SizeOf(OldCode), Bytes);
JmpWTS.PuhsOp := $68;
JmpWTS.PushArg := @NewWTSEnumerateSessionsW;
JmpWTS.RetOp := $C3;
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @JmpWTS, SizeOf(far_jmp), Bytes);
end;
Procedure Unhook();
var
Bytes: dword;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @OldWTS, SizeOf(OldCode), Bytes);
end;
Function MessageProc(code : integer; wParam : word;
lParam : longint) : longint; stdcall;
begin
CallNextHookEx(0, Code, wParam, lparam);
Result := 0;
end;
procedure DLLEntryPoint(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH: begin SetHook(); end;
DLL_PROCESS_DETACH: begin Unhook(); end;
end;
end;
begin
DllProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Решил попробовать на примере Л2 перехватить функции и зашел в тупик, клиент постоянно валится в крит, причем перехват происходит т.к. валится уже при вызове оригинальной функции. Возможно кто-то сможет растолковать неучу где я накосячил.
library Red;
uses
Windows,
NativeAPI, Dialogs;
type
OldCode = packed record
One: dword;
Two: word;
end;
far_jmp = packed record
PuhsOp: byte;
PushArg: pointer;
RetOp: byte;
end;
var
JmpWTS: far_jmp;
OldWTS: OldCode;
PtrWTS: pointer;
OriginalF: procedure(i:Integer); stdcall;
{$R *.res}
procedure CallF(i: Integer); stdcall;
asm
mov ecx, PtrWTS
mov esp, ebp
pop ebp
jmp [OriginalF]
end;
procedure NewF(i: Integer); stdcall;
begin
CallF(i);
end;
procedure HookF(i: Integer); stdcall;
asm
push ecx
push [ebp+8]
push ecx
call NewF
pop ecx
end;
Procedure SetHook();
var
Bytes: dword;
begin
PtrWTS := GetProcAddress(GetModuleHandle('engine.dll'), '?OnAcceptGameStart@UGameEngine@@UAEXH@Z');
OriginalF := GetProcAddress(GetModuleHandle('engine.dll'), '?OnAcceptGameStart@UGameEngine@@UAEXH@Z');
ReadProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @OldWTS, SizeOf(OldCode), Bytes);
JmpWTS.PuhsOp := $68;
JmpWTS.PushArg := @HookF;
JmpWTS.RetOp := $C3;
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @JmpWTS, SizeOf(far_jmp), Bytes);
end;
Procedure Unhook();
var
Bytes: dword;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @OldWTS, SizeOf(OldCode), Bytes);
end;
procedure DLLEntryPoint(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH: begin SetHook(); end;
DLL_PROCESS_DETACH: begin Unhook(); end;
end;
end;
begin
DllProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Буду признателен за любую помощь.
Надеюсь пробуешь на клиенте отвязанном от GG на какой нибудь фришке?
На астериосе :)
P.S. Кроме евроофа, руофа и астериоса больше нету клиентов, так что самый безобидный получается последний.
На астериосе :)
P.S. Кроме евроофа, руофа и астериоса больше нету клиентов, так что самый безобидный получается последний.
OllyDbg, безсонные ночи тебе в помощь ) Скорее всего там стоит аналогичный хук. Хук на хук получаешь AV клиента. Отладка-отладка и еще раз отладка.
Silent, найди фришку на которой работает L2ph (если нужна годовская фриха, велком ко мне в личку). И на ней уже отрабатывай свои хуки. На астериосе, если я не ошибаюсь, стоит защита.
По отладке могу дать один совет:
Когда получаешь адресс функции
PtrWTS := GetProcAddress(GetModuleHandle('engine.dll'), '?OnAcceptGameStart@UGameEngine@@UAEXH@Z');
сохрани память по этому адресу, размером к примеру 1024кб в текстовый файл. Потом открой этот файл через HEX Editor Neo. В нем есть встроеный дизасемблер (только в полной версии, и триальной). Через дизасемблер посмотри код функции.
Потом тоже самое сделай после хука функции. То есть сохрани участок памяти по адресу PtrWTS размером 1024 и посмотри как ложится твой хук на функцию.
С одной стороны гиморно, а с другой стороны, этот метод мне очень помогает в отладке хуков.
maxilam, гораздо проще сразу в памяти дизасамблить отладчиком и смотреть как стал твой хук, делаю это спомощью IDA
вопрос по теме, можно хукнуть фун-ю сплайсингом если engine.dll запакована фимой(или другой дрянью)?
Если дополнительно нет crc контролей в параллельных потоках, то вполне.
Вопросик:
Есть пакет -
$7B:ShowBoard:c(show)s(bbshome)s(bbsgetfav)s(bbslo c)s(bbsclan)s(bbsmemo)s(bbsmail)s(bbsfriends)s(bbs _add_fav)s(curPage)
Есть в engine.dll экспортируемая функция OnShowboardPacket,принимающая параметры int и L2ParamStack
И я никак не могу понять что и скока нуно передавать через L2ParamStack. МОжет ктонибуть пользовался этой функцией и подскажет что именно передавать(а то передавал и все строковые значения поотдельности и все вместе, и только curPage,но постоянно получал только пустое окошко Community).
tiranosaur
19.02.2012, 14:14
Господа подскажите пжл. Ставлю брекпоинт на AddNetworkQueue где там сруктура NetworkPacket? где именно она там?в стеке или в регистрах? и в каких или по какому адресу esp. запарился уже(
tiranosaur, структура находится по адресу в [esp+4]
tiranosaur
20.02.2012, 13:40
А можно в какой то функции прочитать все входящие пакеты как для исходящих
tiranosaur, а в AddNetworkQueue ты какие пакеты читаешь?.
tiranosaur
20.02.2012, 14:43
Я пытаюсь настроить прием пакетов от сервера, а через AddNetworkQueue у меня не получается, я все не пойму как их там отлавливать( сенд пакет уже настроил. вот сижу мучаюсь.
Добавлено через 2 минуты
Yegor, объясни пжл.
Добавлено через 2 минуты
может через какую то другую функцию организовывать прием будет удобнее
tiranosaur, нет через AddNetworkQueue самое оно. Каким методом ты перехватываешь эту функцию?
Может быть проблема в том, что у SendPacket соглашение вызова cdecl, а у AddNetworkQueue thiscall? Как понять "не пойму как их там отлавливать". В AddNQ передается указатель на структуру NetworkPacket (ид, субид, размер, данные пакета).
tiranosaur
20.02.2012, 23:49
у меня по esp -4 в дампе адрес какой то
Добавлено через 6 минут
а по нему хз что(
Добавлено через 1 минуту
отлавливать могу хуком в иат сплайсом эпилога функции. да как угодно. я на асме пишу
Добавлено через 1 минуту
мне понять бы что тама и как( вот в сенде все понятно. параметры через стек идут и все норм.
Тут как бы по факту для тебя один параметр в стеке. Это указатель на структуру вида:
struct NetworkPacket
{
unsigned char id;
unsigned char res;
short id2;
unsigned int size;
unsigned char* data;
}
tiranosaur
21.02.2012, 03:36
Блин уже крыша едет((( вот я остановился на push ebx в AddNetworkQueue.
вот я перехожу в дамп по значению esp-4
вот значения в дампе.
(esp-4) 06481BC0
01 1B FF FF 1C 00 00 00 60 D8 2E 14 B4 1B 48 06
06481BD0
01 00 00 00 A0 D8 2E 14 A8 1B 48 06 01 00 00 00
пожалейте убогого, объясните где что(
tiranosaur, http://coderx.ru/showpost.php?p=50250&postcount=36 эта же тема, сам когда то делал перехват с поста ксора
tiranosaur
21.02.2012, 04:26
Morfik, спасибо, но это описание как перехватить а меня структура NetworkPacket интересует. я ничего не понял в ней.
объясните на примере пжл.
вот мое esp-4 (0EB2F5B8 ) при остановке на AddNetworkQueue
вот данные стека.
0EB2F598 01 00 00 00 50 00 00 00 88 F5 B2 0E 01 00 00 00
0EB2F5A8 50 00 00 00 94 F5 B2 0E 01 00 00 00 E0 04 5B 15
0EB2F5B8 01 F5 FF FF 1C 00 00 00 C0 8C 5B 15 D0 F5 B2 0E
0EB2F5C8 01 00 00 00 ED 00 00 00 DC F5 B2 0E 01 00 00 00
0EB2F5D8 00 00 00 00 E8 F5 B2 0E 01 00 00 00 00 00 00 00
где что здесь.
Уточнение: не данные стека, а все-таки наверно данные по адресу из стека?)
И так на примере структуры что я написал (если тут корректные данные), и если я конечно ничего не путаю:
unsigned char id = 01
unsigned char res = F5
short id2 = FF FF
unsigned int size = 1C 00 00 00
unsigned char* data = C0 8C 5B 15
могу предположить, что данные правильные, вроде похоже.
Только не забывай об обратном порядке байтов, когда будешь разбирать данные, т.е. например размер пакета будет такой 00 00 00 1С.
А дальше по адресу в data лежат непосредственно данные пакета.
tiranosaur
21.02.2012, 12:36
Aries,
unsigned char id = 01 - это id пакета?
unsigned char res = F5-а что это?
short id2 = FF FF-а что это?
unsigned int size = 1C 00 00 00- это размер
unsigned char* data = C0 8C 5B 15- это данные
1-ид
2-мусор
3-расширение ид. Используетса для некоторых типов пакетов как правило начинающихся на Ex.... Тоесть id у них один а различаетса id2. Для большинства пакетов поле не используетса и равно ff.
Пример 2значного ид вроде пакеты группы id=d0
tiranosaur
21.02.2012, 13:16
Спс всем. дай вам наш Ботоводский Бог спокойного фарма.
Добавлено через 1 минуту
И пусть ботхантеры вас обойдут стороной
vBulletin® v3.6.11, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot