|
You last visited: Today at 21:07
Advertisement
Rus. server
Discussion on Rus. server within the Perfect World forum part of the MMORPGs category.
07/08/2010, 11:39
|
#1666
|
elite*gold: 0
Join Date: Jul 2010
Posts: 7
Received Thanks: 5
|
Quote:
Originally Posted by dwar
Нагибатор
вообще то, шифрование - стандартная вещь для ммо
|
Да у меня просто не так много опыта. Анализировал пакеты одной любительской игры, там был HEX наоборот, а тут чего-то каждый раз все разное.
Quote:
Originally Posted by dwar
уже два года назад все расшифровали
MD5, SHA2_256, HMAC_MD5, RC4 (каждый используется в определенных ситуациях)
|
Да, я нашел информацию, некто Vort тут (и еще на олчитс) выкладывал исходный код декриптора на слил ру ( не остался ли у кого?), но файл удален уже. Есть только функции на си без комментариев.
Не могли бы вы, пожалуйста, объяснить, как ими пользоваться и что на входе и выходе? Я не силен в си, можно в ПМ.
Code:
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// PWEncDec.h
#pragma once
#include "Defs.h"
// ----------------------------------------------------------------------------
class CPacketEncDec
{
public:
CPacketEncDec()
{
for (dword i = 0; i < 256; i++)
m_Table[i] = i;
m_Shift1 = 0;
m_Shift2 = 0;
}
void Shuffle(byte* Key)
{
byte Shift = 0;
for (dword i = 0; i < 256; i++)
{
byte A = Key[i % 16];
Shift += A + m_Table[i];
byte B = m_Table[i];
m_Table[i] = m_Table[Shift];
m_Table[Shift] = B;
}
}
void Encode(byte* InPacket, dword PacketSize, byte* OutPacket)
{
for (dword i = 0; i < PacketSize; i++)
{
m_Shift1++;
byte A = m_Table[m_Shift1];
m_Shift2 += A;
byte B = m_Table[m_Shift2];
m_Table[m_Shift2] = A;
m_Table[m_Shift1] = B;
byte C = A + B;
byte D = m_Table[C];
OutPacket[i] = InPacket[i] ^ D;
}
}
private:
byte m_Shift1;
byte m_Shift2;
byte m_Table[256];
};
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// PWUnpack.h
#pragma once
#include "Defs.h"
#include "Array2.h"
#include <windows.h>
// ----------------------------------------------------------------------------
class CUnpack
{
public:
CUnpack()
{
m_PackedOffset = 0;
m_Stage = 0;
}
CArray<byte> AddByte(byte InB)
{
m_Packed.PushBack(InB);
CArray<byte> UnpackedChunk;
for (;;)
{
if (m_Stage == 0)
{
if (HasBits(4))
{
if (GetPackedBits(1) == 0)
{
// 0-xxxxxxx
m_Code1 = 1;
m_Stage = 1;
continue;
}
else
{
if (GetPackedBits(1) == 0)
{
// 10-xxxxxxx
m_Code1 = 2;
m_Stage = 1;
continue;
}
else
{
if (GetPackedBits(1) == 0)
{
// 110-xxxxxxxxxxxxx-*
m_Code1 = 3;
m_Stage = 1;
continue;
}
else
{
if (GetPackedBits(1) == 0)
{
// 1110-xxxxxxxx-*
m_Code1 = 4;
m_Stage = 1;
continue;
}
else
{
// 1111-xxxxxx-*
m_Code1 = 5;
m_Stage = 1;
continue;
}
}
}
}
}
else
break;
}
else if (m_Stage == 1)
{
if (m_Code1 == 1)
{
if (HasBits(7))
{
byte OutB = byte(GetPackedBits(7));
UnpackedChunk.PushBack(OutB);
m_Unpacked.PushBack(OutB);
m_Stage = 0;
continue;
}
else
break;
}
else if (m_Code1 == 2)
{
if (HasBits(7))
{
byte OutB = byte(GetPackedBits(7)) | 0x80;
UnpackedChunk.PushBack(OutB);
m_Unpacked.PushBack(OutB);
m_Stage = 0;
continue;
}
else
break;
}
else if (m_Code1 == 3)
{
if (HasBits(13))
{
m_Shift = GetPackedBits(13) + 0x140;
m_Stage = 2;
continue;
}
else
break;
}
else if (m_Code1 == 4)
{
if (HasBits(8))
{
m_Shift = GetPackedBits(8) + 0x40;
m_Stage = 2;
continue;
}
else
break;
}
else if (m_Code1 == 5)
{
if (HasBits(6))
{
m_Shift = GetPackedBits(6);
m_Stage = 2;
continue;
}
else
break;
}
}
else if (m_Stage == 2)
{
if (m_Shift == 0)
{
// Guess !!!
if (m_PackedOffset)
{
m_PackedOffset = 0;
m_Packed.PopFront();
}
m_Stage = 0;
continue;
}
m_Code2 = 0;
m_Stage = 3;
continue;
}
else if (m_Stage == 3)
{
if (HasBits(1))
{
if (GetPackedBits(1) == 0)
{
m_Stage = 4;
continue;
}
else
{
m_Code2++;
continue;
}
}
else
break;
}
else if (m_Stage == 4)
{
dword CopySize = 0;
if (m_Code2 == 0)
CopySize = 3;
else
{
dword Sz = m_Code2 + 1;
if (HasBits(Sz))
CopySize = GetPackedBits(Sz) + (1 << Sz);
else
break;
}
Copy(m_Shift, CopySize, UnpackedChunk);
m_Stage = 0;
continue;
}
}
return UnpackedChunk;
}
private:
void Notify(char* Msg)
{
MessageBoxA(0, Msg, "", 0);
}
void Copy(dword Shift, dword Size, CArray<byte>& UnpackedChunk)
{
for (dword i = 0; i < Size; i++)
{
int PIndex = m_Unpacked.Size() - Shift;
if (PIndex < 0)
Notify("Unpack error");
else
{
byte B = m_Unpacked[PIndex];
m_Unpacked.PushBack(B);
UnpackedChunk.PushBack(B);
}
}
}
dword GetPackedBits(dword BitCount)
{
if (BitCount > 16)
return 0;
if (!HasBits(BitCount))
Notify("Unpack bit stream overflow");
dword AlBitCount = BitCount + m_PackedOffset;
dword AlByteCount = (AlBitCount + 7) / 8;
dword V = 0;
for (dword i = 0; i < AlByteCount; i++)
V |= dword(m_Packed[i]) << (24 - i * 8);
V <<= m_PackedOffset;
V >>= 32 - BitCount;
m_PackedOffset += BitCount;
dword FreeBytes = m_PackedOffset / 8;
if (FreeBytes)
m_Packed.PopFront(FreeBytes);
m_PackedOffset %= 8;
return V;
}
bool HasBits(dword Count)
{
return (m_Packed.Size() * 8 - m_PackedOffset) >= Count;
}
private:
dword m_Code1;
dword m_Code2;
dword m_Stage;
dword m_Shift;
byte m_PackedOffset;
CArray<byte> m_Packed;
CArray<byte> m_Unpacked;
};
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
|
07/09/2010, 09:31
|
#1667
|
elite*gold: 0
Join Date: Dec 2009
Posts: 57
Received Thanks: 24
|
Quote:
Originally Posted by dixgen
Ребят помогите с инжектом "Помощь в атаке". Тот что выложил gen-ostr не работает((..
|
код рабочий. проверить просто: запускаешь Олю, ставишь бряк на ф-цию, запускаешь, смотришь. для правильной работы в таргете должен быть тот, по кому ассист.( не обязательно член пати  )
|
|
|
07/09/2010, 09:57
|
#1668
|
elite*gold: 0
Join Date: May 2010
Posts: 10
Received Thanks: 5
|
Странно.
Сделал тоже под Delphi - не работает.
Адрес $5DBBA0 убивает клиента.
А используя предлиженый в коде,
DWORD CallAddress =0x0057FA20;
ничего не происходит.
(пробовал разные комбинации в пати и без. В таргет предворительно брал перса.)
Интересно, что это за константа? DWORD constanta=0x00940ba8;
|
|
|
07/09/2010, 11:32
|
#1669
|
elite*gold: 0
Join Date: Dec 2009
Posts: 57
Received Thanks: 24
|
Quote:
Originally Posted by Python_
Странно.
Сделал тоже под Delphi - не работает.
Адрес $5DBBA0 убивает клиента.
А используя предлиженый в коде,
DWORD CallAddress =0x0057FA20;
ничего не происходит.
(пробовал разные комбинации в пати и без. В таргет предворительно брал перса.)
Интересно, что это за константа? DWORD constanta=0x00940ba8;
|
 нормально все написано. возможно, придется перечитать несколько раз. Я сам пока не почитал- тоже задавал подобные вопросы. Ща под под рукой нет клиента. по памяти: для ассиста используется GuiCommand
|
|
|
07/09/2010, 14:00
|
#1670
|
elite*gold: 0
Join Date: Jul 2008
Posts: 43
Received Thanks: 16
|
Quote:
Originally Posted by gen-ostr
код рабочий. проверить просто: запускаешь Олю, ставишь бряк на ф-цию, запускаешь, смотришь. для правильной работы в таргете должен быть тот, по кому ассист.( не обязательно член пати  )
|
Ради эксперимента реализовал твой код. Результат не утешительный.
1. Ты передаёшь объект окна пати:
Code:
mov eax, BaseAddress;
mov eax, dword ptr[eax];
mov eax, dword ptr[eax+0x1C];
mov eax, dword ptr[eax+0x4];
mov eax, dword ptr[eax+0x8];
mov eax, dword ptr[eax+0x34C];
push eax;
Прикол в том, что в зависимости от того лидер ты или нет, туда передаются 2 разных объекта, то что у тебя - это когда ты не лидер пати. У другого объекта надо делать mov eax, dword ptr[eax+0x348]; в конце.
2. Команда не срабатывает до тех пор, пока через окно пати не сделаешь на ком-нибудь ассист. Вот только после этого инъекция начинает срабатывать, но исключительно помощь срабатывает тому, на ком в последний раз сделал Помощь в атаке через окно пати.
Т.е. предположим, у тебя 2 человека в пати, сначала в окне пати щёлкаешь на первом и говоришь: Помощь в атаке. После этого инъекция начинает срабатывать, но всегда помощь ТОЛЬКО первому делаешь, независимо от того, кто у тебя в таргете.
А если сделаешь Помощь в атаке на втором члене пати, после этого помощь начинает срабатывать исключительно на нём!
|
|
|
07/09/2010, 15:36
|
#1671
|
elite*gold: 0
Join Date: Jul 2008
Posts: 43
Received Thanks: 16
|
Продолжение исследования ассиста.
В клиенте заложены 2 способа осуществления ассиста.
1. Через меню Помощь в атаке с писке пати. (что пытался реализовать gen-ostr  , и что некорректно работает, т.к. надо ещё некоторые вещи инициализировать перед данной инъекцией)
2. Через действия игрока (эти действия ещё и на панельки выкладываются).
Для реализации второго действия, кому интересно копайте код в районе: 004A1670
Там можно не только действие ассиста выцепить, но и другие.
Ассист таким методом реализовал - работает исправно (но обязательно, чтобы человек, кому ассистим был в пати и был в таргете).
|
|
|
07/09/2010, 21:03
|
#1672
|
elite*gold: 0
Join Date: May 2010
Posts: 10
Received Thanks: 5
|
Клас!
Огромное спасибо dj_al!!!
Действительно очень интересный набор функций. То что я искал, для анимации бота.
А главное не сложно!
|
|
|
07/10/2010, 10:18
|
#1673
|
elite*gold: 0
Join Date: Jun 2010
Posts: 17
Received Thanks: 10
|
Всем привет,
Подскажите, пожалуйста, где узнать время через которое появится моб с таким же ID после того как его убьют? Время респа так называемое. В базе я не вижу что то. Может где то в памяти есть эти данные?
|
|
|
07/12/2010, 08:48
|
#1674
|
elite*gold: 0
Join Date: Jun 2010
Posts: 17
Received Thanks: 10
|
Еще раз всем привет)).
А со скилами кто нибудь разобрался? Например, можно ли определить откатился ли скилл? И как у вас работа со скилами вообще реализована - расскажите плиз. Таймерами пользуетесь или просто все подряд запускаете, какой не откатился - тот и сработает?
|
|
|
07/12/2010, 14:19
|
#1675
|
elite*gold: 0
Join Date: Jul 2009
Posts: 60
Received Thanks: 84
|
Просьба к gen-ostr: если не жалко, выложи, плиз, инжект на скиллы пета)
|
|
|
07/12/2010, 19:48
|
#1676
|
elite*gold: 0
Join Date: Dec 2009
Posts: 57
Received Thanks: 24
|
Quote:
Originally Posted by GrieVeR-13
Просьба к gen-ostr: если не жалко, выложи, плиз, инжект на скиллы пета)
|
прошу прощения у тех, кто стучал в личку.
по поводу инжекта ассиста - мой косяк. просто это только часть кода,на самом деле у мя там много еще всяких инициализаций, так как было написано спецом для хилящего приста, который ясный перец всегда в пати и не лидер. по поводу атаки пэтом- вот код. опять же писано под конкретную задачу, так что возможно косяки тоже будут. при исследовании данной функции за основу взят так же указанный ранее мной метод. даный код эмулирует нажатие ЛКМ на панельке пэта (кажется). если использовать комбинации АЛЬТ+2..5 тоже вызывается эта функция но с другими параметрами. вся сложность этого инжекта в том, что в нем используются данные других функций,которые прятались в стэк. каких именно- мне было пофигу. этот вариант меня вполне устраивал. кому надо -смотрите через IDA pro.
предвидя следующий вопрос по инжекту вернуть (отозвать пэта) отвечаю: я там не копался пока за ненадобностью. но при исследованни команды "атака пэтом" в моем инжекте недо было тока заменить одну переменную. удачи. и еще. в данном случае стэк а паковал сам, так что 100% аналогии вы Олей не найдете. но прогдя буквально по 3-м процедурам функции разберетесь откуда и что вынимается
Code:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// атака петом по нажатию кнопки скилла
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
static DWORD WINAPI PetSkillAttack(_TParams *lpParam)
{
DWORD BaseAddress = 0x0098ADDC;
DWORD PetSkillAttackAddress = 0x051E650;
DWORD SkillNumer=lpParam->Numer ;
__asm
{
pushad;
mov edx, SkillNumer; // это сделано для того, чтоб в инжекте
mov eax,0x4; // указывать номер скила, который надо кастить
imul edx,eax; //
add edx,0x160; //
mov ebx,edx; //
mov edx,PetSkillAttackAddress;
mov eax, BaseAddress;
mov eax, dword ptr[eax];
mov eax, dword ptr[eax + 0x1C];
mov eax, dword ptr[eax + 0x4];
mov eax, dword ptr[eax + 0x8];
mov eax, dword ptr[eax + 0x298];
mov ecx, eax;
mov eax, dword ptr[eax + ebx];
//push 0x106;
mov ebp,0x106;
push ebp;
mov edi, esp;
push edi;
mov edi, esp;
push eax; //параметры для для функции
push 0; //параметры для для функции
push 0; //параметры для для функции
// это прячется в стек
push 0; //здесь будет сохрянятся вызов ф-ции
push edi; //извлекается со стека во время работы
push 0; //для корректной работы
add esp,0xC; // корректируем указатель стека
call edx;
add esp,0x8;// корректируем(восстанавливаем) указатель стека
popad;
}
return 0;
}
Quote:
|
Прикол в том, что в зависимости от того лидер ты или нет, туда передаются 2 разных объекта, то что у тебя - это когда ты не лидер пати. У другого объекта надо делать mov eax, dword ptr[eax+0x348]; в конце.
|
ради интереса поковырялся более детально в своем инжекте ассиста. весь прикол в том, что этим инжектом можно даже увидеть кто в таргете у моба!!!! причем пофигу атакует моб физой или магией. (у мя раньше была проблема определения атаки моба магией). правда, почему это происходит не знаю. надо смотреть какие ининициализации я накрапал в своем коде, которые влияют на этот инжект
|
|
|
07/13/2010, 06:17
|
#1677
|
elite*gold: 0
Join Date: Jul 2010
Posts: 11
Received Thanks: 15
|
Quote:
Originally Posted by gen-ostr
по поводу инжекта ассиста - мой косяк. просто это только часть кода,на самом деле у мя там много еще всяких инициализаций, так как было написано спецом для хилящего приста, который ясный перец всегда в пати и не лидер.
|
Если не трудно, выложи пожалуйста свои инициализации. Как раз интересует похожее(ассист для членов пати по лидеру). Пока что удалось сделать ассист за 2 приема(выделение пл + ассист), но из-за получающейся паузы между ними это не очень подходит.
|
|
|
07/13/2010, 18:45
|
#1678
|
elite*gold: 0
Join Date: Jul 2009
Posts: 60
Received Thanks: 84
|
gen-ostr: спасибо, переделал твой код под делфи - всё прекрасно работает. Пока ошибок не обнаружилось. Интересно, зачем вам всем так нужен вызов/отзыв пета? Для солидности?
Я так понял, здесь используется функция $715A50 для клика по интерфейсу.
Она вызывается каждый раз, когда происходят следующие события:
- Левые клики по шорткеям и портрету питомца
- Правый клик по автокасту, портрету джина и питомца
- Наведение мыши на миникарту, чат и портреты себя и цели.
Из всего этого еще может пригодится, наверное, автокаст.. Например, кровоток фени, который 4-й по списку. Сместить бы его.
Твой код под шаблон на Делфи (в библиотеку):
Code:
procedure CallPetSkill(aPParams: PParams); stdcall;
var SkillNumber:dword;
begin
SkillNumber:=aPParams.Param7;
asm
pushad
mov edx, SkillNumber
mov eax, $4
imul edx, eax;
add edx, $160;
mov ebx, edx;
mov edx, $051E650
mov eax, PW_BASE_ADDRESS
mov eax, dword ptr[eax]
mov eax, dword ptr[eax + $1C]
mov eax, dword ptr[eax + $4]
mov eax, dword ptr[eax + $8]
mov eax, dword ptr[eax + $298]
mov ecx, eax
mov eax, dword ptr[eax + ebx]
mov ebp, $106
push ebp
mov edi, esp
push edi
mov edi, esp
push eax
push 0
push 0
push 0
push edi
push 0
add esp, $C
call edx
add esp, $8
popad
end;
end;
procedure PetSkill(aProcessID, SkillNumber: Cardinal);
var
aParams: TParams;
aParamsSize: DWORD;
begin
aParams.Param7 := SkillNumber;
aParamsSize := SizeOf(aParams);
InjectFunc(aProcessID, @CallPetSkill, @aParams, aParamsSize);
end;
|
|
|
07/13/2010, 21:39
|
#1679
|
elite*gold: 0
Join Date: Dec 2009
Posts: 57
Received Thanks: 24
|
отзыв пэта как раз самая нужная функция. например: выбрал ты свободного моба, натравил пэта. но, пока пэт бежит, его захватил кто-то другой.. зачем споры типа это мой моб был? просто вернул пэта тихонько чтоб не палиться.
а зачем скилл автокаста смещать? просто смотришь когда он перезарядился- и используешь сново. по крайней мере у мя так.(у мя все скиллы проверяются) вот только откат банок так и не удалось контролировать
|
|
|
07/14/2010, 01:50
|
#1680
|
elite*gold: 0
Join Date: Jul 2009
Posts: 60
Received Thanks: 84
|
Я думал, имеется ввиду "призыв" пета. Из клетки)
Но в твоем случае отзыв действительно весьма полезен. Ты говорил, что не разбирался с этим еще?
Мне правда все эти функции нужны не для бота, а для облегчения управляемости феней) Напрягает каждый раз вызывать, ставить автокаст, жать атаку через альт... бафы, и больше всего это постоянно тыкать "следовать за хозяином" мышкой. Застревает в земле, курица.
|
|
|
All times are GMT +1. The time now is 21:08.
|
|