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
2223var Version string
2324
25+ var logger * Logger = nil
26+
2427var 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}
0 commit comments