C/C++ --> IDA Pro --> MASM

Hier könnt ihr sowohl zur x86 Architektur als auch zu Win32ASM Fragen stellen.

Moderatoren: crack, Krüsty, Marwin

C/C++ --> IDA Pro --> MASM

Beitragvon go.to.hell » Freitag 30. Mai 2008, 16:16

Hallo,

ich spiele gerade ein wenig mit IDA Pro und würde den Erzeugten Code gerne wieder mit MASM assemblieren, doch irgendwie will er nicht.

Aber mal von Anfang an, ich habe eine einfache Konsolenanwendung erstellt.

Code: Alles auswählen
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
   printf( "Hallo Welt!" );
   return 0;
}


Und das ganze im Visual Studio 2005 übersetzt.

Dann mit IDA Pro 5.1 Dissasembliert und als ASM gespeichert.

Aber MASM mag den code nicht :(

Code: Alles auswählen
D:\asm\ASMTest>ml ASMTest_0003.asm
Microsoft (R) Macro Assembler Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.

 Assembling: ASMTest_0003.asm
ASMTest_0003.asm(132) : error A2027: operand must be a memory expression


Code: Alles auswählen
___tmainCRTStartup proc   near      ; CODE XREF: start+5j

Code      = dword        ptr -20h
var_1C   = dword        ptr -1Ch
ms_exc   = CPPEH_RECORD   ptr -18h   ;; <-- ASMTest_0003.asm(132) : error A2027: operand must be a memory expression


      push   10h
      push   offset unk_4021C8
      call   __SEH_prolog4
      xor   ebx, ebx
           mov   [ebp+ms_exc.disabled], ebx


CPPEH_RECORD wurde wie folgt definiert:

Code: Alles auswählen
CPPEH_RECORD   struc ;   (sizeof=0x18, standard type)
old_esp      dd ?
exc_ptr      dd ?         ; offset
prev_er      dd ?         ; offset
handler      dd ?         ; offset
msEH_ptr   dd ?         ; offset
disabled   dd ?
CPPEH_RECORD   ends


Nun würde ich mich sehr freuen wenn mir jemand die richtige Syntax für die definition sagen könnte.
go.to.hell
Newbie
 
Beiträge: 2
Registriert: Freitag 30. Mai 2008, 15:52

Re: C/C++ --> IDA Pro --> MASM

Beitragvon crack » Samstag 31. Mai 2008, 01:54

Also, Ich denke die Definition der Struktur selbst ist in Ordnung, nur das Problem meines Wissens nach wird das '=' als Substitut für 'equ' benutzt, und das wiederum Bewirkt das Du nicht die Anfangsaddresse der Struktur in die neue Variable übernimmst, sondern eine neue Instanz der Struktur unter neuem Namen generierst.
Ich hab das hier mal wie folgt abgeändert, es gäbe bestimmt auch andere Mögliche Methoden....

Code: Alles auswählen
___tmainCRTStartup proc   near      ; CODE XREF: start+5j

Code      = dword        ptr -20h
var_1C   = dword        ptr -1Ch
ms_exc   = CPPEH_RECORD.disabled  ; <-- ASMTest_0003.asm(132) : error A2027: operand must be a memory expression


      push   10h
      push   offset unk_4021C8
      call   __SEH_prolog4
      xor   ebx, ebx
           mov   [ebp+ms_exc], ebx
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Re: C/C++ --> IDA Pro --> MASM

Beitragvon go.to.hell » Sonntag 1. Juni 2008, 12:33

ms_exc = CPPEH_RECORD.disabled ist nicht ganz das was es sein sollte.

Der Funktion werden über den Stack 3 Parameter übergeben, 2 mal dword und CPPEH_RECORD,
durch "Code = dword ptr -20h" läst sich ja auch wunderbar ein zeiger auf ein dword parameter erstellen so das man auf den Parameter zugreifen kann, nur kann ma leider auf diese weise kein zeiger auf selbstdefinirte structuren erstellen.

Ich habe es nun wie folgt gelöst, der assembler meckert nicht mehr, nur ob es vom sinn her wirklich das selbe ist hab ich noch nicht getestet, da zurzeit noch andere fehler in dem Code sind die ich noch nicht gelöst bekommen hab.

Code: Alles auswählen
CPPEH_RECORD   struc ;   (sizeof=0x18, standard type)
old_esp      dd ?
exc_ptr      dd ?         ; offset
prev_er      dd ?         ; offset
handler      dd ?         ; offset
msEH_ptr   dd ?         ; offset
disabled   dd ?
CPPEH_RECORD   ends
pCPPEH_RECORD TYPEDEF PTR CPPEH_RECORD

...

ms_exc      = pCPPEH_RECORD ptr -18h

...

mov   [ebp+ms_exc].CPPEH_RECORD.disabled, ebx
go.to.hell
Newbie
 
Beiträge: 2
Registriert: Freitag 30. Mai 2008, 15:52

Re: C/C++ --> IDA Pro --> MASM

Beitragvon crack » Montag 2. Juni 2008, 17:00

Neeeeiiiiin, jetzt fällts mir ein :wink:
Als Operanden innerhalb der eckigen Klammern, können keine Speichervariablen benutzt werden :!: Nur Register und Konstanten, der Grund ist technisch relativ simpel diese indirekten oder indirekt indizierten Verschiebeoperationen holen ja Bytes Words oder Doublewords aus dem Speicher, bzw. bringen diese dorthin, dafür wird zum Ausführungszeitpunkt der Addressbus des Systems benutzt, ergo kann dieser natürlich nicht benutzt werden um zu der Zeit eine Speichervariable als Operand zu benutzen.
Der einzige Weg: Speichervariable in ein freies Register, und dieses innerhalb der eckigen Klammer als Operator benutzen, dann wirds funktionieren 8)
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf


Zurück zu Assembler

 


  • { RELATED_TOPICS }
    Antworten
    Zugriffe
    Letzter Beitrag

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron