2012-03-29 10 views
3

Ich muss Markierungen in C++ - Code setzen, die in Assembly oder Binär angezeigt werden sollten. Es scheint es gerade nach vorne, es zu tun für 32 Inline-Montag mit:Wie setze ich Assemblierungsmarker zu C++ - Code (x64)

__asm { 
    NOP 
    NOP 
    NOP 
} 

oder mit DB Montage Aussage:

__asm { 
    DB 0x00, 0xFF, 0x10 
} 

Aber Visual Studio 2005 und besser nicht Inline-Assembler für x64 unterstützt. Gibt es einen Weg, es zu tun? Wahrscheinlich kann ich eine Funktion im separaten Assembly-Modul erstellen, aber wie kann ich sicher sein, dass Linker dort eine tatsächliche Assembly anstelle von CALL setzt?

+1

Der Linker fügt keine 'CALL'-Anweisungen ein, sondern gibt nur die tatsächliche Adresse ein. Der Compiler hat die 'CALL' in Ihre Assembly eingefügt. Aber warum brauchst du das? Ist eine "CALL well-known-address" nicht als Marker verwendbar? – MSalters

+0

Ja, es könnte der Weg sein: Finde den Marker und seine Adresse und finde dann CALLs dieser Adresse. – ChatCloud

+0

Eigentlich ist es eine gute Lösung. Es gibt einige verwandte Artikel http://www.codereversing.com/blog/?p=69 – ChatCloud

Antwort

2

Definieren Sie irgendwo eine globale flüchtige Variable, sagen Sie volatile __int64 blah = 0;. Dann, wo immer Sie einen Marker wollen, verwenden Sie _InterlockedCompareExchange64(&blah, SOME_UNIQUE_CONSTANT1, SOME_UNIQUE_CONSTANT2);. Sie finden garantiert Anweisungen zum Laden von ECX:EBX mit SOME_UNIQUE_CONSTANT1 und EDX:EAX mit SOME_UNIQUE_CONSTANT2, gefolgt von LOCK CMPXCHG8B (0xF0, 0x0F, 0xC7 usw. - siehe Anweisungen zur Kodierung).

+0

Vielen Dank für die detaillierte Antwort, es macht Sinn. – ChatCloud

1

Die MSDN sagt, dass Sie intrinsische Funktionen verwenden können.

+0

könnte hilfreicher sein, auf die "__nop" intrinsisch zu zeigen: http://msdn.microsoft.com/en-us/library /aa983381(v=vs.80).aspx – Necrolis

+0

http://msdn.microsoft.com/en-US/library/26td21ds.aspx sagt "Auch der Optimierer kann die intrinsische unterschiedlich erweitern". Ich frage mich, ob der Optimierer überhaupt NOPs entfernen kann. – ChatCloud

+1

@Activation - Der Optimierer kann das intrinsische für verschiedene Parameter unterschiedlich erweitern. So wie 'Memcpy' besser für Blöcke fester Größe als für variable Längen. Wenn Sie '__nop' hinzufügen, wollen Sie es offensichtlich dort haben, also würde der Compiler es nicht entfernen. –

0
//MyAsmCode.asm 
.code 
    MyFunction proc 
    ... 
    MyFunction endp 
end 

kompilieren Sie es (ml64.exe).

Sie erhalten Objektdatei (MS COFF 64): MyAsmCode.obj

In VS MyAsmCode.obj fügen Sie zusätzliche dep Linker.

Jetzt können Sie diese Funktion aufrufen. ;)

+0

Wie können Sie sicher sein, dass Linker Inline MyFunction anstelle von CALL? – ChatCloud

+0

Beschreiben Sie die Details für das, was Sie brauchen, ich denke, ich kann Ihnen helfen – Evgeny