New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix tracer return value parse error #483
base: master
Are you sure you want to change the base?
Conversation
Thanks, I'm fine with that. But perhaps it would be more meaningful if we reported it, even a simple message is fine something like:
Bonus points if you make it red! What do you think? |
I haven’t seen something similar here, how would you implement a value check??
|
Correct impl is const result = returnValue == undefined ? "" :
returnValue instanceof NativePointer ?
returnValue.equals(NULL)
? " = \x1b[0m\x1b[38;5;9mnull [native IL2CPP excpetion occurred]\x1b[0m"
: ` = \x1b[36m${fromFridaValue(returnValue, method.returnType)}\x1b[0m`
: ` = \x1b[36m${fromFridaValue(returnValue, method.returnType)}\x1b[0m`; now tracer works (in prev piece of code it died when |
Hmm, this is how I would do it: let returnValue;
let isError = false;
try {
returnValue = method.nativeFunction(...args);
} catch (_) {
isError = true;
}
if ((this as InvocationContext).threadId == threadId) {
// prettier-ignore
state.buffer.push(`\x1b[2m0x${paddedVirtualAddress}\x1b[0m ${`│ `.repeat(--state.depth)}└─\x1b[33m${method.class.type.name}::\x1b[1m${method.name}\x1b[0m\x1b[0m${returnValue == undefined ? "" : ` = \x1b[36m${fromFridaValue(returnValue, method.returnType)}`}\x1b[0m${isError ? " \x1b[38;5;9m[native IL2CPP excpetion occurred]\x1b[0m" : ""}`);
state.flush();
}
return isError ? NULL : returnValue; However, I'm wondering what happens in case Frida expect us to return a |
Il2Cpp compiled code already have checks for |
Actually we can shift responsibility to the app (it will handle NULL), what do think about this? |
By the way, there's a typo here, it should be |
I found method which already throws error (but target still works)
after commit:
For other types it should work |
Note: Backend.method("HandleResponse").implementation = function (req) {
this.method<void>("HandleResponse").invoke(req);
// let's imagine that an exception was caught (abort was called), we returning null
console.log("test: return NULL for System.Void HandleResponse(HttpRequest request);");
console.log(`isPrimitive for original ret (void): ${this.method<void>("HandleResponse").returnType.isPrimitive}`)
return NULL;
} output:
|
const cm = ((globalThis as any).cm = new CModule(`int lol(void) { return 1; }`));
Interceptor.replace(cm.lol, new NativeCallback(() => NULL as any, "int", []));
console.log(new NativeFunction(cm.lol, "int", [])()); I get |
Look, i pushed one more commit which does |
ping |
one more ping |
huh |
Sorry for bothering. looks like you are familiar with this module. would you mind help my question in issue? |
When a method definition does not include an null value (example:
MyClass getMyClass();
) but something went wrong (or null check was stripped by il2cpp compiler) it can returnNULL
soError: abort was called
will be thrown (I think becauseNativeFunction
expectedpointer
return type but got null)One more note, "real" IL2CPP code checks if the value is null (at least ghidra decompiler shows that), so nothing bad should happen
Before:
After: