Skip to content

Commit a825f89

Browse files
Jacob Moodydylanhitt
Jacob Moody
authored andcommitted
first pass at adding support to lockdown for copying crashlogs
1 parent cd145ff commit a825f89

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

lockdown/lockdown.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ package lockdown
22

33
// #cgo pkg-config: libimobiledevice-1.0
44
// #include <stdlib.h>
5+
// #include <libimobiledevice/libimobiledevice.h>
56
// #include <libimobiledevice/lockdown.h>
7+
// #include <libimobiledevice/service.h>
68
import "C"
79
import (
10+
"errors"
811
"unsafe"
912

1013
"github.com/nowsecure/goidevice/idevice"
@@ -19,6 +22,7 @@ type Client interface {
1922
DeviceName() (string, error)
2023
PList(domain string) (*plist.PList, error)
2124
Close() error
25+
StartService(d idevice.Device, serviceName string) (*Service, error)
2226
}
2327

2428
type client struct {
@@ -102,3 +106,52 @@ func (s *client) Close() error {
102106
}
103107
return err
104108
}
109+
110+
type Service struct {
111+
s C.service_client_t
112+
}
113+
114+
const (
115+
CRASH_REPORT_MOVER_SERVICE = "com.apple.crashreportmover"
116+
)
117+
118+
func (s *client) StartService(d idevice.Device, serviceName string) (*Service, error) {
119+
var p C.lockdownd_service_descriptor_t
120+
121+
svc := C.CString(serviceName)
122+
defer C.free(unsafe.Pointer(svc))
123+
err := resultToError(C.lockdownd_start_service(s.p, svc, &p))
124+
if err != nil {
125+
return nil, err
126+
}
127+
128+
var c C.service_client_t
129+
res := C.service_client_new((C.idevice_t)(idevice.GetPointer(d)), p, &c)
130+
C.lockdownd_service_descriptor_free(p)
131+
if res != 0 {
132+
return nil, errors.New(":(")
133+
}
134+
return &Service{c}, nil
135+
}
136+
137+
func (s *Service) ReadPing() error {
138+
var msg [4]int8
139+
var n C.uint32_t
140+
141+
var attempts = 0
142+
for {
143+
res := C.service_receive_with_timeout(s.s, (*C.char)(&msg[0]), 4, &n, 2000)
144+
switch res {
145+
case 0:
146+
return nil
147+
case -7:
148+
attempts++
149+
if attempts == 10 {
150+
return errors.New("failed 10 attempts to ping")
151+
}
152+
continue
153+
default:
154+
return errors.New(":(((")
155+
}
156+
}
157+
}

thing/main.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package main
2+
3+
import (
4+
"log"
5+
"os"
6+
7+
"github.com/nowsecure/goidevice/idevice"
8+
"github.com/nowsecure/goidevice/lockdown"
9+
)
10+
11+
func main() {
12+
device, err := idevice.New(os.Args[1])
13+
if err != nil {
14+
log.Fatal(err)
15+
}
16+
lock, err := lockdown.NewClientWithHandshake(device, "thingy")
17+
if err != nil {
18+
log.Fatal(err)
19+
}
20+
client, err := lock.StartService(device, lockdown.CRASH_REPORT_MOVER_SERVICE)
21+
if err != nil {
22+
log.Fatal(err)
23+
}
24+
err = client.ReadPing()
25+
if err != nil {
26+
log.Fatal(err)
27+
} else {
28+
log.Println("yay we did it")
29+
}
30+
}

0 commit comments

Comments
 (0)