Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

Не копает...

-

Общение разработчиков

- Программирование для Perfect World, общение и обсуждене разработок

Ответ
 
Опции темы
Старый 15.11.2016, 00:08   #16
 Разведчик
Аватар для Arsen0208
 
Arsen0208 никому не известный тип
Регистрация: 24.10.2011
Сообщений: 8
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Не копает...

Цитата:
[DllImport("kernel32.dll")]
public static extern bool WriteProcessMemory(
IntPtr hProcess,
Int32 lpBaseAddress,
[In, Out] Byte[] buffer,
Int32 nSize,
out Int32 lpNumberOfBytesWritten);

это? о.о
Просто до такого мастерства я еще не дорос...
Использую библиотеки которые были выложены тут, в частности фрэймворк на с#

Добавлено через 6 минут
https://zhyk.ru/forum/showthread.php...ht=PWFrameWork
вот отсюда все взято.

Последний раз редактировалось Arsen0208; 15.11.2016 в 00:16. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 15.11.2016, 18:27   #17
 Разведчик
Аватар для gta4user
 
gta4user никому не известный тип
Регистрация: 21.10.2013
Сообщений: 4
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 9 раз(а) в 8 сообщениях
 
По умолчанию Re: Не копает...

то что пишется в lpBaseAddress из buffer, размером с nSize
  Ответить с цитированием
Старый 15.11.2016, 22:18   #18
 Разведчик
Аватар для Arsen0208
 
Arsen0208 никому не известный тип
Регистрация: 24.10.2011
Сообщений: 8
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Не копает...

Цитата:
private void AllocateMemory()
{
//Выделяем страницу память в 2000 байт
int alloc_address = WinApi.VirtualAllocEx(this.OpenedProcessHandle, 0, 2500, WinApi.AllocationType.Commit, WinApi.MemoryProtection.ReadWrite);
//Сначала листа будут прописываться функции
this.FuncAllocMemory = alloc_address;
//с отступом в 500 - будет логин
this.LoginAllocMemory = alloc_address + 500;
//с отступом в 1000 - будет пароль
this.PassAllocMemory = alloc_address + 1000;
//с отступом в 1500 - будет прописываться другой текст
this.TextAllocMemory = alloc_address + 1500;
//с отступом в 2000 - будет прописываться пакет
this.PacketAllocMemory = alloc_address + 2000;
}

Цитата:
public void RunAsm()
{
//Преобразовываем строку с асмом в байт-код
byte[] Asm = this.AsmChangebytes(this.Asmcode);
//Если процесс не открыт - сообщаем об ошибке и не запускаем функцию
if (this.memory.OpenedProcessID == 0)
{
MessageBox.Show("Process.ID = 0. Невозможно выполнить действие.");
return;
}

//временная переменная
int tmpInt;
//Записываем в открытую память asm-функцию
WinApi.WriteProcessMemory(memory.OpenedProcessHand le, memory.FuncAllocMemory, Asm, Asm.Length, out tmpInt);
IntPtr tmpIntPtr;
//запускаем этот байт код в отдельном потоке
WinApi.CreateRemoteThread(memory.OpenedProcessHand le, IntPtr.Zero, 0, memory.FuncAllocMemory, IntPtr.Zero, 0, out tmpIntPtr);
//очищаем эту память
WinApi.VirtualFreeEx(memory.OpenedProcessHandle, memory.FuncAllocMemory, Asm.Length, WinApi.FreeType.Release);

//очищаем строку с asm кодом
this.Asmcode = "";
}


продолжаю экспериментировать с asm но ни не получается.

Последний раз редактировалось Arsen0208; 15.11.2016 в 22:20.
  Ответить с цитированием
Старый 18.11.2016, 12:29   #19
 Разведчик
Аватар для gta4user
 
gta4user никому не известный тип
Регистрация: 21.10.2013
Сообщений: 4
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 9 раз(а) в 8 сообщениях
 
По умолчанию Re: Не копает...

