PDA

Просмотр полной версии : Нуждаюсь в помощи по инжекту WalkCall


Dremalka
06.10.2011, 12:52
Здравствуйте!
Не могу заставить перса бежать в определенную точку. Клиент падает в ошибку. Подскажите, пожалуйста, что в моем коде неправильно. Пишу на Autoit.
Вот тут мой код.

global $SelectPID
global $realBaseAddress = 0x00A5B90C
global $GA = 0x00A5BFCC
Dim $OPCODE = ""

......
AUTORUN($TargetPersX[$TekSchPos], $TargetPersY[$TekSchPos], $TargetPersZ[$TekSchPos], $SelectPID)
......


Func INJECTCODE($PID)
If $PID <> 0 And $OPCODE <> "" Then
Local $DATA = DllStructCreate("byte[" & StringLen($OPCODE) / 2 & "]")
For $I = 1 To DllStructGetSize($DATA)
DllStructSetData($DATA, 1, Dec(StringMid($OPCODE, ($I - 1) * 2 + 1, 2)), $I)
Next
Local $RESULT, $PROCESS, $ADD, $THREAD
$RESULT = DllCall("Kernel32.Dll", "int", "OpenProcess", "int", 2035711, "int", 0, "int", $PID)
$PROCESS = $RESULT[0]
$RESULT = DllCall("Kernel32.dll", "ptr", "VirtualAllocEx", "int", $PROCESS, "ptr", 0, "int", DllStructGetSize($DATA), "int", 4096, "int", 64)
$ADD = $RESULT[0]
$RESULT = DllCall("kernel32.dll", "int", "WriteProcessMemory", "int", $PROCESS, "ptr", $ADD, "ptr", DllStructGetPtr($DATA), "int", DllStructGetSize($DATA), "int", 0)
$RESULT = DllCall("kernel32.dll", "int", "CreateRemoteThread", "int", $PROCESS, "ptr", 0, "int", 0, "int", $ADD, "ptr", 0, "int", 0, "int", 0)
$THREAD = $RESULT[0]
Do
$RESULT = DllCall("kernel32.dll", "int", "WaitForSingleObject", "int", $THREAD, "int", 50)
Until $RESULT[0] <> 258
DllCall("Kernel32.dll", "int", "CloseHandle", "int", $THREAD)
DllCall("Kernel32.dll", "ptr", "VirtualFreeEx", "hwnd", $PROCESS, "ptr", $ADD, "int", 0, "int", 32768)
DllCall("Kernel32.dll", "int", "CloseHandle", "int", $PROCESS)
$OPCODE = ""
$DATA = 0
EndIf
EndFunc

Func AUTORUN($X, $Y, $Z, $PID)
MsgBox(0,'','$X: '&$X&', $Y: '&$Y&', $Z: '&$Z)
Local $CallAddress1 = 0x00468070
Local $CallAddress2 = 0x0046BCB0
Local $CallAddress3 = 0x00468470
Local $FLY = 0
Local $A = _MemoryRead($realBaseAddress, $memory)
$A = _MemoryRead($A + 0x1C, $memory)
$A = _MemoryRead($A + 0x20, $memory)
$A = _MemoryRead($A + 0x61C, $memory)
If $A = 2 Or $A = 1 Then
$FLY = 1
EndIf
$OPCODE = ""
$OPCODE &= '60' ; pushad
$OPCODE &= 'A1' & _hex($GA) ; mov eax, dword ptr [00A5BFCC]
$OPCODE &= '8B7020' ; mov esi, dword ptr [eax+20]
$OPCODE &= '8B8EF40F0000' ; mov ecx, dword ptr [esi+0FF4]
$OPCODE &= '6A01' ; push 1
$OPCODE &= 'E8' & _hex($CallAddress1) ; call 00468070
$OPCODE &= '89C7' ; mov edi, eax
$OPCODE &= '8D44E40C' ; lea eax, [esp+0C]
$OPCODE &= '50' ; push ax
$OPCODE &= '6A' & _hex($FLY) ; push FLY
$OPCODE &= '89F9' ; mov ecx, edi
$OPCODE &= 'E8' & _hex($CallAddress2) ; call 0046BCB0
$OPCODE &= '8B8EF40F0000' ; mov ecx, dword ptr [esi+0FF4]
$OPCODE &= '6A00' ; push 0
$OPCODE &= '6A01' ; push 1
$OPCODE &= '57' ; push edi
$OPCODE &= '6A01' ; push 1
$OPCODE &= 'E8' & _hex($CallAddress3) ; call 00468470
$OPCODE &= 'A1' & _hex($GA) ; mov eax, dword ptr [00A5BFCC]
$OPCODE &= '8B4020' ; mov eax, dword ptr [eax+20]
$OPCODE &= '8B80F40F0000' ; mov eax, dword ptr [eax+0FF4]
$OPCODE &= '8B4030' ; mov eax, dword ptr [eax+30]
$OPCODE &= '8B4804' ; mov ecx, dword ptr [eax+4]
$OPCODE &= 'B8' & _hex($X) ; mov eax, $X
$OPCODE &= '894120' ; mov dword ptr [ecx+20], eax
$OPCODE &= 'B8' & _hex($Z) ; mov eax, $Z
$OPCODE &= '894124' ; mov dword ptr [ecx+24], eax
$OPCODE &= 'B8' & _hex($Y) ; mov eax, $Z
$OPCODE &= '894128' ; mov dword ptr [ecx+28], eax
$OPCODE &= '61' ; popad
$OPCODE &= 'C3' ; retn
INJECTCODE($PID)
EndFunc

