Skip to content

Commit 438ef44

Browse files
committed
feat: handle config automatically
1 parent c025599 commit 438ef44

File tree

3 files changed

+126
-73
lines changed

3 files changed

+126
-73
lines changed

main.go

Lines changed: 35 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -31,57 +31,14 @@ var rootCmd = &cobra.Command{
3131
SilenceErrors: true,
3232
SilenceUsage: true,
3333
RunE: func(cmd *cobra.Command, args []string) error {
34-
35-
initConfig, err := cmd.Flags().GetBool("init")
36-
if err != nil {
37-
return err
38-
}
39-
4034
config, err := cmd.Flags().GetString("config")
4135
if err != nil {
4236
return err
4337
}
4438

4539
if config == "" {
46-
homeDir, _ := os.UserHomeDir()
47-
config = filepath.Join(homeDir, "gxpc.conf")
48-
}
49-
50-
if initConfig {
51-
configData := OffsetsData{
52-
Offsets: []Offset{
53-
{
54-
OS: "iPhone14,7",
55-
Builds: []map[string]BuildData{
56-
{
57-
"20B110": {PlistCreate: "0xb1c00", CallHandler: "0x11c00"},
58-
},
59-
},
60-
},
61-
{
62-
OS: "iPad7,11",
63-
Builds: []map[string]BuildData{
64-
{"22B83": {PlistCreate: "0x7dbf4", CallHandler: "0xf98c"}},
65-
},
66-
},
67-
},
68-
}
69-
70-
f, err := os.Create(config)
71-
if err != nil {
72-
return err
73-
}
74-
defer f.Close()
75-
76-
encoder := json.NewEncoder(f)
77-
encoder.SetIndent(" ", " ")
78-
79-
if err := encoder.Encode(configData); err != nil {
80-
return err
81-
}
82-
83-
logger.Infof("Created new config at %s", config)
84-
return nil
40+
home, _ := os.UserHomeDir()
41+
config = filepath.Join(home, "gxpc.conf")
8542
}
8643

8744
list, err := cmd.Flags().GetBool("list")
@@ -254,6 +211,8 @@ var rootCmd = &cobra.Command{
254211
return err
255212
}
256213

214+
var offsets *OffsetsData = nil
215+
257216
script.On("message", func(message string) {
258217
msg, _ := frida.ScriptMessageToMessage(message)
259218
switch msg.Type {
@@ -285,6 +244,24 @@ var rootCmd = &cobra.Command{
285244
msg := fmt.Sprintf(`{"type":"jlutil","payload":"%s"}`, resPayload)
286245
script.Post(msg, nil)
287246

247+
case "newOffset":
248+
var newOffset NewOffset
249+
for k, v := range payload {
250+
val := v.(string)
251+
switch k {
252+
case "callEvent":
253+
newOffset.CallEvent = val
254+
case "plistCreate":
255+
newOffset.PlistCreate = val
256+
case "machine":
257+
newOffset.Machine = val
258+
case "version":
259+
newOffset.Version = val
260+
}
261+
}
262+
updateConfig(config, &newOffset)
263+
logger.Infof("Saved offset for %s (%s)", newOffset.Machine, newOffset.Version)
264+
288265
default:
289266
logger.Warnf("SCRIPT: %v", subPayload)
290267
}
@@ -309,24 +286,21 @@ var rootCmd = &cobra.Command{
309286
}
310287
}
311288

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
289+
if _, err := os.Stat(config); os.IsNotExist(err) {
290+
_ = script.ExportsCall("setup", nil)
291+
} else {
292+
f, err := os.Open(config)
293+
if err != nil {
294+
return err
295+
}
296+
defer f.Close()
297+
offsets = &OffsetsData{}
298+
if err := json.NewDecoder(f).Decode(offsets); err != nil {
299+
return err
300+
}
301+
_ = script.ExportsCall("setup", offsets)
326302
}
327303

328-
_ = script.ExportsCall("setup", offsets)
329-
330304
c := make(chan os.Signal)
331305
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
332306

@@ -394,7 +368,6 @@ func setupFlags() {
394368
rootCmd.Flags().StringP("output", "o", "", "save output to this file")
395369

396370
rootCmd.Flags().StringP("config", "c", "", "path to gxpc.conf file; default user home directory")
397-
rootCmd.Flags().BoolP("init", "", false, "create gxpc.conf file with offsets")
398371

399372
rootCmd.Flags().StringSliceP("whitelist", "w", []string{}, "whitelist connection by name")
400373
rootCmd.Flags().StringSliceP("blacklist", "b", []string{}, "blacklist connection by name")

offsets.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
package main
22

3+
import (
4+
"encoding/json"
5+
"io"
6+
"os"
7+
)
8+
39
type BuildData struct {
410
PlistCreate string `json:"PlistCreate"`
511
CallHandler string `json:"CallHandler"`
@@ -13,3 +19,68 @@ type Offset struct {
1319
type OffsetsData struct {
1420
Offsets []Offset `json:"offsets"`
1521
}
22+
23+
type NewOffset struct {
24+
Machine string `json:"machine"`
25+
Version string `json:"version"`
26+
CallEvent string `json:"callEvent"`
27+
PlistCreate string `json:"plistCreate"`
28+
}
29+
30+
func updateConfig(configPath string, off *NewOffset) error {
31+
// there is no config file yet created, create one and append data to it
32+
if _, err := os.Stat(configPath); os.IsNotExist(err) {
33+
f, err := os.Create(configPath)
34+
if err != nil {
35+
return err
36+
}
37+
defer f.Close()
38+
configData := OffsetsData{
39+
Offsets: []Offset{
40+
{
41+
OS: off.Machine,
42+
Builds: []map[string]BuildData{
43+
{
44+
off.Version: {
45+
PlistCreate: off.PlistCreate,
46+
CallHandler: off.CallEvent,
47+
},
48+
},
49+
},
50+
},
51+
},
52+
}
53+
enc := json.NewEncoder(f)
54+
enc.SetIndent("", " ")
55+
return enc.Encode(configData)
56+
} else {
57+
var configData OffsetsData
58+
f, err := os.OpenFile(configPath, os.O_RDWR, 644)
59+
if err != nil {
60+
return err
61+
}
62+
defer f.Close()
63+
if err := json.NewDecoder(f).Decode(&configData); err != nil {
64+
return err
65+
}
66+
67+
// TODO: we need to implement a check for different builds for the same platform
68+
configData.Offsets = append(configData.Offsets, Offset{
69+
OS: off.Machine,
70+
Builds: []map[string]BuildData{
71+
{
72+
off.Version: {
73+
PlistCreate: off.PlistCreate,
74+
CallHandler: off.CallEvent,
75+
},
76+
},
77+
},
78+
})
79+
80+
f.Truncate(0)
81+
f.Seek(0, io.SeekStart)
82+
enc := json.NewEncoder(f)
83+
enc.SetIndent("", " ")
84+
return enc.Encode(configData)
85+
}
86+
}

script.js

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -451,16 +451,18 @@ rpc.exports = {
451451

452452
var found = false;
453453

454-
for (var i = 0; i < offsets.offsets.length; i++) {
455-
var os = offsets.offsets[i].os;
456-
if (os == machine) {
457-
for (var j = 0; j < offsets.offsets[i].builds.length; j++) {
458-
var build = offsets.offsets[i].builds[j];
459-
if (build == osversion) {
460-
__CFBinaryPlistCreate15 = Module.getBaseAddress('CoreFoundation').add(Number(build.PlistCreate));
461-
_xpc_connection_call_event_handler = Module.getBaseAddress('libxpc.dylib').add(Number(build.CallHandler));
462-
found = true;
463-
break;
454+
if (offsets != null) {
455+
for (var i = 0; i < offsets.offsets.length; i++) {
456+
var os = offsets.offsets[i].os;
457+
if (os == machine) {
458+
for (var j = 0; j < offsets.offsets[i].builds.length; j++) {
459+
var build = offsets.offsets[i].builds[j];
460+
if (build == osversion) {
461+
__CFBinaryPlistCreate15 = Module.getBaseAddress('CoreFoundation').add(Number(build.PlistCreate));
462+
_xpc_connection_call_event_handler = Module.getBaseAddress('libxpc.dylib').add(Number(build.CallHandler));
463+
found = true;
464+
break;
465+
}
464466
}
465467
}
466468
}
@@ -469,8 +471,15 @@ rpc.exports = {
469471
if (!found) {
470472
__CFBinaryPlistCreate15 = DebugSymbol.fromName('__CFBinaryPlistCreate15').address;
471473
_xpc_connection_call_event_handler = DebugSymbol.fromName("_xpc_connection_call_event_handler").address;
474+
475+
send(JSON.stringify({
476+
"type": "newOffset",
477+
"machine": machine,
478+
"version": osversion,
479+
"plistCreate": ptr(__CFBinaryPlistCreate15 - Module.getBaseAddress('CoreFoundation')),
480+
"callEvent": ptr(_xpc_connection_call_event_handler - Module.getBaseAddress('libxpc.dylib'))
481+
}));
472482
}
473-
console.log(`Running on an ${machine}, system version ${osversion}`);
474483

475484
return null;
476485
},

0 commit comments

Comments
 (0)