Skip to content

Commit 4f94e48

Browse files
committed
feat: add gxpc offsets
1 parent e8800cc commit 4f94e48

File tree

4 files changed

+144
-84
lines changed

4 files changed

+144
-84
lines changed

logger.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@ func (l *Logger) SetOutput(output string) error {
4646
}
4747

4848
func (l *Logger) Close() error {
49-
return l.f.Close()
49+
if l.f != nil {
50+
return l.f.Close()
51+
}
52+
return nil
5053
}
5154

5255
func (l *Logger) Infof(format string, args ...any) {

main.go

Lines changed: 76 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
_ "embed"
55
"encoding/base64"
66
"encoding/json"
7+
"errors"
78
"fmt"
89
"github.com/frida/frida-go/frida"
910
"github.com/spf13/cobra"
@@ -21,23 +22,24 @@ var scContent string
2122

2223
var Version string
2324

25+
var logger *Logger = nil
26+
2427
var rootCmd = &cobra.Command{
25-
Use: "gxpc [spawn_args]",
26-
Short: "XPC sniffer",
27-
Version: Version,
28-
Run: func(cmd *cobra.Command, args []string) {
29-
logger := NewLogger()
28+
Use: "gxpc [spawn_args]",
29+
Short: "XPC sniffer",
30+
Version: Version,
31+
SilenceErrors: true,
32+
SilenceUsage: true,
33+
RunE: func(cmd *cobra.Command, args []string) error {
3034

3135
initConfig, err := cmd.Flags().GetBool("init")
3236
if err != nil {
33-
logger.Errorf("%v", err)
34-
return
37+
return err
3538
}
3639

3740
config, err := cmd.Flags().GetString("config")
3841
if err != nil {
39-
logger.Errorf("%v", err)
40-
return
42+
return err
4143
}
4244

4345
if config == "" {
@@ -50,88 +52,78 @@ var rootCmd = &cobra.Command{
5052
Offsets: []Offset{
5153
{
5254
OS: "iPhone14,7",
53-
Builds: map[string]BuildData{
54-
"20B110": {PlistCreate: "0xb1c00", CallHandler: "0x11c00"},
55+
Builds: []map[string]BuildData{
56+
{
57+
"20B110": {PlistCreate: "0xb1c00", CallHandler: "0x11c00"},
58+
},
5559
},
5660
},
5761
{
5862
OS: "iPad7,11",
59-
Builds: map[string]BuildData{
60-
"22B83": {PlistCreate: "0x7dbf4", CallHandler: "0xf98c"},
63+
Builds: []map[string]BuildData{
64+
{"22B83": {PlistCreate: "0x7dbf4", CallHandler: "0xf98c"}},
6165
},
6266
},
6367
},
6468
}
6569

6670
f, err := os.Create(config)
6771
if err != nil {
68-
logger.Errorf("%v", err)
69-
return
72+
return err
7073
}
7174
defer f.Close()
7275

7376
encoder := json.NewEncoder(f)
7477
encoder.SetIndent(" ", " ")
7578

7679
if err := encoder.Encode(configData); err != nil {
77-
logger.Errorf("%v", err)
78-
return
80+
return err
7981
}
8082

8183
logger.Infof("Created new config at %s", config)
82-
return
84+
return nil
8385
}
8486

8587
list, err := cmd.Flags().GetBool("list")
8688
if err != nil {
87-
logger.Errorf("%v", err)
88-
return
89+
return err
8990
}
9091

9192
id, err := cmd.Flags().GetString("id")
9293
if err != nil {
93-
logger.Errorf("%v", err)
94-
return
94+
return err
9595
}
9696

9797
remote, err := cmd.Flags().GetString("remote")
9898
if err != nil {
99-
logger.Errorf("%v", err)
100-
return
99+
return err
101100
}
102101

103102
pid, err := cmd.Flags().GetInt("pid")
104103
if err != nil {
105-
logger.Errorf("%v", err)
106-
return
104+
return err
107105
}
108106

109107
procName, err := cmd.Flags().GetString("name")
110108
if err != nil {
111-
logger.Errorf("%v", err)
112-
return
109+
return err
113110
}
114111

115112
output, err := cmd.Flags().GetString("output")
116113
if err != nil {
117-
logger.Errorf("%v", err)
118-
return
114+
return err
119115
}
120116

121117
if output != "" {
122118
if err := logger.SetOutput(output); err != nil {
123-
logger.Errorf("%v", err)
124-
return
119+
return err
125120
}
126121
}
127122

128-
defer logger.Close()
129-
130123
mgr := frida.NewDeviceManager()
131124
devices, err := mgr.EnumerateDevices()
132125
if err != nil {
133-
logger.Errorf("%v", err)
134-
return
126+
return err
135127
}
136128

137129
if list {
@@ -141,7 +133,7 @@ var rootCmd = &cobra.Command{
141133
d.Name(),
142134
d.ID())
143135
}
144-
return
136+
return nil
145137
}
146138

147139
var dev *frida.Device
@@ -156,8 +148,7 @@ var rootCmd = &cobra.Command{
156148
} else if remote != "" {
157149
rdevice, err := mgr.AddRemoteDevice(remote, nil)
158150
if err != nil {
159-
logger.Errorf("%v", err)
160-
return
151+
return err
161152
}
162153
dev = rdevice.(*frida.Device)
163154
break
@@ -167,8 +158,7 @@ var rootCmd = &cobra.Command{
167158
}
168159

169160
if dev == nil {
170-
logger.Errorf("Could not obtain specified device")
171-
return
161+
return errors.New("could not obtain specified device")
172162
}
173163
defer dev.Clean()
174164
logger.Infof("Using device %s (%s)", dev.Name(), dev.ID())
@@ -178,8 +168,7 @@ var rootCmd = &cobra.Command{
178168
if pid == -1 && procName != "" {
179169
processes, err := dev.EnumerateProcesses(frida.ScopeMinimal)
180170
if err != nil {
181-
logger.Errorf("Error enumerating processes: %v", err)
182-
return
171+
return err
183172
}
184173

185174
for _, proc := range processes {
@@ -192,22 +181,19 @@ var rootCmd = &cobra.Command{
192181

193182
file, err := cmd.Flags().GetString("file")
194183
if err != nil {
195-
logger.Errorf("%v", err)
196-
return
184+
return err
197185
}
198186

199187
if procPid == -1 && file == "" {
200-
logger.Errorf("You need to pass pid, name or file to spawn")
201-
return
188+
return errors.New("missing pid, name or file to spawn")
202189
}
203190

204191
spawned := false
205192

206193
if procPid != -1 {
207194
session, err = dev.Attach(procPid, nil)
208195
if err != nil {
209-
logger.Errorf("Error attaching: %v", err)
210-
return
196+
return err
211197
}
212198
} else {
213199
opts := frida.NewSpawnOptions()
@@ -219,14 +205,12 @@ var rootCmd = &cobra.Command{
219205
opts.SetArgv(argv)
220206
spawnedPID, err := dev.Spawn(file, opts)
221207
if err != nil {
222-
logger.Errorf("Error spawning %s: %v", file, err)
223-
return
208+
return err
224209
}
225210
procPid = spawnedPID
226211
session, err = dev.Attach(spawnedPID, nil)
227212
if err != nil {
228-
logger.Errorf("Error attaching: %v", err)
229-
return
213+
return err
230214
}
231215
spawned = true
232216
}
@@ -246,33 +230,28 @@ var rootCmd = &cobra.Command{
246230

247231
script, err := session.CreateScript(scContent)
248232
if err != nil {
249-
logger.Errorf("Error creating script: %v", err)
250-
return
233+
return err
251234
}
252235
defer script.Clean()
253236

254237
blacklist, err := cmd.Flags().GetStringSlice("blacklist")
255238
if err != nil {
256-
logger.Errorf("%v", err)
257-
return
239+
return err
258240
}
259241

260242
whitelist, err := cmd.Flags().GetStringSlice("whitelist")
261243
if err != nil {
262-
logger.Errorf("%v", err)
263-
return
244+
return err
264245
}
265246

266247
blacklistp, err := cmd.Flags().GetStringSlice("blacklistp")
267248
if err != nil {
268-
logger.Errorf("%v", err)
269-
return
249+
return err
270250
}
271251

272252
whitelistp, err := cmd.Flags().GetStringSlice("whitelist")
273253
if err != nil {
274-
logger.Errorf("%v", err)
275-
return
254+
return err
276255
}
277256

278257
script.On("message", func(message string) {
@@ -307,31 +286,47 @@ var rootCmd = &cobra.Command{
307286
script.Post(msg, nil)
308287

309288
default:
310-
logger.Warnf("SCRIPT: %v", msg)
289+
logger.Warnf("SCRIPT: %v", subPayload)
311290
}
312291

313292
case frida.MessageTypeLog:
314-
logger.Infof("SCRIPT: %v", msg)
293+
logger.Infof("SCRIPT: %v", msg.Payload.(string))
315294
default:
316295
logger.Errorf("SCRIPT: %v", msg)
317296
}
318297
})
319298

320299
if err := script.Load(); err != nil {
321-
logger.Errorf("Error loading script: %v", err)
322-
return
300+
return err
323301
}
324302
logger.Infof("Loaded script to the process")
325303

326304
if spawned {
327305
if err := dev.Resume(procPid); err != nil {
328-
logger.Errorf("Error resuming: %v", err)
329-
return
306+
return err
330307
} else {
331308
logger.Infof("Resumed process")
332309
}
333310
}
334311

312+
if config == "" {
313+
homeDir, _ := os.UserHomeDir()
314+
config = filepath.Join(homeDir, "gxpc.conf")
315+
}
316+
317+
var offsets OffsetsData
318+
f, err := os.Open(config)
319+
if err != nil {
320+
return err
321+
}
322+
defer f.Close()
323+
324+
if err := json.NewDecoder(f).Decode(&offsets); err != nil {
325+
return err
326+
}
327+
328+
_ = script.ExportsCall("setup", offsets)
329+
335330
c := make(chan os.Signal)
336331
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
337332

@@ -340,13 +335,13 @@ var rootCmd = &cobra.Command{
340335
fmt.Println()
341336
logger.Infof("Exiting...")
342337
if err := script.Unload(); err != nil {
343-
logger.Errorf("Error unloading script: %v", err)
344-
return
338+
return err
345339
}
346340
logger.Infof("Script unloaded")
347341
case <-detached:
348342
logger.Infof("Exiting...")
349343
}
344+
return nil
350345
},
351346
}
352347

@@ -391,7 +386,7 @@ func listToRegex(ls []string) []*regexp.Regexp {
391386
return rex
392387
}
393388

394-
func main() {
389+
func setupFlags() {
395390
rootCmd.Flags().StringP("id", "i", "", "connect to device with ID")
396391
rootCmd.Flags().StringP("remote", "r", "", "connect to device at IP address")
397392
rootCmd.Flags().StringP("name", "n", "", "process name")
@@ -411,6 +406,14 @@ func main() {
411406
//rootCmd.Flags().BoolP("hex", "x", false, "print hexdump of raw data")
412407

413408
rootCmd.Flags().IntP("pid", "p", -1, "PID of wanted process")
409+
}
410+
411+
func main() {
412+
setupFlags()
413+
logger = NewLogger()
414+
defer logger.Close()
414415

415-
rootCmd.Execute()
416+
if err := rootCmd.Execute(); err != nil {
417+
logger.Errorf("Error ocurred: %v", err)
418+
}
416419
}

offsets.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ type BuildData struct {
66
}
77

88
type Offset struct {
9-
OS string `json:"os"`
10-
Builds map[string]BuildData `json:"builds"`
9+
OS string `json:"os"`
10+
Builds []map[string]BuildData `json:"builds"`
1111
}
1212

1313
type OffsetsData struct {

0 commit comments

Comments
 (0)