semoder
06.10.2011, 13:31
У меня инжект выглядит вот так (РУофф)...

Func AUTORUN($X, $Y, $Z, $PIDRUN)
$X = ($X - 400) * 10
$Y = ($Y - 550) * 10
$Z = $Z * 10
Local $RESULT, $PROCESS, $CODE_ADD, $THREAD, $PARAM_ADD
Local $PARAM = DllStructCreate("float [3]")
DllStructSetData($PARAM, 1, $X, 1)
DllStructSetData($PARAM, 1, $Z, 2)
DllStructSetData($PARAM, 1, $Y, 3)
$RESULT = DllCall("Kernel32.Dll", "int", "OpenProcess", "int", 2035711, "int", 0, "int", $PIDRUN)
$PROCESS = $RESULT[0]
$RESULT = DllCall("Kernel32.dll", "ptr", "VirtualAllocEx", "int", $PROCESS, "ptr", 0, "int", DllStructGetSize($PARAM), "int", 4096, "int", 64)
$PARAM_ADD = $RESULT[0]
$RESULT = DllCall("kernel32.dll", "int", "WriteProcessMemory", "int", $PROCESS, "ptr", $PARAM_ADD, "ptr", DllStructGetPtr($PARAM), "int", DllStructGetSize($PARAM), "int", 0)
Local $FLY = 0
Local $MEMIDRUN = _MEMORYOPEN($PIDRUN)
Local $A = _MEMORYREAD(_MEMORYREAD(_MEMORYREAD($BASEADD1C, $MEMIDRUN) + 32, $MEMIDRUN) + $OFFSET_CHECK_FLY, $MEMIDRUN)
If $A = 2 Or $A = 1 Then
$FLY = 1
EndIf
$OPCODE = ""
PUSHAD()
MOV_EDX($BASEADD)
MOV_ECX_DWORD_PTR_EDX()
MOV_EDX_DWORD_PTR_ECX_ADD(28)
$OPCODE &= "8B7220"
MOV_ECX_DWORD_PTR_ESI_ADD(4084)
MOV_EAX_DWORD_PTR_ESI_ADD($OFFSET_CHECK_FLY)
PUSH(1)
MOV_EDX(4628224)
CALL_EDX()
MOV_EDI_EAX()
PUSH($PARAM_ADD)
PUSH($FLY)
MOV_ECX_EDI()
MOV_EDX(4645008)
CALL_EDX()
PUSH(0)
PUSH(1)
PUSH_EDI()
PUSH(1)
MOV_ECX_DWORD_PTR_ESI_ADD(4084)
MOV_EDX(4629312)
CALL_EDX()
POPAD()
RET()
INJECTCODE($PIDRUN)
$RESULT = DllCall("Kernel32.dll", "ptr", "VirtualFreeEx", "hwnd", $PROCESS, "ptr", DllStructGetPtr($PARAM), "int", DllStructGetSize($PARAM), "int", 32768)
DllCall("Kernel32.dll", "int", "CloseHandle", "int", $PROCESS)
EndFunc
З.Ы.
$BASEADD = 10860812
$BASEADD1C = 10862540
$OFFSET_CHECK_FLY = 1580

