PHP Forum - Coding Board
Juni 21, 2018, 11:40:27 *
Willkommen Gast. Bitte einloggen oder registrieren.

Einloggen mit Benutzername, Passwort und Sitzungslänge
News:
 
   Übersicht   Hilfe Suche Einloggen Registrieren  
Seiten: [1]
  Drucken  
Autor Thema: [C++ inline asm] stdcall argumente funktionieren nicht  (Gelesen 171 mal)
0 Mitglieder und 1 Gast betrachten dieses Thema.
Nop0x90
Full Member
***
Beiträge: 197


541820
Profil anzeigen E-Mail
« am: März 31, 2009, 04:49:07 »

Hi,

ich hoffe, dass mir hiermit jemand helfen kann. Ich habe eine __stdcall funktion in c++ geschrieben die in einen prozess injiziert wird und ne menge inline asm enthält.
Code:
HANDLE __stdcall _OpenProcess (DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId)
DWORD start, ret, ownprocid;
    int count;
    unsigned result;
    BYTE byte;

    DWORD procid = dwProcessId;
    DWORD access = dwDesiredAccess;
    BOOL inherit = bInheritHandle;
    asm volatile(
        "PUSH %%EBX\n\t"
        "PUSH %%ECX\n\t"
        "PUSH %%EDX\n\t"
        "PUSH %%ESI\n\t"
        "PUSH %%EDI\n\t"
am anfang von dem ASM sichere ich erstmal alle register, dann kommt ne menge schreiberei etc und dann soll die echte funktion aufgerufen werden, dazu pushe ich die argumente wieder und calle dann:
Code:
       "PUSH %1\n\t"
        "PUSH %2\n\t"
        "PUSH %3\n\t"
        "CALL %4\n\t"
        :"=r" (start), "=r" (procid), "=r" (inherit), "=r" (access), "=r" (ret), "=r" (ownprocid)
    );
Gut, allerdings in olly:
Zitat
CPU Disasm
Address   Hex dump          Command                                  Comments
0002000A    55              PUSH EBP                       <-------------------start of function
0002000B    89E5            MOV EBP,ESP
0002000D    57              PUSH EDI
0002000E    56              PUSH ESI
0002000F    53              PUSH EBX
00020010    53              PUSH EBX
00020011    51              PUSH ECX
00020012    52              PUSH EDX
00020013    56              PUSH ESI
00020014    57              PUSH EDI
hier sieht man wie ich am anfang alle register sichere. allerdings erscheint nirgends dieses
Code:
MOV [register], DWORD PTR SS:[ESP-sonstwas]
damit werden doch normalerweise die argumente geholt... erscheint aber nirgends. Stattdessen:
Zitat
CPU Disasm
Address   Hex dump          Command                                  Comments
00020042    51              PUSH ECX
00020043    52              PUSH EDX
00020044    50              PUSH EAX
00020045    FFD6            CALL ESI
das heisst die drei argumente werden gepusht, natürlich steht da aber nicht das argument drin, weil es ja nie reingepoppt wurde... Hat einer ne ahnung warum diese MOV zeile da nicht auftaucht? Sollte bei __stdcall doch eigentlich gehen? Wäre wirklich toll, wenn mir jemand helfen kann

danke im vorraus, greetz
Gespeichert

greetz Nop (ehem. Av0c4d0)
-Coding & RE


EBFE
Full Member
***
Beiträge: 109


Profil anzeigen E-Mail
« Antworten #1 am: März 31, 2009, 05:32:27 »

GCC inlineasm ist nicht gerade übersichtlich Zwinkernd. Probiers mal mit "=m" oder "m". Jedefnalls ergibt das "PUSH %X" mit "=r" irgendwie keinen Sinn, sofern der InlineAssembler da nicht automatisch ein MOV generiert. Pushen kann man Speicherwerte durchaus direkt (PUSH DWORD PTR [EBP-X]). BTW: bei stdcall(Winddows) brauchst du nur EBX, EDI, ESI zu sichern.
Gespeichert

PM an mich? Bitte vorher lesen: EBFEs PM FAQ
Nop0x90
Full Member
***
Beiträge: 197


541820
Profil anzeigen E-Mail
« Antworten #2 am: März 31, 2009, 07:15:15 »

Hi,

vielen dank für deine antwort EBFE, ich habe erst vor einigen Tagen mit diesem inline asm in gcc angefangen. Ich war so verwirrt am Anfang. Ich meine die Syntax ist auch wirklich blöd... Wie auch immer, dank deinem Hinweis auf das m als memory constraint konnte ich das Problem TEILWEISE lösen. Memory constraints sind natürlich viel praktischer, weil man die nicht dauernd sichern muss. Tatsächlich tauchen jetzt diese besagten MOV zeilen im Olly auf. Dafür habe ich aber jetzt ein compiler problem:

Code:
asm volatile( // restore hook and registers
        &quot;MOVB $0x00, %0\n\t&quot;
        &quot;MOVL $0x00000000, %3\n\t&quot;
        &quot;ADDL $5, %1\n\t&quot;
        &quot;JMP .L4\n\t&quot;
        &quot;.L3:\n\t&quot;
        &quot;INCL %1\n\t&quot;
        &quot;INCL %2\n\t&quot;
        &quot;INCL %3\n\t&quot;
        &quot;.L4:\n\t&quot;
        &quot;MOVB (%1), %0\n\t&quot;
        &quot;MOVB %0, (%2)\n\t&quot;
        &quot;CMPL $4, %3\n\t&quot;
        &quot;JNE .L3\n\t&quot;
        :&quot;=r&quot; (byte), &quot;=m&quot; (start), &quot;=m&quot; (ret), &quot;=r&quot; (count)
    );
