I am working with a 1995 Windows 32-bit binary compiled with Watcom, which uses the Watcom calling convention. I am trying to replace a simple string length calculation function in the binary using Frida. The decompiled version of the function is:
uint calculate_string_length(char *input_string)
{
char *current_ptr;
char current_char;
char *next_ptr;
current_ptr = input_string;
do {
next_ptr = current_ptr + 1;
current_char = *current_ptr;
current_ptr = next_ptr;
} while (current_char != '\0');
return (uint)(next_ptr + (-1 - (int)input_string));
}
And the assembly code is:
00452420 53 PUSH EBX
00452421 56 PUSH ESI
00452422 8b f0 MOV ESI,input_string_EAX
00452424 8b de MOV EBX,ESI
LAB_00452426 XREF[1]: 00452429(j)
00452426 ac LODSB current_ptr
00452427 0a c0 OR input_string_EAX,input_string_EAX
00452429 75 fb JNZ LAB_00452426
0045242b 8b c6 MOV input_string_EAX,current_ptr
0045242d 2b c3 SUB input_string_EAX,EBX
0045242f 48 DEC input_string_EAX
00452430 5e POP current_ptr
00452431 5b POP EBX
00452432 c3 RET
I used Frida's Interceptor.attach
to log the function inputs and outputs successfully. I then wrote my own JavaScript implementation using Frida's NativeCallback:
var newImplementation = new NativeCallback(function () {
console.log("######################################")
const input_string = ptr(this.context.eax);
const str1 = Memory.readCString(input_string);
console.log("calculate_string_length In:", str1)
const length = str1.length;
console.log("calculated length: ", length)
return length
}, 'uint32', []);
Interceptor.replace(ptr("0x00452420"), newImplementation);
However, after processing a specific input string, the program crashes. I have checked the address where it crashes, and it's in another function that calls the replaced function. I have already replaced around 10 functions in this binary without any issues, and this is the first function causing problems.
I also tried to change the calling convention to stdcall
as it's more similar to Watcom's calling convention and that helped a bit. The program was able to run further but it eventually crashes again.
I also asked the question at: https://github.com/frida/frida/issues/2502