Vraag:
Variabele splitsen in Hexrays decompiler?
Ray
2018-05-05 15:10:42 UTC
view on stackexchange narkive permalink

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?

Twee antwoorden:
mayahustle
2018-05-09 00:10:12 UTC
view on stackexchange narkive permalink

Ik denk niet dat er een manier is om een ​​nieuwe functievariabele toe te voegen, aangezien de decompiler deze maakt op basis van registers en stapellocaties.

Echter, in situaties waar het echt vervelend is, maakt het creëren van een vakbondstype in de Structuurviewer kan nuttig zijn.

Union Definition

Stel vervolgens in je decompiler het type van de variabele in op het union-type (Y is de sneltoets). variable type declaration

Bij de demontage kunt u, afhankelijk van het gebruik van de variabele, "Alt-Y" gebruiken om het juiste vakbondsveld te selecteren. (het is ook toegankelijk via het rechtsklikmenu) Union field select

Goed idee. Het zou de weergave van de variabele in de tweede regel niet kunnen repareren, waar de operator addressof wordt gebruikt voor de samengevoegde variabele (geeft nog steeds alleen `& pbdfOrLength` weer zonder toegang voor leden), maar ik denk dat dit de best mogelijke oplossing is.
Jammer. Ik wist niet dat het zo zou werken voor de adresbeheerder. Waardeer de info.
Anton Kukoba
2018-05-07 19:57:36 UTC
view on stackexchange narkive permalink

Ik denk niet dat zo'n functie in de IDA-interface zit, maar er is een API in IDA SDK waarmee je registervariabelen kunt maken: https://www.hex-rays.com/products/ida/ support / sdkdoc / group__regvar.html # ga5f77d2c231f8faeb5939be2bc8e2a298

Dat creëert geen nieuwe decompilervariabele. Dat is voor het hernoemen van een variabele in de demontage (plaats uw cursor op een register en druk op "N").


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 4.0-licentie waaronder het wordt gedistribueerd.
Loading...