I believe the simplest way to modify the source MAC address of a packet is as follows:
// Extract the Ethernet layer from the Ethernet datagram.
EthernetLayer ethernet = (EthernetLayer)sourcePacket.Ethernet.ExtractLayer();
// Change the source MAC address.
ethernet.Source = new MacAddress("11:22:33:44:55:66");
// Create a new packet with the modified source MAC address.
Packet targetPacket = PacketBuilder.Build(sourcePacket.Timestamp, ethernet, sourcePacket.Ethernet.Payload.ExtractLayer());
The most important thing to note is the usage of ExtractLayer(), which extracts a layer from a datagram.
When you call it on an EtherentDatagram, you get an EthernetLayer.
When you call it on an IpV4Datagram, you get an IpV4Layer.
When you call it on a Datagram, you get a PayloadLayer.
In the example I call it on the EtherentDatagram to get the EthernetLayer and modify the source MAC address.
In order to get the rest of the packet unchanged, I call the EthernetDatagram.Payload property, which gives me a Datagram, and then call the ExtractLayer() on that to get a PayloadLayer.
With the given two layers, I build a packet using the PacketBuilder.
I hope this would help you,