N00bSa1b0t
06.10.2011, 13:33
Интересный инжект. Я другой юзаю, код из FlyWQ. без всяких вызовов процедур да и код проще..


MoveTo(X, Y, Z, moveType, client, actionStruct, height=-1.0)
{
actionList := ReadMemory(actionStruct+0x30,client)
MoveAction := ReadMemory(actionList+0x4,client)

writeMemory(0, MoveAction+0x8, client) ;Action finished = 0
writeMemory(1, MoveAction+0x14, client) ;Action Start = 1
writeMemory(X, MoveAction + 0x20, client)
writeMemory(Y, MoveAction + 0x24, client)
writeMemory(Z, MoveAction + 0x28, client)
writeMemory(FloatToHex(height), MoveAction + 0x68, client)
if(height >= 0.0)
{
writeMemory(26625, MoveAction + 0x64, client)
writeMemory(256, MoveAction + 0x6C, client)
}
else
{
writeMemory(26624, MoveAction + 0x64, client)
writeMemory(65536, MoveAction + 0x6C, client)
}
writeMemory(moveType, MoveAction + 0x2C, client) ;Not supported yet
writeMemory(MoveAction, actionstruct+0xC, client)
writeMemory(1, actionstruct+0x18, client)
writeMemory(moveAction, actionstruct+0x14, client)
}


Добавлено через 2 минуты
данный код работает везде - в мире, в данжах - мой патибот замечательно бегает за игроком)

Кому надо - могу код на шарпе дать, но код там точно такой же)

Dremalka
06.10.2011, 17:03
Побежал родимый!

semoder и N00bSa1b0t, спасибо вам большое за помощь. :)

N00bSa1b0t, сколько искал информацию по инжектам, не встречал такую, что через структуру действий можно гонять перса по координатам. Очень интересно. Обязательно попробую его реализовать.

Еще раз спасибо. :)

BritishColonist
06.10.2011, 17:58
а чему равно actionStruct?)
BA +1C +20 +?

N00bSa1b0t
06.10.2011, 20:35
а чему равно actionStruct?)
GameRun + HostPlayerStruct + playerActionStructOffset
то есть для руоффа:
0xA5BFCC + 0x20 + 0xFF4

не встречал такую, что через структуру действий можно гонять перса по координатам.
Я сам это первый раз увидел в FlyWQ =) Мне стало интересно как там это реализовано - способ простой очень и действенным оказался)

BritishColonist
06.10.2011, 23:08
MoveTo(X, Y, Z, moveType, client, actionStruct, height=-1.0)
а какие типы у параметров?

N00bSa1b0t
07.10.2011, 03:07
X Y Z - это ж координаты, по идее float. Хотя в самом FlyWQ это интовые числа. Но ведь размерность одинаковая (4 байта) поэтому одно и тоже значение можно интерпретировать и как float и как int32.
movetype всегда 1 (int32)
client - это просто ID процесса, с которым ты работаешь.
actionstruct - оффсет (int_ptr)
height - float

BritishColonist
07.10.2011, 15:13
хммм.. ну почему нельзя писать понятным образом?
что значит можно интерпретировать? окей, интерпретируем 3.14 как int: 1078523331. одинаковый результат? что-то не похоже, так что размерность - не показатель того, что пихать можно любые значения. важен смысл, а не размер.
movetype всегда 1 (int32)
что всегда 1? равен 1? тогда зачем делать из него параметр?
или занимает один байт? тогда зачем в скобочках приписано int32? int32 это простой стандартный int, т.е. целое, 4 байта.
и ещё. где логика порядка параметров? : D
Функция(координаты, тип движения, процесс игры, структура, высота)
я бы сделал так:
MoteTo(GameProcessId, Struct, Type, X, Y, Z, Height);
причём, зачем указывать начало структуры, если мы указываем процесс игры, из который это начало можно получить парой операций? ну неужели для экономии.. ресурсов?

