Skip to content

Commit 9eda646

Browse files
committed
feat: hook proceeded without js
1 parent 82f1d3f commit 9eda646

1 file changed

Lines changed: 201 additions & 20 deletions

File tree

electron/main.js

Lines changed: 201 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,33 @@ function createWindow() {
5454
newModule.addFunctionImport(postName, "hooks", postName, retType, retType);
5555
}
5656

57-
const funcNames = [];
57+
const funcNames = {};
5858

59+
let main = '';
60+
let malloc = '';
61+
62+
for (let i = 0; i < module.getNumExports(); i++) {
63+
const exp = Binaryen.getExportInfo(module.getExportByIndex(i));
64+
if (exp.name === "kg") {
65+
main = exp.value;
66+
}
67+
if (exp.name === "Of") {
68+
malloc = exp.value;
69+
}
70+
}
71+
72+
for (let i = 0; i < module.getNumFunctions(); i++) {
73+
const funcInfo = Binaryen.getFunctionInfo(module.getFunctionByIndex(i));
74+
const origName = funcInfo.name;
75+
76+
if (origName.includes("import")) {
77+
continue;
78+
}
79+
80+
funcNames[i] = origName;
81+
}
82+
83+
newModule.addGlobal("ayuMap", Binaryen.i32, true, newModule.i32.const(0));
5984
for (let i = 0; i < module.getNumFunctions(); i++) {
6085
const funcInfo = Binaryen.getFunctionInfo(module.getFunctionByIndex(i));
6186
const origName = funcInfo.name;
@@ -66,8 +91,6 @@ function createWindow() {
6691
continue;
6792
}
6893

69-
funcNames.push(origName);
70-
7194
addJSHooks(origName, paramTypes, retType);
7295

7396
const origFuncNewName = `_orig_${origName}`;
@@ -90,24 +113,182 @@ function createWindow() {
90113
defaultValue = newModule.f64.const(0);
91114
break;
92115
}
93-
const wrapperBody = newModule.block(null, retType === Binaryen.none ? [
94-
newModule.if(
95-
newModule.call(`pre_${origName}`, params, Binaryen.i32),
96-
newModule.call(origFuncNewName, params, retType)
97-
),
98-
newModule.call(`post_${origName}`, [], retType)
99-
] : [
100-
newModule.call(`post_${origName}`, [
116+
if (origName === main) {
117+
const wrapperBody = newModule.block(null, retType === Binaryen.none ? [
118+
newModule.global.set("ayuMap", newModule.call(malloc, [newModule.i32.const(Object.keys(funcNames).length)], Binaryen.i32)),
119+
newModule.if(
120+
newModule.i32.and(
121+
newModule.i32.load8_u(i, 0, newModule.global.get("ayuMap", Binaryen.i32)),
122+
newModule.i32.const(1)
123+
),
124+
newModule.if(
125+
newModule.call(`pre_${origName}`, params, Binaryen.i32),
126+
newModule.call(origFuncNewName, params, retType)
127+
),
128+
newModule.call(origFuncNewName, params, retType)
129+
),
130+
newModule.if(
131+
newModule.i32.and(
132+
newModule.i32.load8_u(i, 0, newModule.global.get("ayuMap", Binaryen.i32)),
133+
newModule.i32.const(2)
134+
),
135+
newModule.call(`post_${origName}`, [], retType),
136+
)
137+
] : [
138+
newModule.global.set("ayuMap", newModule.call(malloc, [newModule.i32.const(Object.keys(funcNames).length)], Binaryen.i32)),
139+
newModule.if(
140+
newModule.i32.and(
141+
newModule.i32.load8_u(i, 0, newModule.global.get("ayuMap", Binaryen.i32)),
142+
newModule.i32.const(2)
143+
),
144+
newModule.call(`post_${origName}`, [
145+
newModule.if(
146+
newModule.i32.and(
147+
newModule.i32.load8_u(i, 0, newModule.global.get("ayuMap", Binaryen.i32)),
148+
newModule.i32.const(1)
149+
),
150+
newModule.if(
151+
newModule.call(`pre_${origName}`, params, Binaryen.i32),
152+
newModule.call(origFuncNewName, params, retType),
153+
defaultValue
154+
),
155+
newModule.call(origFuncNewName, params, retType)
156+
),
157+
], retType),
158+
newModule.if(
159+
newModule.i32.and(
160+
newModule.i32.load8_u(i, 0, newModule.global.get("ayuMap", Binaryen.i32)),
161+
newModule.i32.const(1)
162+
),
163+
newModule.if(
164+
newModule.call(`pre_${origName}`, params, Binaryen.i32),
165+
newModule.call(origFuncNewName, params, retType),
166+
defaultValue
167+
),
168+
newModule.call(origFuncNewName, params, retType)
169+
)
170+
)
171+
], retType);
172+
173+
newModule.removeFunction(origName);
174+
newModule.addFunction(origName, funcInfo.params, funcInfo.results, funcInfo.vars, wrapperBody);
175+
} else {
176+
const wrapperBody = newModule.block(null, retType === Binaryen.none ? [
101177
newModule.if(
102-
newModule.call(`pre_${origName}`, params, Binaryen.i32),
103-
newModule.call(origFuncNewName, params, retType),
104-
defaultValue
105-
)], retType)
106-
], retType);
107-
108-
newModule.removeFunction(origName);
109-
newModule.addFunction(origName, funcInfo.params, funcInfo.results, funcInfo.vars, wrapperBody);
178+
newModule.i32.and(
179+
newModule.i32.load8_u(i, 0, newModule.global.get("ayuMap", Binaryen.i32)),
180+
newModule.i32.const(1)
181+
),
182+
newModule.if(
183+
newModule.call(`pre_${origName}`, params, Binaryen.i32),
184+
newModule.call(origFuncNewName, params, retType)
185+
),
186+
newModule.call(origFuncNewName, params, retType)
187+
),
188+
newModule.if(
189+
newModule.i32.and(
190+
newModule.i32.load8_u(i, 0, newModule.global.get("ayuMap", Binaryen.i32)),
191+
newModule.i32.const(2)
192+
),
193+
newModule.call(`post_${origName}`, [], retType),
194+
)
195+
] : [
196+
newModule.if(
197+
newModule.i32.and(
198+
newModule.i32.load8_u(i, 0, newModule.global.get("ayuMap", Binaryen.i32)),
199+
newModule.i32.const(2)
200+
),
201+
newModule.call(`post_${origName}`, [
202+
newModule.if(
203+
newModule.i32.and(
204+
newModule.i32.load8_u(i, 0, newModule.global.get("ayuMap", Binaryen.i32)),
205+
newModule.i32.const(1)
206+
),
207+
newModule.if(
208+
newModule.call(`pre_${origName}`, params, Binaryen.i32),
209+
newModule.call(origFuncNewName, params, retType),
210+
defaultValue
211+
),
212+
newModule.call(origFuncNewName, params, retType)
213+
),
214+
], retType),
215+
newModule.if(
216+
newModule.i32.and(
217+
newModule.i32.load8_u(i, 0, newModule.global.get("ayuMap", Binaryen.i32)),
218+
newModule.i32.const(1)
219+
),
220+
newModule.if(
221+
newModule.call(`pre_${origName}`, params, Binaryen.i32),
222+
newModule.call(origFuncNewName, params, retType),
223+
defaultValue
224+
),
225+
newModule.call(origFuncNewName, params, retType)
226+
)
227+
)
228+
], retType);
229+
230+
newModule.removeFunction(origName);
231+
newModule.addFunction(origName, funcInfo.params, funcInfo.results, funcInfo.vars, wrapperBody);
232+
}
110233
}
234+
235+
newModule.addFunction("registerHookPre", Binaryen.i32, Binaryen.none, [Binaryen.i32],
236+
newModule.block(null, [
237+
newModule.i32.store8(0, 0,
238+
newModule.i32.add(newModule.global.get("ayuMap", Binaryen.i32), newModule.local.get(0, Binaryen.i32)),
239+
newModule.i32.or(
240+
newModule.i32.load8_u(0, 0,
241+
newModule.i32.add(newModule.global.get("ayuMap", Binaryen.i32), newModule.local.get(0, Binaryen.i32))
242+
),
243+
newModule.i32.const(1)
244+
)
245+
)
246+
])
247+
);
248+
newModule.addFunctionExport("registerHookPre", "registerHookPre");
249+
newModule.addFunction("registerHookPost", Binaryen.i32, Binaryen.none, [Binaryen.i32],
250+
newModule.block(null, [
251+
newModule.i32.store8(0, 0,
252+
newModule.i32.add(newModule.global.get("ayuMap", Binaryen.i32), newModule.local.get(0, Binaryen.i32)),
253+
newModule.i32.or(
254+
newModule.i32.load8_u(0, 0,
255+
newModule.i32.add(newModule.global.get("ayuMap", Binaryen.i32), newModule.local.get(0, Binaryen.i32))
256+
),
257+
newModule.i32.const(2)
258+
)
259+
)
260+
])
261+
);
262+
newModule.addFunctionExport("registerHookPost", "registerHookPost");
263+
newModule.addFunction("unregisterHookPre", Binaryen.i32, Binaryen.none, [Binaryen.i32],
264+
newModule.block(null, [
265+
newModule.i32.store8(0, 0,
266+
newModule.i32.add(newModule.global.get("ayuMap", Binaryen.i32), newModule.local.get(0, Binaryen.i32)),
267+
newModule.i32.and(
268+
newModule.i32.load8_u(0, 0,
269+
newModule.i32.add(newModule.global.get("ayuMap", Binaryen.i32), newModule.local.get(0, Binaryen.i32))
270+
),
271+
newModule.i32.const(254)
272+
)
273+
)
274+
])
275+
);
276+
newModule.addFunctionExport("unregisterHookPre", "unregisterHookPre");
277+
newModule.addFunction("unregisterHookPost", Binaryen.i32, Binaryen.none, [Binaryen.i32],
278+
newModule.block(null, [
279+
newModule.i32.store8(0, 0,
280+
newModule.i32.add(newModule.global.get("ayuMap", Binaryen.i32), newModule.local.get(0, Binaryen.i32)),
281+
newModule.i32.and(
282+
newModule.i32.load8_u(0, 0,
283+
newModule.i32.add(newModule.global.get("ayuMap", Binaryen.i32), newModule.local.get(0, Binaryen.i32))
284+
),
285+
newModule.i32.const(253)
286+
)
287+
)
288+
])
289+
);
290+
newModule.addFunctionExport("unregisterHookPost", "unregisterHookPost");
291+
111292
win.webContents.executeJavaScript(`
112293
window.ayuHooks = window.ayuHooks || {};
113294
@@ -118,7 +299,7 @@ function createWindow() {
118299
119300
if (!imports.hooks) imports.hooks = {};
120301
121-
wasmFunctionNames.forEach(name => {
302+
Object.values(wasmFunctionNames).forEach(name => {
122303
const preName = 'pre_' + name;
123304
const postName = 'post_' + name;
124305

0 commit comments

Comments
 (0)