попробуй без асм, сделай проще:
Код:
byte[] Packet = new byte[26] {
	0x60,				//pushad
	0x6A,0x01,			//PUSH 0x1
	0x68,0x11,0x11,0x11,0x11,	//PUSH resWID
	0x8B,0x0D,0x22,0x22,0x22,0x22,	//MOV ECX,DWORD PTR DS:[GA]
	0x8B,0x49,0x34,			//MOV ECX,DWORD PTR DS:[ECX+0x34]
	0xBA,0x33,0x33,0x33,0x33,	//MOV EDX, pickWalk_addr
	0xFF,0xD2,			//CALL EDX
	0x61,				//popad
	0xC3				//RETN
	};
const uint resWID = 0x00000000;	// Подставить сюда WID
const uint GA = 0x00EF8AEC;
const uint pickWalk_addr = 0x004C46D0;
Buffer.BlockCopy(BitConverter.GetBytes(resWID),0,Packet,4,4);
Buffer.BlockCopy(BitConverter.GetBytes(GA),0,Packet,10,4);
Buffer.BlockCopy(BitConverter.GetBytes(pickWalk_addr),0,Packet,18,4);
для поиска WID удобно использовать вот этот оффсет в CE:
BA + 1C + 1C + 18 + 8
значение hex = WID по наведению мыши, работает на NPC, ресы, игроков, мобов

Если и это тебе не поможет, то
  Ответить с цитированием
Старый 18.11.2016, 16:31   #20
 Разведчик
Аватар для Arsen0208
 
Arsen0208 никому не известный тип
Регистрация: 24.10.2011
Сообщений: 8
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Не копает...

Тупо скопировал тупо вставил и тупо врубил!
Пакет отправился, перс не двигается... Что со мной не так?
P.S. отправку пакета проверил через ПакетЛист.

Добавлено через 3 минуты
Не понимаю почему отправка пакета на Медитацию, например, работает, а этот пакет не работает?..
И список у меня тоже не отображается через С#.. (список лута рядом)
На Delphi что ль переходить?

Последний раз редактировалось Arsen0208; 18.11.2016 в 16:35. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 18.11.2016, 16:42   #21
 Разведчик
Аватар для gta4user
 
gta4user никому не известный тип
Регистрация: 21.10.2013
Сообщений: 4
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 9 раз(а) в 8 сообщениях
 
По умолчанию Re: Не копает...

может быть запускаешь как пакет на адрес PackCall?
  Ответить с цитированием
Старый 18.11.2016, 16:47   #22
 Разведчик
Аватар для Arsen0208
 
Arsen0208 никому не известный тип
Регистрация: 24.10.2011
Сообщений: 8
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Не копает...

ммм а на какой адрес нужно отправлять?

Добавлено через 7 минут
намекните чайнику что тут не так?

Цитата:
public void Send(byte[] packet)
{
//временная переменная
int tmpInt;
//Записываем в открытую память пакет в выделенное место
WinApi.WriteProcessMemory(memory.OpenedProcessHand le, memory.PacketAllocMemory, packet, packet.Length, out tmpInt);

//выполняем функцию отправки пакета
ASM asm = new ASM(this.memory);
asm.Pushad();
asm.Mov_EAX(PWOffssAndAddrss.packet_function_addre ss);
asm.Mov_ECX_DWORD_Ptr(PWOffssAndAddrss.base_addres s);
asm.Mov_ECX_DWORD_Ptr_ECX_Add(0x20);
asm.Mov_EDI(memory.PacketAllocMemory);
asm.Push6A(packet.Length);
asm.Push_EDI();
asm.Call_EAX();
asm.Popad();
asm.Ret();
asm.RunAsm();

}


Последний раз редактировалось Arsen0208; 18.11.2016 в 16:55. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 18.11.2016, 17:01   #23
 Разведчик
Аватар для gta4user
 
gta4user никому не известный тип
Регистрация: 21.10.2013
Сообщений: 4
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 9 раз(а) в 8 сообщениях
 
