From cc9eabe42547b9a9640fcbf9f365f51ccc0037bf Mon Sep 17 00:00:00 2001 From: rhunk <101876869+rhunk@users.noreply.github.com> Date: Sun, 17 Sep 2023 19:40:31 +0200 Subject: [PATCH] initial commit --- SCRIPTING.md | 140 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 SCRIPTING.md diff --git a/SCRIPTING.md b/SCRIPTING.md new file mode 100644 index 0000000..6ceb59d --- /dev/null +++ b/SCRIPTING.md @@ -0,0 +1,140 @@ +## Script header + +``` +// ==SE_module== +// name: Your module name +// description: Your module description +// version: 1.0 +// author: You +// ==/SE_module== +``` + +## Logger +- **logInfo**(*messages*: StringArray) + + +## Execution sides + +```js +module.onManagerLoad = () => { + // run code when manager context is started +} + +module.onSnapActivity = () => { + // run code when the main snapchat activity is created +} + +``` + +## IPC +#### Pass event through any execution side + +```js +module.onManagerLoad = () => { + // declare event in manager side + ipc.on("hello", args => { + logInfo("Got event from snapchat app! arguments: ", args) + }) +} + +module.onSnapActivity = () => { + // send event to the manager from the snapchat app + ipc.emit("hello", 1337) +} + +``` + +#### Pass events between other installed scripts + +- *script1.js* + +```js +module.onManagerLoad = () => { + ipc.onBroadcast("mychannel", "eventA", (args) => { + logInfo("eventA called from script1.js => " + args) + }) +} +``` + +- *script2.js* +```js +module.onManagerLoad = () => { + ipc.onBroadcast("mychannel", "eventA", (args) => { + logInfo("eventA called from script2.js => " + args) + ipc.broadcast("mychannel", "eventC", "hello") + }) +} +``` + +- *script3.js* + +```js +module.onSnapActivity = () => { + ipc.onBroadcast("mychannel", "eventC", (args) => { + logInfo("eventC called from script3.js => " + args) + }) + // channel, eventName, data + ipc.broadcast("mychannel", "eventA", "hi") +} +``` + +result (android logcat) + +``` +eventA called from script1.js => hi +eventA called from script2.js => hi +eventC called from script3.js => hello +``` + +## Hooks + +### types +- enum HookStage is a string value of "before" or "after" + +- class HookCallback : + - properties + - getter/setter result: Object + - getter thisObject: Object + - getter method: JavaMember + - getter args: ObjectArray + - functions + - cancel() + - arg(index: Integer) + - setArg(index: Integer, value: Object) + - invokeOriginal() + - invokeOriginal(args: ObjectArray) + +- function HookUnhook unhooks hooked members + +### public interface +- Find members + - findMethod (class: JavaClass, methodName: String) => Member + - findMethod (className: String, methodName: String) => Member + - findMethodWithParameters (class: JavaClass, methodName: String, types: StringArray) => Member + - findMethodWithParameters (className: String, methodName: String, types: StringArray) => Member + - findConstructor (class: JavaClass, types: StringArray) => Member + - findConstructor (className: String, types: StringArray) => Member + +- Hook members + - hook (member: JavaMember, stage: HookStage, callback: HookCallback) => HookUnhook + - hookAllMethods (class: JavaClass, methodName: String, stage: HookStage, callback: HookCallback) => HookUnhook + - hookAllMethods (className: String, methodName: String, stage: HookStage, callback: HookCallback) => HookUnhook + - hookAllConstructors (class: JavaClass, stage: HookStage, callback: HookCallback) => HookUnhook + - hookAllConstructors (className: String, stage: HookStage, callback: HookCallback) => HookUnhook + +### Example +```js +module.onSnapActivity = () => { + hooker.hookAllConstructors("com.snapchat.client.messaging.Message", "before", callback => { + logInfo("Message constructor " + callback.thisObject) + }) + + hooker.hook( + hooker.findMethod("com.snapchat.client.network_api.NetworkApi$CppProxy", "submit"), + "before", + (callback) => { + logInfo("NetworkApi submit " + callback.arg(0)) + } + ) +} +```