Hi. I guess I am using the right address because I can see the packets but I cannot send packets.
I am using:
NetworkClass is updated on at PacketHandler and I know it's working properly.
I have two send functions presented on this thread.
The first one crashes my client:
The second one doesn't crash the client but doesn't produce output
For testing I am trying to jump in TC from (487,424) to (500,427) with:
Could anyone help me? What am I doing wrong?
I am using:
PHP Code:
const int SendPacketAddress = 0x7155FD;
const int RecvPacketAddress = 0x7158D2;
int NetworkClass = 0;
I have two send functions presented on this thread.
The first one crashes my client:
PHP Code:
private void SendPacketFunction(byte[] Packet)
{
ushort PacketType = BitConverter.ToUInt16(Packet, 2);
uint PacketAddress = Dbg.AllocateMemory((uint)Packet.Length);
if (PacketAddress > 0)
{
Dbg.WriteByteArray(Packet, (int) PacketAddress);
MemoryStream ByteCode = new MemoryStream();
BinaryWriter CodeWriter = new BinaryWriter(ByteCode);
//mov edx, packettype
CodeWriter.Write(Convert.ToByte(0xba));
CodeWriter.Write(Convert.ToInt32(PacketType));
//push packetsize
CodeWriter.Write(Convert.ToByte(0x68));
CodeWriter.Write(Convert.ToInt32(Packet.Length));
//push packetaddress
CodeWriter.Write(Convert.ToByte(0x68));
CodeWriter.Write(Convert.ToInt32(PacketAddress));
//mov esi, networkclass
CodeWriter.Write(Convert.ToByte(0xbe));
CodeWriter.Write(Convert.ToInt32(NetworkClass));
//mov ecx, [esi+14]
CodeWriter.Write(new byte[] {
0x8b,
0x4e,
0x14
});
//mov eax, sendpacketfunction
CodeWriter.Write(Convert.ToByte(0xb8));
CodeWriter.Write(Convert.ToInt32(SendPacketAddress));
//call eax
CodeWriter.Write(new byte[] {
0xff,
0xd0
});
//ret
CodeWriter.Write(Convert.ToByte(0xc3));
//write to the underlying stream
CodeWriter.Flush();
//execute the code
Dbg.ExecuteCode(ByteCode.ToArray());
//free memory afterwards
Dbg.FreeMemory((int)PacketAddress);
}
}
PHP Code:
public void SendPacket(byte[] packet)
{
int packetAddr = (int)this.Dbg.AllocateMemory((uint)packet.Length);
this.Dbg.WriteByteArray(packet, (int)packetAddr);
using (MemoryStream ms = new MemoryStream())
using (BinaryWriter writer = new BinaryWriter(ms))
{
// push packet size
writer.Write((byte)0x68);
writer.Write(packet.Length);
// push packet address
writer.Write((byte)0x68);
writer.Write(packetAddr);
// store NetWorkClass address in ECX
writer.Write((byte)0xB9);
writer.Write(NetworkClass);
// store SendPacket() address in EAX
writer.Write((byte)0xB8);
writer.Write(SendPacketAddress);
// call function stored in EAX
writer.Write(new byte[] { 0xFF, 0xD0 });
// return
writer.Write((byte)0xC3);
this.Dbg.ExecuteCode(ms.ToArray());
}
this.Dbg.FreeMemory(packetAddr);
}
PHP Code:
byte[] Packet = new byte[38];
//Size
Packets.WriteUInt16(38, 0, Packet);
Packets.WriteUInt16(10010, 2, Packet);
//UID
Packets.WriteUInt32(2621234, 4, Packet);
//Packets.WriteUInt16(30, 6, Packet);
//Dest
Packets.WriteUInt16(500, 8, Packet);
Packets.WriteUInt16(427, 10, Packet);
//
Packets.WriteUInt16(0, 12, Packet);
Packets.WriteUInt16(0, 14, Packet);
//
Packets.WriteUInt32((UInt32)Environment.TickCount , 16 , Packet);
//
Packets.WriteUInt16(137, 20, Packet);
Packets.WriteUInt16(0, 22, Packet);
//
Packets.WriteUInt16(487, 24, Packet);
Packets.WriteUInt16(424, 26, Packet);
Packets.WriteUInt16(1002, 28, Packet);
Packets.WriteUInt16(0, 30, Packet);
Packets.WriteUInt16(65535, 32, Packet);
Packets.WriteUInt16(65535, 34, Packet);
Packets.WriteUInt16(0, 36, Packet);
SelectedClient.SendPacket(Packet);