Skip to content

Commit

Permalink
feat: handle config automatically
Browse files Browse the repository at this point in the history
  • Loading branch information
NSEcho committed Feb 26, 2025
1 parent c025599 commit 438ef44
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 73 deletions.
97 changes: 35 additions & 62 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,57 +31,14 @@ var rootCmd = &cobra.Command{
SilenceErrors: true,
SilenceUsage: true,
RunE: func(cmd *cobra.Command, args []string) error {

initConfig, err := cmd.Flags().GetBool("init")
if err != nil {
return err
}

config, err := cmd.Flags().GetString("config")
if err != nil {
return err
}

if config == "" {
homeDir, _ := os.UserHomeDir()
config = filepath.Join(homeDir, "gxpc.conf")
}

if initConfig {
configData := OffsetsData{
Offsets: []Offset{
{
OS: "iPhone14,7",
Builds: []map[string]BuildData{
{
"20B110": {PlistCreate: "0xb1c00", CallHandler: "0x11c00"},
},
},
},
{
OS: "iPad7,11",
Builds: []map[string]BuildData{
{"22B83": {PlistCreate: "0x7dbf4", CallHandler: "0xf98c"}},
},
},
},
}

f, err := os.Create(config)
if err != nil {
return err
}
defer f.Close()

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

if err := encoder.Encode(configData); err != nil {
return err
}

logger.Infof("Created new config at %s", config)
return nil
home, _ := os.UserHomeDir()
config = filepath.Join(home, "gxpc.conf")
}

list, err := cmd.Flags().GetBool("list")
Expand Down Expand Up @@ -254,6 +211,8 @@ var rootCmd = &cobra.Command{
return err
}

var offsets *OffsetsData = nil

script.On("message", func(message string) {
msg, _ := frida.ScriptMessageToMessage(message)
switch msg.Type {
Expand Down Expand Up @@ -285,6 +244,24 @@ var rootCmd = &cobra.Command{
msg := fmt.Sprintf(`{"type":"jlutil","payload":"%s"}`, resPayload)
script.Post(msg, nil)

case "newOffset":
var newOffset NewOffset
for k, v := range payload {
val := v.(string)
switch k {
case "callEvent":
newOffset.CallEvent = val
case "plistCreate":
newOffset.PlistCreate = val
case "machine":
newOffset.Machine = val
case "version":
newOffset.Version = val
}
}
updateConfig(config, &newOffset)
logger.Infof("Saved offset for %s (%s)", newOffset.Machine, newOffset.Version)

default:
logger.Warnf("SCRIPT: %v", subPayload)
}
Expand All @@ -309,24 +286,21 @@ var rootCmd = &cobra.Command{
}
}

if config == "" {
homeDir, _ := os.UserHomeDir()
config = filepath.Join(homeDir, "gxpc.conf")
}

var offsets OffsetsData
f, err := os.Open(config)
if err != nil {
return err
}
defer f.Close()

if err := json.NewDecoder(f).Decode(&offsets); err != nil {
return err
if _, err := os.Stat(config); os.IsNotExist(err) {
_ = script.ExportsCall("setup", nil)
} else {
f, err := os.Open(config)
if err != nil {
return err
}
defer f.Close()
offsets = &OffsetsData{}
if err := json.NewDecoder(f).Decode(offsets); err != nil {
return err
}
_ = script.ExportsCall("setup", offsets)
}

_ = script.ExportsCall("setup", offsets)

c := make(chan os.Signal)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)

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

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

rootCmd.Flags().StringSliceP("whitelist", "w", []string{}, "whitelist connection by name")
rootCmd.Flags().StringSliceP("blacklist", "b", []string{}, "blacklist connection by name")
Expand Down
71 changes: 71 additions & 0 deletions offsets.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
package main

import (
"encoding/json"
"io"
"os"
)

type BuildData struct {
PlistCreate string `json:"PlistCreate"`
CallHandler string `json:"CallHandler"`
Expand All @@ -13,3 +19,68 @@ type Offset struct {
type OffsetsData struct {
Offsets []Offset `json:"offsets"`
}

type NewOffset struct {
Machine string `json:"machine"`
Version string `json:"version"`
CallEvent string `json:"callEvent"`
PlistCreate string `json:"plistCreate"`
}

func updateConfig(configPath string, off *NewOffset) error {
// there is no config file yet created, create one and append data to it
if _, err := os.Stat(configPath); os.IsNotExist(err) {
f, err := os.Create(configPath)
if err != nil {
return err
}
defer f.Close()
configData := OffsetsData{
Offsets: []Offset{
{
OS: off.Machine,
Builds: []map[string]BuildData{
{
off.Version: {
PlistCreate: off.PlistCreate,
CallHandler: off.CallEvent,
},
},
},
},
},
}
enc := json.NewEncoder(f)
enc.SetIndent("", " ")
return enc.Encode(configData)
} else {
var configData OffsetsData
f, err := os.OpenFile(configPath, os.O_RDWR, 644)
if err != nil {
return err
}
defer f.Close()
if err := json.NewDecoder(f).Decode(&configData); err != nil {
return err
}

// TODO: we need to implement a check for different builds for the same platform
configData.Offsets = append(configData.Offsets, Offset{
OS: off.Machine,
Builds: []map[string]BuildData{
{
off.Version: {
PlistCreate: off.PlistCreate,
CallHandler: off.CallEvent,
},
},
},
})

f.Truncate(0)
f.Seek(0, io.SeekStart)
enc := json.NewEncoder(f)
enc.SetIndent("", " ")
return enc.Encode(configData)
}
}
31 changes: 20 additions & 11 deletions script.js
Original file line number Diff line number Diff line change
Expand Up @@ -451,16 +451,18 @@ rpc.exports = {

var found = false;

for (var i = 0; i < offsets.offsets.length; i++) {
var os = offsets.offsets[i].os;
if (os == machine) {
for (var j = 0; j < offsets.offsets[i].builds.length; j++) {
var build = offsets.offsets[i].builds[j];
if (build == osversion) {
__CFBinaryPlistCreate15 = Module.getBaseAddress('CoreFoundation').add(Number(build.PlistCreate));
_xpc_connection_call_event_handler = Module.getBaseAddress('libxpc.dylib').add(Number(build.CallHandler));
found = true;
break;
if (offsets != null) {
for (var i = 0; i < offsets.offsets.length; i++) {
var os = offsets.offsets[i].os;
if (os == machine) {
for (var j = 0; j < offsets.offsets[i].builds.length; j++) {
var build = offsets.offsets[i].builds[j];
if (build == osversion) {
__CFBinaryPlistCreate15 = Module.getBaseAddress('CoreFoundation').add(Number(build.PlistCreate));
_xpc_connection_call_event_handler = Module.getBaseAddress('libxpc.dylib').add(Number(build.CallHandler));
found = true;
break;
}
}
}
}
Expand All @@ -469,8 +471,15 @@ rpc.exports = {
if (!found) {
__CFBinaryPlistCreate15 = DebugSymbol.fromName('__CFBinaryPlistCreate15').address;
_xpc_connection_call_event_handler = DebugSymbol.fromName("_xpc_connection_call_event_handler").address;

send(JSON.stringify({
"type": "newOffset",
"machine": machine,
"version": osversion,
"plistCreate": ptr(__CFBinaryPlistCreate15 - Module.getBaseAddress('CoreFoundation')),
"callEvent": ptr(_xpc_connection_call_event_handler - Module.getBaseAddress('libxpc.dylib'))
}));
}
console.log(`Running on an ${machine}, system version ${osversion}`);

return null;
},
Expand Down

0 comments on commit 438ef44

Please sign in to comment.