По умолчанию Re: Не копает...

Кхм.. есть пакеты, а есть ижекты. Похоже ты их не различаешь.
Для пакетов действительно нужна функция отправки, которую ты привёл. Ты заливаешь в память, как функцию, так и сам пакет, потом выполняешь функцию.
Для инжектов достаточно загрузить функцию и выполнить только её.
То что я выложил выше это заботливо написанная функция, без использования asm. тупо загоняешь в память и CreateRemoteThread.
  Ответить с цитированием
Старый 18.11.2016, 17:26   #24
 Разведчик
Аватар для Arsen0208
 
Arsen0208 никому не известный тип
Регистрация: 24.10.2011
Сообщений: 8
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Не копает...

я так понял что начало такое:
Цитата:
byte[] Packet = new byte[26] {
0x60, //pushad
0x6A,0x01, //PUSH 0x1
0x68,0x11,0x11,0x11,0x11, //PUSH resWID
0x8B,0x0D,0x22,0x22,0x22,0x22, //MOV ECX,DWORD PTR DS:[GA]
0x8B,0x49,0x34, //MOV ECX,DWORD PTR DS:[ECX+0x34]
0xBA,0x33,0x33,0x33,0x33, //MOV EDX, pickWalk_addr
0xFF,0xD2, //CALL EDX
0x61, //popad
0xC3 //RETN
};
const uint resWID = 3222277595; // Подставить сюда WID
const uint GA = 0x00EF8AEC;
const uint pickWalk_addr = 0x004C46D0;
Buffer.BlockCopy(BitConverter.GetBytes(resWID), 0, Packet, 4, 4);
Buffer.BlockCopy(BitConverter.GetBytes(GA), 0, Packet, 10, 4);
Buffer.BlockCopy(BitConverter.GetBytes(pickWalk_ad dr), 0, Packet, 18, 4);

int tmpInt;

