public void SendPacket(Packet packet) { // Выделяем место под пакет, который мы будем посылать int packetAddress = _client.Mem.AllocateMemory(packet.Data.Length); // Записываем пакет _client.Mem.WriteBytes(packet.Data, packetAddress); // Переводим адрес, куда мы записали пакет в массив байт var packetLocation = BitConverter.GetBytes(packetAddress); // Если код не загружен ранее, загружаем его в память if (_sendPacketOpcodeAddress == 0) { LoadSendPacketOpcode(); } // Записываем адрес, где лежит пакет в тело нашего инжекта _client.Mem.WriteBytes(packetLocation, _packetAddressLocation); // Записываем длину пакета _client.Mem.WriteBytes(new[] { (byte)packet.Data.Length }, _packetSizeAddress); // Запускаем инжект IntPtr threadHandle = _client.Mem.CreateRemoteThread(_sendPacketOpcodeAddress); // Ждем окончания выполнения потока _client.Mem.WaitForSingleObject(threadHandle); // Уничтожаем поток WinApi.CloseHandle(threadHandle); // Освобождаем память, выделенную под пакет _client.Mem.FreeMemory(packetAddress, packet.Data.Length); // Освобождаем память, выделенную под код отправки пакета _client.Mem.FreeMemory(_sendPacketOpcodeAddress, _sendPacketOpcode.Length); }
/// <summary> /// Закрывает дескриптор открытого процесса. /// </summary> public static void CloseProcess() { WinApi.CloseHandle(OpenProcessHandle); }