в общем, я рад, что у тебя работает, но описано всё не очень понятно.

N00bSa1b0t
07.10.2011, 15:53
что значит можно интерпретировать? окей, интерпретируем 3.14 как int: 1078523331. одинаковый результат? что-то не похоже, так что размерность - не показатель того, что пихать можно любые значения. важен смысл, а не размер.
Смысл важен для человека. Если ты координаты считал как инт, и отправляешь как инт - все работает.
Я просто сказал, что в FlyWQ координаты представлены в виде инта:
xCoord8348 := 1150922672
xCoord8349 := 3302385319
xCoord8350 := 1148557837
xCoord8351 := 3303292969
xCoord8352 := 1142127397
Вот и все. Автору так было проще. Работает? Работает. Прилетел на точку, снял координаты - полетел дальше.

что всегда 1? равен 1? тогда зачем делать из него параметр?
или занимает один байт? тогда зачем в скобочках приписано int32? int32 это простой стандартный int, т.е. целое, 4 байта.
Зачем параметр - не знаю, спроси автора FlyWQ. Всегда равен 1, занимает 4 байта)

и ещё. где логика порядка параметров? : D
Опять-таки, вопрос не ко мне. Я лишь привел кусок исходника FlyWQ

PS
Если кто не понял, что такой FlyWQ - это вот это [Ссылки могут видеть только зарегистрированные и активированные пользователи]
Правда в теме исходников нет, но вроде на пвлабе ссылка была.. или в другой какой-то теме, я успел скачать)

BritishColonist
07.10.2011, 16:09
а, так не ты это написал.. ну Ctrl+C'n'Ctrl+V это конечно круто : D
рекомендую всё же переписывать так, как удобно тебе, чтобы хотя бы понимать, что в этом коде происходит и как работает.

N00bSa1b0t
07.10.2011, 16:11
рекомендую всё же переписывать так, как удобно тебе, чтобы хотя бы понимать, что в этом коде происходит и как работает.

А я и переписал для себя) Я ж на шарпе пишу, а это AutoIt или что-то такое)

rsam
08.10.2011, 13:37
Зачем параметр - не знаю, спроси автора FlyWQ. Всегда равен 1, занимает 4 байта)
Опять-таки, вопрос не ко мне. Я лишь привел кусок исходника FlyWQ



setFlyTo(theId, xCoord, yCoord, zCoord, height)
{
global
local baseAddress := ReadMemory(realBaseAddress, theId)
local structurePointer := ReadMemory(baseAddress + baseOffset, theId)
local playerPointer := ReadMemory(structurePointer + playerOffset, theId)
local actionStruct := ReadMemory(playerPointer + playerActionStructOffset, theId)

MoveTo(Xcoord, Ycoord, Zcoord, 0, theId, actionStruct, height)
}единственный вызов приведенной вами функции, как видно в 4м параметре передается 0. откуда появилась 1 в этом параметре?



PS
Если кто не понял, что такой FlyWQ - это вот это [Ссылки могут видеть только зарегистрированные и активированные пользователи]
Правда в теме исходников нет, но вроде на пвлабе ссылка была.. или в другой какой-то теме, я успел скачать)Исходники FlyWQ выложены автором тут ([Ссылки могут видеть только зарегистрированные и активированные пользователи]), включаемый файл тут ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

N00bSa1b0t
08.10.2011, 14:43
единственный вызов приведенной вами функции, как видно в 4м параметре передается 0. откуда появилась 1 в этом параметре?
Виноват, не туда посмотрел.
Но так как стоит комментарий
writeMemory(moveType, MoveAction + 0x2C, client) ;Not supported yet
то не думаю что это на что-то повлияет.

У меня в боте туда пишется 1 - и все равно все работает :)


Исходники FlyWQ выложены автором тут, включаемый файл тут
Не, я на том сайте был пару раз, значит исходник на пвлабе был)