WinApi.WriteProcessMemory(memories[0].OpenedProcessHandle, memories[0].PacketAllocMemory, Packet, Packet.Length, out tmpInt);
WinApi.CreateRemoteThread(memories[0].OpenedProcessHandle, 0, 0,

какие переменные нужно вписать в CreateRemoteThread?...

Добавлено через 3 минуты
И есть ли где на просторах гайд по этой части?.. Потому что все мои скрипты были основанны на готовом ФрэймВорке в котором было достаточно просто адреса сменить, а сейчас вот выясняется что и это нужно хорошо выучить что бы что то получалось.

Последний раз редактировалось Arsen0208; 18.11.2016 в 17:29. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 18.11.2016, 17:51   #25
 Разведчик
Аватар для KLAIDY
 
KLAIDY никому не известный тип
Регистрация: 11.10.2010
Сообщений: 13
Популярность: 10
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 5 сообщениях
 
По умолчанию Re: Не копает...

Попробуй тут прочитать, может поможет.
[Ссылки могут видеть только зарегистрированные пользователи. ]
  Ответить с цитированием
Старый 18.11.2016, 18:33   #26
 Разведчик
Аватар для gta4user
 
gta4user никому не известный тип
Регистрация: 21.10.2013
Сообщений: 4
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 9 раз(а) в 8 сообщениях
 
По умолчанию Re: Не копает...

Блин, как же мне неудобно в этом вашем C#
накидал полный исходник консольной программы на этом языке, на котором ещё пару дней назад ничего не делал, поэтому косяки с типами переменных в DllImport, главное что это собирается и работает.
Код:
using System;
using System.Runtime.InteropServices;
class pickWalk
{
	[DllImport("user32.dll")]
	public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
	[DllImport("user32.dll")]
	public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out int ProcessId);
	[DllImport("kernel32.dll")]
	public static extern IntPtr OpenProcess(uint processAccess, bool bInheritHandle, int processId);
	[DllImport("kernel32.dll", SetLastError=true, ExactSpelling=true)]
	public static extern IntPtr VirtualAllocEx(IntPtr hProcess,int lpAddress,int dwSize,uint flAllocationType,uint flProtect);
	[DllImport("kernel32.dll")]
	public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer,int dwSize,int lpNumberOfBytesWritten);
	[DllImport("kernel32")]
	public static extern IntPtr CreateRemoteThread(IntPtr hProcess,IntPtr lpThreadAttributes,uint dwStackSize,IntPtr lpStartAddress,IntPtr lpParameter,uint dwCreationFlags,int lpThreadId);
        static void Main()
        {
		IntPtr hWnd = FindWindow(null, "Perfect World");
		int pid;
		GetWindowThreadProcessId(hWnd, out pid);
		const uint PROCESS_ALL_ACCESS = 0x001F0FFF;
		IntPtr hproc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
		byte[] Packet = new byte[26] {
		0x60,					//pushad
		0x6A,0x01,                          	//PUSH 0x1
		0x68,0x11,0x11,0x11,0x11,           	//PUSH resWID
		0x8B,0x0D,0x22,0x22,0x22,0x22,      	//MOV ECX,DWORD PTR DS:[GA]			0x8B,0x49,0x34,                     //MOV ECX,DWORD PTR DS:[ECX+0x34]
		0xBA,0x33,0x33,0x33,0x33,           	//MOV EDX, pickWalk_addr
		0xFF,0xD2,                         	//CALL EDX
		0x61,                               	//popad
		0xC3					//RETN
		};
		const uint resWID = 0x00000000;
		const uint GA = 0x00EF8AEC;
		const uint pickWalk_addr = 0x004C46D0;
		Buffer.BlockCopy(BitConverter.GetBytes(resWID),0,Packet,4,4);
		Buffer.BlockCopy(BitConverter.GetBytes(GA),0,Packet,10,4);
		Buffer.BlockCopy(BitConverter.GetBytes(pickWalk_addr),0,Packet,18,4);
		const uint MEM_COMMIT = 0x1000;
		const uint PAGE_READWRITE = 0x04;
		IntPtr vAddr_pickWalk = VirtualAllocEx(hproc,0,26,MEM_COMMIT,PAGE_READWRITE);
		WriteProcessMemory(hproc,vAddr_pickWalk,Packet,26,0);
		IntPtr hProcThread = CreateRemoteThread(hproc,(IntPtr)null,0,vAddr_pickWalk,(IntPtr)null,0,0);
           	Console.WriteLine("Press any key to exit.");
            	Console.ReadKey();
        }
}
  Ответить с цитированием
Старый 18.11.2016, 19:14   #27
 Разведчик
Аватар для Arsen0208
 
Arsen0208 никому не известный тип
Регистрация: 24.10.2011
Сообщений: 8
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Не копает...

