Register for your free account! | Forgot your password?

Go Back   elitepvpers > MMORPGs > Perfect World
You last visited: Today at 21:07

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Rus. server

Discussion on Rus. server within the Perfect World forum part of the MMORPGs category.

Reply
 
Old 07/08/2010, 11:39   #1666
 
elite*gold: 0
Join Date: Jul 2010
Posts: 7
Received Thanks: 5
Quote:
Originally Posted by dwar View Post
Нагибатор
вообще то, шифрование - стандартная вещь для ммо
Да у меня просто не так много опыта. Анализировал пакеты одной любительской игры, там был HEX наоборот, а тут чего-то каждый раз все разное.
Quote:
Originally Posted by dwar View Post
уже два года назад все расшифровали
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;
};
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Нагибатор is offline  
Old 07/09/2010, 09:31   #1667
 
elite*gold: 0
Join Date: Dec 2009
Posts: 57
Received Thanks: 24
Quote:
Originally Posted by dixgen View Post
Ребят помогите с инжектом "Помощь в атаке". Тот что выложил gen-ostr не работает((..
код рабочий. проверить просто: запускаешь Олю, ставишь бряк на ф-цию, запускаешь, смотришь. для правильной работы в таргете должен быть тот, по кому ассист.( не обязательно член пати )
gen-ostr is offline  
Old 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;
Python_ is offline  
Old 07/09/2010, 11:32   #1669
 
elite*gold: 0
Join Date: Dec 2009
Posts: 57
Received Thanks: 24
Quote:
Originally Posted by Python_ View Post
Странно.
Сделал тоже под Delphi - не работает.
Адрес $5DBBA0 убивает клиента.

А используя предлиженый в коде,
DWORD CallAddress =0x0057FA20;
ничего не происходит.
(пробовал разные комбинации в пати и без. В таргет предворительно брал перса.)


Интересно, что это за константа? DWORD constanta=0x00940ba8;
нормально все написано. возможно, придется перечитать несколько раз. Я сам пока не почитал- тоже задавал подобные вопросы. Ща под под рукой нет клиента. по памяти: для ассиста используется GuiCommand
gen-ostr is offline  
Thanks
1 User
Old 07/09/2010, 14:00   #1670
 
elite*gold: 0
Join Date: Jul 2008
Posts: 43
Received Thanks: 16
Quote:
Originally Posted by gen-ostr View Post
код рабочий. проверить просто: запускаешь Олю, ставишь бряк на ф-цию, запускаешь, смотришь. для правильной работы в таргете должен быть тот, по кому ассист.( не обязательно член пати )
Ради эксперимента реализовал твой код. Результат не утешительный.
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 человека в пати, сначала в окне пати щёлкаешь на первом и говоришь: Помощь в атаке. После этого инъекция начинает срабатывать, но всегда помощь ТОЛЬКО первому делаешь, независимо от того, кто у тебя в таргете.
А если сделаешь Помощь в атаке на втором члене пати, после этого помощь начинает срабатывать исключительно на нём!
dj_al is offline  
Thanks
1 User
Old 07/09/2010, 15:36   #1671
 
elite*gold: 0
Join Date: Jul 2008
Posts: 43
Received Thanks: 16
Продолжение исследования ассиста.
В клиенте заложены 2 способа осуществления ассиста.
1. Через меню Помощь в атаке с писке пати. (что пытался реализовать gen-ostr , и что некорректно работает, т.к. надо ещё некоторые вещи инициализировать перед данной инъекцией)
2. Через действия игрока (эти действия ещё и на панельки выкладываются).

Для реализации второго действия, кому интересно копайте код в районе: 004A1670
Там можно не только действие ассиста выцепить, но и другие.

Ассист таким методом реализовал - работает исправно (но обязательно, чтобы человек, кому ассистим был в пати и был в таргете).
dj_al is offline  
Thanks
2 Users
Old 07/09/2010, 21:03   #1672
 
elite*gold: 0
Join Date: May 2010
Posts: 10
Received Thanks: 5
Клас!
Огромное спасибо dj_al!!!
Действительно очень интересный набор функций. То что я искал, для анимации бота.
А главное не сложно!
Python_ is offline  
Old 07/10/2010, 10:18   #1673
 
elite*gold: 0
Join Date: Jun 2010
Posts: 17
Received Thanks: 10
Всем привет,
Подскажите, пожалуйста, где узнать время через которое появится моб с таким же ID после того как его убьют? Время респа так называемое. В базе я не вижу что то. Может где то в памяти есть эти данные?
krukovis is offline  
Old 07/12/2010, 08:48   #1674
 
elite*gold: 0
Join Date: Jun 2010
Posts: 17
Received Thanks: 10
Еще раз всем привет)).
А со скилами кто нибудь разобрался? Например, можно ли определить откатился ли скилл? И как у вас работа со скилами вообще реализована - расскажите плиз. Таймерами пользуетесь или просто все подряд запускаете, какой не откатился - тот и сработает?
krukovis is offline  
Old 07/12/2010, 14:19   #1675
 
GrieVeR-13's Avatar
 
elite*gold: 0
Join Date: Jul 2009
Posts: 60
Received Thanks: 84
Просьба к gen-ostr: если не жалко, выложи, плиз, инжект на скиллы пета)
GrieVeR-13 is offline  
Old 07/12/2010, 19:48   #1676
 
elite*gold: 0
Join Date: Dec 2009
Posts: 57
Received Thanks: 24
Quote:
Originally Posted by GrieVeR-13 View Post
Просьба к 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]; в конце.
ради интереса поковырялся более детально в своем инжекте ассиста. весь прикол в том, что этим инжектом можно даже увидеть кто в таргете у моба!!!! причем пофигу атакует моб физой или магией. (у мя раньше была проблема определения атаки моба магией). правда, почему это происходит не знаю. надо смотреть какие ининициализации я накрапал в своем коде, которые влияют на этот инжект
gen-ostr is offline  
Thanks
1 User
Old 07/13/2010, 06:17   #1677
 
elite*gold: 0
Join Date: Jul 2010
Posts: 11
Received Thanks: 15
Quote:
Originally Posted by gen-ostr View Post
по поводу инжекта ассиста - мой косяк. просто это только часть кода,на самом деле у мя там много еще всяких инициализаций, так как было написано спецом для хилящего приста, который ясный перец всегда в пати и не лидер.
Если не трудно, выложи пожалуйста свои инициализации. Как раз интересует похожее(ассист для членов пати по лидеру). Пока что удалось сделать ассист за 2 приема(выделение пл + ассист), но из-за получающейся паузы между ними это не очень подходит.
dixgen is offline  
Old 07/13/2010, 18:45   #1678
 
GrieVeR-13's Avatar
 
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;
GrieVeR-13 is offline  
Old 07/13/2010, 21:39   #1679
 
elite*gold: 0
Join Date: Dec 2009
Posts: 57
Received Thanks: 24
отзыв пэта как раз самая нужная функция. например: выбрал ты свободного моба, натравил пэта. но, пока пэт бежит, его захватил кто-то другой.. зачем споры типа это мой моб был? просто вернул пэта тихонько чтоб не палиться.
а зачем скилл автокаста смещать? просто смотришь когда он перезарядился- и используешь сново. по крайней мере у мя так.(у мя все скиллы проверяются) вот только откат банок так и не удалось контролировать
gen-ostr is offline  
Old 07/14/2010, 01:50   #1680
 
GrieVeR-13's Avatar
 
elite*gold: 0
Join Date: Jul 2009
Posts: 60
Received Thanks: 84
Я думал, имеется ввиду "призыв" пета. Из клетки)
Но в твоем случае отзыв действительно весьма полезен. Ты говорил, что не разбирался с этим еще?
Мне правда все эти функции нужны не для бота, а для облегчения управляемости феней) Напрягает каждый раз вызывать, ставить автокаст, жать атаку через альт... бафы, и больше всего это постоянно тыкать "следовать за хозяином" мышкой. Застревает в земле, курица.
GrieVeR-13 is offline  
Reply




All times are GMT +1. The time now is 21:08.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.