fkie-cad / dewolf

A research decompiler implemented as a Binary Ninja plugin.
GNU Lesser General Public License v2.1
172 stars 9 forks source link

[Array Access Detection] Array access not detected properly #399

Open fnhartmann opened 6 months ago

fnhartmann commented 6 months ago

Proposal

See the following example: example.zip

Dewolf is currently creating the following code:

int main(int argc, char ** argv, char ** envp) {
    unsigned long var_1;
    long i;
    long var_0;
    __builtin_strcpy(/* dest */ &var_0, /* src */ "This is an example.");
    var_1 = strlen(&var_0);
    for (i = 0L; i < var_1; i++) {
        if ((int)*(&var_0 + i) != 32) {
            *(&var_0 + i) = *(&var_0 + i) ^ ' ';
        }
        printf(/* format */ "%c", (unsigned int)(int)*(&var_0 + i));
    }
    return 0;
}

(The ouput is generated with deactivated CSE. See #398 for more information.)

It seems like the Array Access Detection is not detecting the array here. Dewolf should recognize this and provide code that looks more like the source code in terms of array access, like the following:

        for (size_t i = 0; i < length; i++) {
                if (str[i] != 0x20)
                        str[i] = str[i] ^ 0x20;
                printf("%c", str[i]);
        }

Used Binary Ninja version: 3.5.4526

Approach

Analyze and debug why Array Access Detection is not working properly here. Adjust the stage depending on the result.