Цитата:
Сообщение от gta4userПосмотреть сообщение
Блин, как же мне неудобно в этом вашем C#
накидал полный исходник консольной программы на этом языке, на котором ещё пару дней назад ничего не делал, поэтому косяки с типами переменных в DllImport, главное что это собирается и работает.
Код:
using System;
using System.Runtime.InteropServices;
class pickWalk
{
	[DllImport("user32.dll")]
	public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
	[DllImport("user32.dll")]
	public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out int ProcessId);
	[DllImport("kernel32.dll")]
	public static extern IntPtr OpenProcess(uint processAccess, bool bInheritHandle, int processId);
	[DllImport("kernel32.dll", SetLastError=true, ExactSpelling=true)]
	public static extern IntPtr VirtualAllocEx(IntPtr hProcess,int lpAddress,int dwSize,uint flAllocationType,uint flProtect);
	[DllImport("kernel32.dll")]
	public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer,int dwSize,int lpNumberOfBytesWritten);
	[DllImport("kernel32")]
	public static extern IntPtr CreateRemoteThread(IntPtr hProcess,IntPtr lpThreadAttributes,uint dwStackSize,IntPtr lpStartAddress,IntPtr lpParameter,uint dwCreationFlags,int lpThreadId);
        static void Main()
        {
		IntPtr hWnd = FindWindow(null, "Perfect World");
		int pid;
		GetWindowThreadProcessId(hWnd, out pid);
		const uint PROCESS_ALL_ACCESS = 0x001F0FFF;
		IntPtr hproc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
		byte[] Packet = new byte[26] {
		0x60,					//pushad
		0x6A,0x01,                          	//PUSH 0x1
		0x68,0x11,0x11,0x11,0x11,           	//PUSH resWID
		0x8B,0x0D,0x22,0x22,0x22,0x22,      	//MOV ECX,DWORD PTR DS:[GA]			0x8B,0x49,0x34,                     //MOV ECX,DWORD PTR DS:[ECX+0x34]
		0xBA,0x33,0x33,0x33,0x33,           	//MOV EDX, pickWalk_addr
		0xFF,0xD2,                         	//CALL EDX
		0x61,                               	//popad
		0xC3					//RETN
		};
		const uint resWID = 0x00000000;
		const uint GA = 0x00EF8AEC;
		const uint pickWalk_addr = 0x004C46D0;
		Buffer.BlockCopy(BitConverter.GetBytes(resWID),0,Packet,4,4);
		Buffer.BlockCopy(BitConverter.GetBytes(GA),0,Packet,10,4);
		Buffer.BlockCopy(BitConverter.GetBytes(pickWalk_addr),0,Packet,18,4);
		const uint MEM_COMMIT = 0x1000;
		const uint PAGE_READWRITE = 0x04;
		IntPtr vAddr_pickWalk = VirtualAllocEx(hproc,0,26,MEM_COMMIT,PAGE_READWRITE);
		WriteProcessMemory(hproc,vAddr_pickWalk,Packet,26,0);
		IntPtr hProcThread = CreateRemoteThread(hproc,(IntPtr)null,0,vAddr_pickWalk,(IntPtr)null,0,0);
           	Console.WriteLine("Press any key to exit.");
            	Console.ReadKey();
        }
}

Слава чудоволшебнику! Огромнейшее спасибо!
Все работает чудесно!
На последок не подскажите где почитать об инжекте именно таких функций?
А то есть несколько строчек в коде, значение которых я не понимаю вообще

Добавлено через 4 минуты
Цитата:
Сообщение от KLAIDYПосмотреть сообщение
Попробуй тут прочитать, может поможет.
[Ссылки могут видеть только зарегистрированные пользователи. ]

Тоже взял на вооружение, спасибо, позже попробую вникнуть во всю предоставленную там инфу.

Последний раз редактировалось Arsen0208; 18.11.2016 в 19:19. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 18.11.2016, 20:21   #28
 Разведчик
Аватар для gta4user
 
gta4user никому не известный тип
Регистрация: 21.10.2013
Сообщений: 4
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 9 раз(а) в 8 сообщениях
 
По умолчанию Re: Не копает...

Не совсем понял, что не понятно поинжектам. Берём существующую функцию из клиента, которая передаёт необходымые параметры в другую (нам нужную). В конкретном случае: нужная функция расположена по адресу 0x004C46D0, а та функция, которую мы меняли для наших нужд находится по адресу 004BEF38 (посмотри её в памяти, что бы иметь представление). Дальше нам нужно заставить клиент выполнить отредактированную функцию. Для этого мы должны записать её в память нужного процесса, а затем передать на исполнение процессору.
FindWindow - ищем окно игры и получаем его дескриптор
GetWindowThreadProcessId - получаем pid по дискриптору
OpenProcess - подключаемся к процессу по его pid
VirtualAllocEx - выделяем страницу памяти в чужом процессе
WriteProcessMemory - записываем нашу функцию в эту память
CreateRemoteThread - передаём память на исполение процессору
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Программа] Ломает шмот Alexandre288 Общение и обсуждение Perfect World 0 17.08.2013 05:39
+FF0 +18 -(1-копает, двигается.... krysun Общение разработчиков 5 29.01.2012 16:18

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 14:05.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net