BritishColonist
08.10.2011, 19:25
насчёт параметра. да, если игрок управляет персонажем, то movetype принимает следующие состояния:
при прыжке 4.
при передвижении клавишами 3.
при передвижении щелчками мыши 0.
если щёлкать мышью не на объект, а на небо (т.е. указываем просто сторону, в которую надо бежать), то movetype равен 2.
movetype никогда не равен 1. если прописать такое значение, передвигая игрока одним из вышеописанных способов, то он стопроцентно останавливается (даже при прыжке в небе зависнет, кстати). это кроме зажатия клавиш - у них значение 3 будет перезаписываться многократно, пока клавиши нажаты.
вот такие вот дела.

N00bSa1b0t
08.10.2011, 23:05
Классно все расписал :)

BritishColonist
09.10.2011, 20:08
[[[[BA]+0x1C]+0x20]+0x3C] = PosX
[[[[BA]+0x1C]+0x20]+0x40] = PosY (высота)
[[[[BA]+0x1C]+0x20]+0x44] = PosZ

вроде не хватало смещения 0x1C.

Python
09.10.2011, 22:39
Обычно высота - (Z)
А (X,Y) - координаты на плоской поверхности.

[[[[BA]+0x1C]+0x20]+0x3C] = PosX
[[[[BA]+0x1C]+0x20]+0x40] = PosZ (высота)
[[[[BA]+0x1C]+0x20]+0x44] = PosY

BritishColonist
10.10.2011, 15:18
Обычно высота - (Z)
А (X,Y) - координаты на плоской поверхности.


так-то это так, но не в Perfect World /problem
логично и правильно выводить координаты в виде X, Y, Z, однако в том же d_showpos высота (Z) стоит на втором месте. не понятно, в чём фишка.

silk
10.10.2011, 15:48
фишка в том, что в мире 3D программ координаты X (длина) и Y (высота) находятся на плоскости, которая перед нами, а Z - это глубина. Так что с их точки зрения все правильно.

wajskopf
16.10.2011, 20:59
Все круто, наконец то потащился по координатам. Только вот почему-то не набирает высоту. Это у меня одного так?

imeninnik
13.11.2011, 13:49
Все круто, наконец то потащился по координатам. Только вот почему-то не набирает высоту. Это у меня одного так?
Цифры неизвестных параметров изменились. Полетал немного потыкался и нашел. Что выделено красным изменилось (при этом тип данных integer)
if(height >= 0.0)
{
writeMemory(71369729, MoveAction + 0x64, client)
writeMemory(0, MoveAction + 0x6C, client)
}
else
{
writeMemory(71369728, MoveAction + 0x64, client)
writeMemory(65536, MoveAction + 0x6C, client)
}

При наборе высоты в параметр height передается значение от 0 до 79, так же параметр Y(в данном случае высота) передается 0.
При отсутствии необходимости набрать высоту height=-1.0. так же в параметр Y может быть 0 а может быть и высота 0-790(тут не важно) .

Добавлено через 9 минут
данный код работает везде - в мире, в данжах - мой патибот замечательно бегает за игроком)
для следования за игроком можно использовать более простую функцию взятую вот тут ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
public void follow(int playerId)
{
int actionStruct = values.actionStructPointer;
int actionList = MemFunctions.MemReadInt(pr_processHandle, actionStruct + 0x30);
int followAction = MemFunctions.MemReadInt(pr_processHandle, actionList + 0x1C);

MemFunctions.MemWriteInt(pr_processHandle, followAction + 0x8, 0); //Set error = 0
MemFunctions.MemWriteInt(pr_processHandle, followAction + 0x20, playerId); //Set playerId to follow
//MemFunctions.MemWriteInt(pr_processHandle, followAction + 0x48, 0); //Set stopped following = 0

MemFunctions.MemWriteInt(pr_processHandle, actionStruct + 0xC, followAction); //Set new action at position 1
MemFunctions.MemWriteInt(pr_processHandle, actionStruct + 0x18, 1); //Set next action position to 1
MemFunctions.MemWriteInt(pr_processHandle, actionStruct + 0x14, followAction); //Set new action type follow as next action

}

sin(alpha)
19.11.2011, 20:51
координаты как то не ведут в те места куда их задаешь движется безостановочно по направлениям причем при типе движения 2 подставляя скажем 1 на Х движется на запад неостанавливаясь, 1 на Y - на север, иногда персонаж, что удивительно становится плоским, то есть какой-то из параметров отвечает за преобразование сетки моделей о_О