Kurze erklärung: Dieser code liest 5 bytes ab dem offset in start und schreibt sie an das offset in ret. Bei den beiden MOVB zeilen kriege ich folgenden fehler seit ich "=m" als constraint habe:

Zitat
4496|Error: missing ')'
4496|Error: junk `(%ebp))' after expression

Das treibt mich in den Wahnsinn Traurig Einer ne Ahnung?

greetz
Gespeichert

greetz Nop (ehem. Av0c4d0)
-Coding & RE


EBFE
Full Member
***
Beiträge: 109


Profil anzeigen E-Mail
« Antworten #3 am: März 31, 2009, 07:34:41 »

Ehrlich gesagt kann ich AT&T Syntax nicht ausstehen (vielleicht ja Gewöhnungsache, aber ... Zwinkernd ). Eventuell lohnt es sich, externe Routinen (NASM) einzubinden oder auf intel syntax umzustellen?
Sowas müsste gehen:
Code:
asm volatile( // restore hook and registers
        &quot;MOVB $0x00, %0\n\t&quot;
        &quot;MOVL $0x00000000, %3\n\t&quot;
        &quot;ADDL $5, %1\n\t&quot;
        &quot;JMP .L4\n\t&quot;
        &quot;.L3:\n\t&quot;
        &quot;INCL %1\n\t&quot;
        &quot;INCL %2\n\t&quot;
        &quot;INCL %3\n\t&quot;
        &quot;.L4:\n\t&quot;
        &quot;MOVB %1, %0\n\t&quot;
        &quot;MOVB %0, %2\n\t&quot;
        &quot;CMPL $4, %3\n\t&quot;
        &quot;JNE .L3\n\t&quot;
        :&quot;=r&quot; (byte), &quot;=m&quot; (start), &quot;=m&quot; (ret), &quot;=r&quot; (count)
    );
   
da wird sowas generiert:
Code:
/APP
MOVB $0x00, %al
MOVL $0x00000000, %edx
ADDL $5, -28(%ebp)
JMP .L4
.L3:
INCL -28(%ebp)
INCL -21(%ebp)
INCL %edx
.L4:
MOVB -28(%ebp), %al
MOVB %al, -21(%ebp)
CMPL $4, %edx
JNE .L3
Gespeichert

PM an mich? Bitte vorher lesen: EBFEs PM FAQ
Nop0x90
Full Member
***
Beiträge: 197


541820
Profil anzeigen E-Mail
« Antworten #4 am: März 31, 2009, 07:39:14 »

Hi,

Danke, habe das Problem in den Griff gekriegt aus irgendeinem Grund gibt das ding jetzt als Last Error: INVALID_PARAMETER an, aber das krieg ich hin.
Ich würde liebend gerne auf Intel syntax umstellen, aber diese compiler option -masm=intel hat nichts gebracht bei mir Traurig

greetz

Edit: das scheint doch ein bisschen komplizierter zu sein:
Code:
&quot;PUSH %0\n\t&quot;
        &quot;PUSH %1\n\t&quot;
        &quot;PUSH %2\n\t&quot;
        &quot;CALL %3\n\t&quot; // Everything prepared for call to real function
        // Stack is realigned
    :&quot;=m&quot; (dwProcessId), &quot;=m&quot; (bInheritHandle), &quot;=m&quot; (dwDesiredAccess), &quot;=m&quot; (ret), &quot;=m&quot; (start)
    );
So werden die argumente für den call auf den stack gepusht. Das sind auch die richtigen argumente, in olly überorüft. Dann wird aber der call aufgerufen und da steht folgendes:
Code:
CPU Disasm
Address   Hex dump          Command                                  Comments
76988C95  /$  8BFF          MOV EDI,EDI                              ; HANDLE kernel32.OpenProcess(Access,InheritHandle,ProcessID)
76988C97  |.  55            PUSH EBP
76988C98  |.  8BEC          MOV EBP,ESP
76988C9A  |.  83EC 20       SUB ESP,20
76988C9D  |.  8B45 10       MOV EAX,DWORD PTR SS:[ARG.3]
76988CA0  |.  8945 F8       MOV DWORD PTR SS:[LOCAL.2],EAX
76988CA3  |.  8B45 0C       MOV EAX,DWORD PTR SS:[ARG.2]
76988CA6  |.  56            PUSH ESI

Also nimmt der die scheiss argumente nicht vom stack direkt sondern verschiebt den stack erst um 20. Natürlich kommt er jetzt nicht mehr an die Argumente die ich vorher gepusht hab und kriegt deshalb INVALID_PARAMETERS.
WEiss einer warum das so ist/wie ich das verhindern kann?

Danke
« Letzte Änderung: März 31, 2009, 07:51:42 von Nop0x90 » Gespeichert

greetz Nop (ehem. Av0c4d0)
-Coding & RE


Seiten: [1]
  Drucken  
 
Gehe zu:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | New Look by Nolt Prüfe XHTML 1.0 Prüfe CSS