Vraag:
Waarom genereerde IDA Pro een "j_printf" functieaanroep?
lllllllllllll
2014-01-11 07:33:36 UTC
view on stackexchange narkive permalink

Testplatform is Windows 32 bit. IDA pro 64

Dus eigenlijk gebruik ik IDA pro om een ​​PE-bestand uit elkaar te halen, en doe wat transformatiewerk aan de asm-code die ik krijg, om het opnieuw samen te stellen .

In de getransformeerde code die ik heb gegenereerd, wordt de systeemfunctieaanroep zoals printf op de gebruikelijke manier geschreven.

  extern printf ... ..... call printf  

Ik gebruik dit om de code die ik maak opnieuw samen te stellen:

  nasm -fwin32 --prefix _ test.scl test. obj / link msvcrt.lib  

Ik heb een uitvoerbaar PE-bestand, en in principe werkt het prima (zoals een hello world-programma, een snel sorteerprogramma en andere).

Maar toen ik IDA pro gebruik om het nieuwe uitvoerbare PE-bestand dat ik maak opnieuw uit elkaar te halen, gebeurden er vreemde dingen.

IDA pro genereert een functieaanroep als volgt:

IDA pro

en wanneer ik gebruik:

  idaq.exe -B test.exe 

om nieuwe assembly-code, in het printf-functie-aanroepgedeelte, genereert het dit:

  call j_printf   pr e> 

Zonder de functie j_printf proc near definieer ...

Dus eigenlijk vraag ik me af of iemand weet hoe hiermee om te gaan, om IDA pro

  call printf  

of

  call _printf  

opnieuw of een andere oplossing ?

mogelijk duplicaat van [Waarom wordt JMP gebruikt met CALL?] (http://reverseengineering.stackexchange.com/questions/2857/why-is-jmp-used-with-call)
@JasonGeffner: hoewel ik het ermee eens ben dat het eruitziet als een duplicaat, wordt de vraag heel anders gesteld (wat toekomstige internauts zal helpen bij het zoeken).
Een antwoord:
Peter Andersson
2014-01-11 12:11:11 UTC
view on stackexchange narkive permalink

Het is cl.exe dat de jump thunk invoegt. Het heeft een aantal voordelen, zoals het gemakkelijker maken om een ​​functie om te leiden tijdens runtime na het laden en het zo maken dat de lader slechts één enkele verplaatsing hoeft uit te voeren voor die functie. De andere optie zou zijn om een ​​indirecte oproep via een adres te gebruiken. Geen van beide is echt optimaal voor de prestaties vanwege de afstand tussen de oproep en de sprong of het adres, wat caching kan schaden. Je kunt de jump thunk uitschakelen door incrementeel linken uit te schakelen.

Dat gezegd hebbende, wat je doet is waarschijnlijk een slecht idee. IDA is niet echt gemaakt om code te produceren die opnieuw kan worden samengesteld. Wat normaal gesproken wordt gedaan, is dat u de laatste sectie uitbreidt of een nieuwe sectie toevoegt met de gepatchte code en vervolgens de originele code omleidt naar de patch door middel van een oproep of een sprong.



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 3.0-licentie waaronder het wordt gedistribueerd.
Loading...