void MoveTo(float X,float Y,float Z,DWORD moveType, Client c,float height)
{
float X0=(X*10)-400;
float Y0=(Y*10)-550;
float Z0=Z*10;
DWORD ActionStruct = c.ReadInt32(BaseAddress);
ActionStruct += 0x1C;
ActionStruct = c.ReadInt32(ActionStruct);
ActionStruct += 0x34;
ActionStruct = c.ReadInt32(ActionStruct);
ActionStruct += 0x1050;
ActionStruct = c.ReadInt32(ActionStruct);
DWORD ActionList = c.ReadInt32(ActionStruct+0x30);
DWORD MoveAction = c.ReadInt32(ActionList+0x4);

c.WriteInt32(MoveAction+0x8, 0); //Action finished = 0
c.WriteInt32(MoveAction+0x14, 1); //Action Start = 1
c.WriteInt32(MoveAction + 0x20, c.FtoD(X0));
c.WriteInt32(MoveAction + 0x24, c.FtoD(Z0));
c.WriteInt32(MoveAction + 0x28, c.FtoD(Y0));
c.WriteInt32(MoveAction + 0x68, c.FtoD(height));
if(height >= 0.0)
{
c.WriteInt32(MoveAction + 0x64, 26625);
c.WriteInt32(MoveAction + 0x6C, 256);
}
else
{
c.WriteInt32(MoveAction + 0x64, 26624);
c.WriteInt32(MoveAction + 0x6C, 65536);
}
c.WriteInt32(MoveAction + 0x2C, moveType); //Not supported yet
c.WriteInt32(ActionStruct + 0xC, MoveAction);
c.WriteInt32(ActionStruct+0x18, 1);
c.WriteInt32(ActionStruct+0x14, MoveAction);
}

вариация на С++, приведи если не сложно на шарпе, пож.

imeninnik
22.11.2011, 21:45
void MoveTo(float X,float Y,float Z,DWORD moveType, Client c,float height)
{
float X0=(X*10)+400;
float Z0=(Z*10)+550;
float Y0=Y*10;
DWORD ActionStruct = c.ReadInt32(BaseAddress);
ActionStruct += 0x1C;
ActionStruct = c.ReadInt32(ActionStruct);
ActionStruct += 0x34;
ActionStruct = c.ReadInt32(ActionStruct);
ActionStruct += 0x1050;
ActionStruct = c.ReadInt32(ActionStruct);
DWORD ActionList = c.ReadInt32(ActionStruct+0x30);
DWORD MoveAction = c.ReadInt32(ActionList+0x4);

c.WriteInt32(MoveAction+0x8, 0); //Action finished = 0
c.WriteInt32(MoveAction+0x14, 1); //Action Start = 1
c.WriteInt32(MoveAction + 0x20, c.FtoD(X0));
c.WriteInt32(MoveAction + 0x24, c.FtoD(Z0));
c.WriteInt32(MoveAction + 0x28, c.FtoD(Y0));
c.WriteInt32(MoveAction + 0x68, c.FtoD(height));
if(height >= 0.0)
{
c.WriteInt32(MoveAction + 0x64, 71369729);
c.WriteInt32(MoveAction + 0x6C, 0);
}
else
{
c.WriteInt32(MoveAction + 0x64, 71369728);
c.WriteInt32(MoveAction + 0x6C, 65536);
}
c.WriteInt32(MoveAction + 0x2C, moveType); //Not supported yet
c.WriteInt32(ActionStruct + 0xC, MoveAction);
c.WriteInt32(ActionStruct+0x18, 1);
c.WriteInt32(ActionStruct+0x14, MoveAction);
}

Надеюсь в данном случае повторение это мать учения, а не заикания =).
При наборе высоты в параметр height передается значение от 0 до 79, так же параметр Y(в данном случае высота) передается 0.
При отсутствии необходимости набрать высоту height=-1.0. так же в параметр Y может быть 0 а может быть и высота 0-790(тут не важно) .
Все что отмечено красным в коде это уже исправленное.

