Met uitvoerbare bestanden van Microsoft Visual C ++ kom ik vaak decompilaties als deze tegen:
void __cdecl Pbdf :: ReadString (char * dst, Pbdf * pbdfOrLength) {Pbdf * pbdf; // esi pbdf = pbdfOrLength; Pbdf :: ReadBytes (&pbdfOrLength, 1, pbdfOrLength); Pbdf :: ReadBytes (dst, (unsigned __int8) pbdfOrLength, pbdf); dst [(unsigned __int8) pbdfOrLength] = 0;}
De functie lijkt eigenlijk meer op dit (zoals te zien is in een Watcom-uitvoerbaar bestand dat hetzelfde doet):
void __usercall Pbdf :: ReadString (char * dst @ <eax>, Pbdf * pbdf @ <edx>) {unsigned __int8 length; // [esp + 0h] [ebp-14h] Pbdf :: ReadBytes (pbdf, &length, 1u); Pbdf :: ReadBytes (pbdf, dst, lengte); * ((_ BYTE *) dst + length) = 0;}
Dus vanuit een Pbdf-bestandsachtige structuur leest het een enkele byte die het aantal volgende bytes bepaalt dat moet worden ingelezen in een buffer en beëindigt die buffer met een 0.
In de MSVC-decompilatie kun je echter zien dat het de lengte en de Pbdf-structuur heeft samengevoegd tot één variabele, waardoor ik de variabele "pbdfOrLength" noem.
Is het op de een of andere manier mogelijk om de decompiler te vertellen om deze variabelen te "splitsen" / ze als twee aparte te behandelen, om een output te krijgen die lijkt op wat er in Watcom wordt gezien?