Skip to content

Commit d1e77ae

Browse files
committed
fix: Parse pcap time information from unknown fields
1 parent 211966f commit d1e77ae

File tree

2 files changed

+34
-35
lines changed

2 files changed

+34
-35
lines changed

ios/pcap/ipfinder.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ func FindIp(device ios.DeviceEntry) (NetworkInfo, error) {
2929

3030
}
3131

32-
3332
func findIp(device ios.DeviceEntry, mac string) (NetworkInfo, error) {
3433
intf, err := ios.ConnectToService(device, "com.apple.pcapd")
3534
if err != nil {
@@ -47,12 +46,12 @@ func findIp(device ios.DeviceEntry, mac string) (NetworkInfo, error) {
4746
if err != nil {
4847
return NetworkInfo{}, err
4948
}
50-
packet, err := getPacket(decodedBytes)
49+
_, packet, err := getPacket(decodedBytes)
5150
if err != nil {
5251
return NetworkInfo{}, err
5352
}
5453
if len(packet) > 0 {
55-
err:=findIP(packet, &info)
54+
err := findIP(packet, &info)
5655
if err != nil {
5756
return NetworkInfo{}, err
5857
}

ios/pcap/pcap.go

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,23 @@ var (
2525
// IOSPacketHeader :)
2626
// ref: https://github.com/gofmt/iOSSniffer/blob/master/pkg/sniffer/sniffer.go#L44
2727
type IOSPacketHeader struct {
28-
HdrSize uint32 `struc:"uint32,big"`
29-
Version uint8 `struc:"uint8,big"`
30-
PacketSize uint32 `struc:"uint32,big"`
31-
Type uint8 `struc:"uint8,big"`
32-
Unit uint16 `struc:"uint16,big"`
33-
IO uint8 `struc:"uint8,big"`
34-
ProtocolFamily uint32 `struc:"uint32,big"`
35-
FramePreLength uint32 `struc:"uint32,big"`
36-
FramePstLength uint32 `struc:"uint32,big"`
37-
IFName string `struc:"[16]byte"`
38-
Pid int32 `struc:"int32,little"`
39-
ProcName string `struc:"[17]byte"`
40-
Unknown uint32 `struc:"uint32,little"`
41-
Pid2 int32 `struc:"int32,little"`
42-
ProcName2 string `struc:"[17]byte"`
43-
Unknown2 [8]byte `struc:"[8]byte"`
28+
HdrSize uint32 `struc:"uint32,big"`
29+
Version uint8 `struc:"uint8,big"`
30+
PacketSize uint32 `struc:"uint32,big"`
31+
Type uint8 `struc:"uint8,big"`
32+
Unit uint16 `struc:"uint16,big"`
33+
IO uint8 `struc:"uint8,big"`
34+
ProtocolFamily uint32 `struc:"uint32,big"`
35+
FramePreLength uint32 `struc:"uint32,big"`
36+
FramePstLength uint32 `struc:"uint32,big"`
37+
IFName string `struc:"[16]byte"`
38+
Pid int32 `struc:"int32,little"`
39+
ProcName string `struc:"[17]byte"`
40+
Unknown uint32 `struc:"uint32,little"`
41+
Pid2 int32 `struc:"int32,little"`
42+
ProcName2 string `struc:"[17]byte"`
43+
TsSec int `struc:"int32,big"` /* timestamp seconds */
44+
TsUsec int `struc:"int32,big"` /* timestamp microseconds */
4445
}
4546

4647
func (iph *IOSPacketHeader) ToString() string {
@@ -80,12 +81,12 @@ func Start(device ios.DeviceEntry) error {
8081
if err != nil {
8182
return err
8283
}
83-
packet, err := getPacket(decodedBytes)
84+
iph, packet, err := getPacket(decodedBytes)
8485
if err != nil {
8586
return err
8687
}
8788
if len(packet) > 0 {
88-
err = writePacket(f, packet)
89+
err = writePacket(f, iph, packet)
8990
if err != nil {
9091
return err
9192
}
@@ -137,11 +138,10 @@ func createPcap(name string) (*os.File, error) {
137138
return f, nil
138139
}
139140

140-
func writePacket(f *os.File, packet []byte) error {
141-
now := time.Now()
141+
func writePacket(f *os.File, iph IOSPacketHeader, packet []byte) error {
142142
phs := &PcaprecHdrS{
143-
int(now.Unix()),
144-
int(now.UnixNano()/1e3 - now.Unix()*1e6),
143+
iph.TsSec,
144+
iph.TsUsec,
145145
len(packet),
146146
len(packet),
147147
}
@@ -155,41 +155,41 @@ func writePacket(f *os.File, packet []byte) error {
155155
return nil
156156
}
157157

158-
func getPacket(buf []byte) ([]byte, error) {
159-
iph := IOSPacketHeader{}
158+
func getPacket(buf []byte) (iph IOSPacketHeader, packet []byte, err error) {
159+
iph = IOSPacketHeader{}
160160
preader := bytes.NewReader(buf)
161161
struc.Unpack(preader, &iph)
162162

163163
// support ios 15 beta4
164164
if iph.HdrSize > PacketHeaderSize {
165165
buf := make([]byte, iph.HdrSize-PacketHeaderSize)
166-
_, err := io.ReadFull(preader, buf)
166+
_, err = io.ReadFull(preader, buf)
167167
if err != nil {
168-
return []byte{}, err
168+
return iph, []byte{}, err
169169
}
170170
}
171171

172172
// Only return specific packet
173173
if Pid > 0 {
174174
if iph.Pid != Pid && iph.Pid2 != Pid {
175-
return []byte{}, nil
175+
return iph, []byte{}, nil
176176
}
177177
}
178178

179179
if ProcName != "" {
180180
if !strings.HasPrefix(iph.ProcName, ProcName) && !strings.HasPrefix(iph.ProcName2, ProcName) {
181-
return []byte{}, nil
181+
return iph, []byte{}, nil
182182
}
183183
}
184184

185185
//log.Info("IOSPacketHeader: ", iph.ToString())
186-
packet, err := ioutil.ReadAll(preader)
186+
packet, err = ioutil.ReadAll(preader)
187187
if err != nil {
188-
return packet, err
188+
return iph, packet, err
189189
}
190190
if iph.FramePreLength == 0 {
191191
ext := []byte{0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0x08, 0x00}
192-
return append(ext, packet...), nil
192+
return iph, append(ext, packet...), nil
193193
}
194-
return packet, nil
194+
return iph, packet, nil
195195
}

0 commit comments

Comments
 (0)