sin(alpha)
22.11.2011, 22:23
Если кто не заметил, то координаты специально приведены к более привычному виду Х, Y, Z, координата Z записывается в поле для Y и наоборот. Ходить по ним все равно отказывается и тупо бегает безостановочно в одну сторону. Про набор высоты я в курсе, это единственная вещь которая почему-то работает как сь старыми значениями так и с новыми как по высоте так и по (в моем коде)Z. А в плоскости по координатам ходить не желает.

Перегнал на шарп, теперь проблема как и с инжектами- падение клиента со светофором. С++ код не выбрасывает клиент а вот С# рушит намертво в чем дело не понятно.

void MoveTo(float x, float y, float z, float height = -1)
{
MemoryManager.WriteByte(MoveAction.Finished.Int32, 0);
MemoryManager.WriteByte(MoveAction.Start.Int32, 1);
MemoryManager.WriteFloat(MoveAction.Xcoord.Int32, x);
MemoryManager.WriteFloat(MoveAction.Ycoord.Int32, y);
MemoryManager.WriteFloat(MoveAction.Zcoord.Int32, z);

MemoryManager.WriteFloat(MoveAction.Height.Int32, height);
if (height >= 0.0)
{
MemoryManager.WriteInt32(MoveAction.FirstVar.Int32 , 0x4410401);
MemoryManager.WriteInt32(MoveAction.SecondVar.Int3 2, 0x10000);
}
else
{
MemoryManager.WriteInt32(MoveAction.FirstVar.Int32 , 0x4410400);
MemoryManager.WriteInt32(MoveAction.SecondVar.Int3 2, 0x10000);
}

MemoryManager.WriteInt32(MoveAction.MoveType.Int32 , 0);
MemoryManager.WriteInt32(MoveAction.NewMoveAction. Int32, MoveAction.MAction.Int32);
MemoryManager.WriteInt32(MoveAction.ActionPosition .Int32, 1);
MemoryManager.WriteInt32(MoveAction.NextMoveAction .Int32, MoveAction.MAction.Int32);
}

структура кода как в оригинале. Красным выделены поля отвечающие за начало действия/конец действия. Судя по всему поля байтовые, чтение из них целого выдает фигю первое поле содержит 7FC14400 или 7FC14401 в зависимости от того активно действи или нет: второе 1E0FF400 никогда не меняется. Первое проще по моему выставлять битовой маской. Зеленым выделены значения в полях, отвечающих за высоту они походу тоже типа byte. А при попытке записать выделенное желтым, т.е. указатель на следующее действие клиент падает со светофором.
Вот снимки состояний при движении и остановке:
движение ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
остановка ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

кстати код на следование за игроком не вылетает, однако и не следует, а на месте стоит дергается только, там похоже еще надо инициировать структуру движения, только клиент при этом падает.
Преобразование координат:
Хчел=400+Хигр/10
Хиг = (Хчел-400)*10;
Zчел=550+Zигр/10
Zиг = (Zчел-550)*10;
так что ооба не верно написали.

Разобрался. Не корректно работают функции записи в память в PWFrameWorke, которым пользовался поначалу, загоняют по адресам нули вместо значений отсюда и глюки с вылетами. Первое что сделал - написал сканер структуры чисто на функциях WinAPI. Второе все значения флагов начало/останов выставлял через цепочку ПРОЧИТАЛ-ВЫСТАВИЛ_БИТ_ЧЕРЕЗ_ЛОГИЧЕСКИЕ_И/ИЛИ-ЗАПИСАЛ. С высотой все несколько сложнее эти два ее параметра по смещению MoveAction+64h и MoveAction+6Сh отвечают за инициацию автопилота. При этом второе поле обнуляется если идет изменение высоты если изменение высоты закончено - значение равно 10000h. У первого значения младший бит выставляется в 1 если автопилот включен, в 0 если выключен. При включенном автопилоте координата Y(у меня Z) должна быть равна 0. Где то должны еще находиться поля, хранящие координаты точки маркера автопилота, которая задается, при клике по НИП/мобу в квесте или по карте через альт. Для того, чтобы персонаж сам взлетал при задании ему высоты вместо координаты Y в поле 6Ch надо записать 100h.

