|
You last visited: Today at 21:16
Advertisement
Rus. server
Discussion on Rus. server within the Perfect World forum part of the MMORPGs category.
06/01/2009, 13:42
|
#286
|
elite*gold: 0
Join Date: Apr 2009
Posts: 49
Received Thanks: 1
|
Quote:
Originally Posted by silkytail
Еше как ищет.
|
Да, все ищет. То я ступил и искал не там, где надо
|
|
|
06/01/2009, 15:54
|
#287
|
elite*gold: 0
Join Date: Nov 2007
Posts: 160
Received Thanks: 28
|
О, модер объявился из спячки... Требует чтоб всё было на английском....
Походу нам придётся искать новое место для тусовки, ибо это, я чую, скоро прикроют.
|
|
|
06/01/2009, 16:15
|
#288
|
elite*gold: 0
Join Date: Apr 2009
Posts: 49
Received Thanks: 1
|
Вчера этой темы не было, кстати. Сегодня, видимо, разблочили. Надо сохранить, пока не поздно
|
|
|
06/02/2009, 08:24
|
#289
|
elite*gold: 0
Join Date: Jun 2008
Posts: 142
Received Thanks: 13
|
Легкий способ - поиск паттернов кода по коду и маске, определение используемых адресов. Продвинутый способ - с использованием простого дизассемблера.
|
|
|
06/02/2009, 12:46
|
#290
|
elite*gold: 0
Join Date: Apr 2009
Posts: 237
Received Thanks: 403
|
Спасибо за совет.
Но опять вернусь к инжекту кода 
Вот, например, я написал выделение цели ( [[[$009771BC]+ $20]+ $a68),
Quote:
mov eax,DWORD PTR [$009771BC]
mov ecx, p1 // target id
add eax,$20
mov eax,DWORD PTR [eax]
add eax,$a68
mov [eax], ecx
|
В первом посте  , после записи в память id цели, идут следующие строки:
Quote:
add ecx, $EC
mov edx, $005a5c00
call edx
|
Я правильно понял, что это функция выполнения действия (подобрать, взлететь, выделить)?
|
|
|
06/02/2009, 19:58
|
#291
|
elite*gold: 0
Join Date: Jun 2008
Posts: 142
Received Thanks: 13
|
Это на самом деле может быть все что угодно, начиная от какого-нибудь менеджера методов обьекта типа игрок и заканчивая функцией "сформировать и отправить пакет определенного типа"
Как искать .. как искать зверей в лесу? Идешь и ищешь  Кто долго копаются в клиенте знают много злачных мест, и примерная схема логики работы может подсказать нужное направление.
|
|
|
06/02/2009, 20:01
|
#292
|
elite*gold: 0
Join Date: Jun 2008
Posts: 142
Received Thanks: 13
|
А ты вообще в контексте клиента свой код пускаешь или как ?
|
|
|
06/02/2009, 21:11
|
#293
|
elite*gold: 0
Join Date: Apr 2009
Posts: 237
Received Thanks: 403
|
Да, в контексте программы  Ошибка возникает (именно в клиенте игры) при любой попытке записи в стек или вызове call.
Выполняемый код. Функционирует, т.е. цель выделяется (простая запись id цели в память).
Quote:
procedure SelectMonster(MonID: PParams);stdcall;
var
P1: cardinal;
begin
P1:=MonID^.Param1;
asm
mov eax, DWORD PTR [$009771BC]
mov ecx, P1
add eax,$20
mov eax,DWORD PTR [eax]
add eax,$a68
mov [eax], ecx
end;
end;
|
Но уже простая замена записи в регистр ecx значения P1, на помещение этого самого значения в стек (push P1), приводит к вышеуказанной ошибке. То же самое и с call.
|
|
|
06/02/2009, 22:54
|
#294
|
elite*gold: 0
Join Date: Apr 2009
Posts: 49
Received Thanks: 1
|
Не могу понять, за что зацепиться, чтобы найти смещения для координат чара. Подскажите, куда копать?
|
|
|
06/02/2009, 23:43
|
#295
|
elite*gold: 0
Join Date: Jun 2008
Posts: 142
Received Thanks: 13
|
Quote:
Originally Posted by dwar
Но уже простая замена записи в регистр ecx значения P1, на помещение этого самого значения в стек (push P1), приводит к вышеуказанной ошибке.
|
дык. Нельзя просто так заменять.  Приведи код, который не работает.
|
|
|
06/03/2009, 02:06
|
#296
|
elite*gold: 0
Join Date: Apr 2009
Posts: 237
Received Thanks: 403
|
После долгих раскопок, вот что получилось для имени игрока (оба дают имя чара):
[[[[[[$009771BC] +$04]+$08]+$1f0]+$16c]+$74]+$0
[[[[[[[[$009771BC] +$04]+$08]+$1f0]+$1a8]+$0c]+$16c]+$74]+$0
Версия клиента
[$00917480]
Билд клиента
[$00917484]
|
|
|
06/03/2009, 08:21
|
#297
|
elite*gold: 0
Join Date: Jun 2008
Posts: 142
Received Thanks: 13
|
ну, может быть два варианта. Либо ты портишь edx, который дельфя не сохраняет, либо нарушаешь балансировку стека
Quote:
|
Каким образом его надо записать, чтобы он работал?
|
А ты уверен, что по адресу 005AE040 для твоего клиента находится начало нужной функции?
|
|
|
06/03/2009, 10:30
|
#298
|
elite*gold: 0
Join Date: Apr 2009
Posts: 49
Received Thanks: 1
|
dwar, поделись, пожалуйста, каким образом нашел промежуточные смещения? Нужно сделать тоже самое для реализации передвижения.
|
|
|
06/03/2009, 11:55
|
#299
|
elite*gold: 0
Join Date: Nov 2007
Posts: 160
Received Thanks: 28
|
dwar, твои ошибки и AV являются следствием элементарного незнания/непонимания того, как объекты хранятся в памяти.
В-кратце поясняю :
1) большая часть функций типа __thiscall (в переводе на русский это будет this->subroutine)
2) особенность __thiscall в том, что этот самый this, то есть экземпляр класса ОБЯЗАТЕЛЬНО заносится в ecx, который и пушится перед вызовом функции.
В твоём коде, какгбы это по-мягче сказать.... ахинея :
Code:
asm
mov eax, DWORD PTR [$009771BC]
[B]mov ecx, P1[/B]
add eax,$20
mov eax,DWORD PTR [eax]
add eax,$a68
[B]mov [eax], ecx[/B]
end;
жирным выделено то, что делать нельзя.
Правильный инжект выглядит так :
Code:
procedure SelMonCall(MonID: PParams); Stdcall;
var
Address: pointer;
P1: DWORD;
begin
Address := Pointer(PW_SelMon_Call);
P1 := MonID^.Param1 ; // SN того кого хочешь взять в таргет
asm
pushad
mov eax,DWORD PTR [PW_BASE_ADDR]
push P1
mov ecx,DWORD PTR [eax+$20]
add ecx,$0EC
call address
popad
end;
end;
PW_BASE_ADDR вы уже знаете, а PW_SelMon_Call я вам пока не скажу - найти его будет вашим домашним заданием =)
P.S. Не забываем голосовать за Russian в теме и тогда у нас будет свой, русский раздел.
|
|
|
06/03/2009, 13:18
|
#300
|
elite*gold: 0
Join Date: Apr 2009
Posts: 237
Received Thanks: 403
|
Quote:
Originally Posted by Orion33
dwar каким образом нашел промежуточные смещения?
|
Стандартным, при помощи CE и долго-нудного отсеивания результатов. Для имени чара, вначале ищется текст в юникоде, ну а потом поехало, ведь уже после второго смещения выдается список как минимум из сотни адресов, но, зная, какие не дают результата, отсеивание идет быстро. Больше здесь советов дать невозможно.
А на счет передвижения, я тоже сейчас над этим работаю, но пока нет результата. Пытался искать float значения, но они ни к чему не привели. Самый лучший вариант – поиск Unknown initial value, с последующим отсеиванием changed/unchanged, - долго, трудоемко, но вероятность получить требуемый результат выше.
Quote:
Originally Posted by BuBucekTop
1) большая часть функций типа __thiscall (в переводе на русский это будет this->subroutine)
2) особенность __thiscall в том, что этот самый this, то есть экземпляр класса ОБЯЗАТЕЛЬНО заносится в ecx, который и пушится перед вызовом функции.
|
Учитель, спасибо за разъяснения!
Но, например, для записи значения в память, такой то код использовать можно?
Code:
asm
mov eax, DWORD PTR [Addr]
[b]mov edx, P1[/b]
add eax,$20
mov eax,DWORD PTR [eax]
add eax,$a68
mov [eax], edx
end;
P.S.
[$00981c2c] - Кол-во сделанных кликов в окне клиента
Дальше, два адреса со значениями, которые меняются при перемещении чара. Что за значения, понятия не имею, я просто обратил на них внимание и нашел для них базовый адрес.
$009771d0+$04+$264
$009771BC+$08+$44+$08+$264
|
|
|
All times are GMT +1. The time now is 21:16.
|
|