Благодарный
14.12.2011, 15:16
Func AUTORUN($X, $Y, $Z, $PIDRUN)
$X = ($X - 400) * 10
$Y = ($Y - 550) * 10
$Z = $Z * 10
Local $RESULT, $PROCESS, $CODE_ADD, $THREAD, $PARAM_ADD
Local $PARAM = DllStructCreate("float [3]")
DllStructSetData($PARAM, 1, $X, 1)
DllStructSetData($PARAM, 1, $Z, 2)
DllStructSetData($PARAM, 1, $Y, 3)
$RESULT = DllCall("Kernel32.Dll", "int", "OpenProcess", "int", 2035711, "int", 0, "int", $PIDRUN)
$PROCESS = $RESULT[0]
$RESULT = DllCall("Kernel32.dll", "ptr", "VirtualAllocEx", "int", $PROCESS, "ptr", 0, "int", DllStructGetSize($PARAM), "int", 4096, "int", 64)
$PARAM_ADD = $RESULT[0]
$RESULT = DllCall("kernel32.dll", "int", "WriteProcessMemory", "int", $PROCESS, "ptr", $PARAM_ADD, "ptr", DllStructGetPtr($PARAM), "int", DllStructGetSize($PARAM), "int", 0)
Local $FLY = 0
Local $MEMIDRUN = _MEMORYOPEN($PIDRUN)
Local $A = _MEMORYREAD(_MEMORYREAD(_MEMORYREAD($BASEADD1C, $MEMIDRUN) + 32, $MEMIDRUN) + $OFFSET_CHECK_FLY, $MEMIDRUN)
If $A = 2 Or $A = 1 Then
$FLY = 1
EndIf
$OPCODE = ""
PUSHAD()
MOV_EDX($BASEADD)
MOV_ECX_DWORD_PTR_EDX()
MOV_EDX_DWORD_PTR_ECX_ADD(28)
$OPCODE &= "8B7220"
MOV_ECX_DWORD_PTR_ESI_ADD(4084)
MOV_EAX_DWORD_PTR_ESI_ADD($OFFSET_CHECK_FLY)
PUSH(1)
MOV_EDX(4628224)
CALL_EDX()
MOV_EDI_EAX()
PUSH($PARAM_ADD)
PUSH($FLY)
MOV_ECX_EDI()
MOV_EDX(4645008)
CALL_EDX()
PUSH(0)
PUSH(1)
PUSH_EDI()
PUSH(1)
MOV_ECX_DWORD_PTR_ESI_ADD(4084)
MOV_EDX(4629312)
CALL_EDX()
POPAD()
RET()
INJECTCODE($PIDRUN)
$RESULT = DllCall("Kernel32.dll", "ptr", "VirtualFreeEx", "hwnd", $PROCESS, "ptr", DllStructGetPtr($PARAM), "int", DllStructGetSize($PARAM), "int", 32768)
DllCall("Kernel32.dll", "int", "CloseHandle", "int", $PROCESS)
EndFunc
Раньше этот код отлично работал, а теперь игра сразу же вылетает при вызове функции :(
выложите рабочий код на AutoIt'e если у кого-нибудь он есть)

VeTaL_UA
14.12.2011, 15:25
Раньше этот код отлично работал, а теперь игра сразу же вылетает при вызове функции
А поменять оффсеты не пробовали?

Благодарный
14.12.2011, 15:50
"$BASEADD" и "$BASEADD1C" как они здесь названы- стоят актуальные для руоффа, а вот на счёт значения "$OFFSET_CHECK_FLY" не уверен...хотя пробовал и старое значение 1580 и предполагаемое новое 1688 под другим названием State_Offset из offset retriever'a

BritishColonist
03.01.2012, 15:50
У меня с обсуждаемой функцией такая проблема: вроде персонаж бегает нормально, но если подвинуть персонажа вручную (просто мышью или клавишами, а не через функцию), то он либо зависает, либо бежит на месте, либо после остановки вертится на одной точке вперёд-назад, как дурачок.
Никто не сталкивался?

wajskopf
11.01.2012, 00:38
С передвижением в полете проблемы с высотой((( не опускается и не поднимается. по плоскости движется нормально.