api befehle über sysenter ausführen



  • Hi,

    //    STACK ORDER: HANDLE, Base, Buffer, Size, ??? ( &HANDLE ), 0
    void __declspec(naked) NtWriteVirtualMemory ( void* hProcc, void* Base, void* Buffer, unsigned int Size, unsigned int * Out ){
      __asm{
        mov ebp, esp
        sub ebp, 4
        lea eax, hProcc
        push hProcc
        push Base
        push Buffer
        push Size
        push eax
        push 0
        add esp, 0x18
        mov eax, 0x115
        mov edx,esp
        sysenter
      }
    }
    
    int Buffer[4000];
    
    int main(int argc, char* argv[])
    {
      int X = 4;
      // -1 für gegenwärtiger prozess, in den buffer sollen die ersten 4 byte von X geschrieben werden, keine output kontrolle.
      NtWriteVirtualMemory( (void*)-1, (void*)Buffer, (void*)&X, 4, 0 );
      return 0;
    }
    

    ich versuche gerade einen api befehl über sysenter auszuführen ( warum? weil es mich interessiert ob es klappt ^^ )...
    nur das problem dabei ist, ich bin ratlos warum es sich nicht so verhält wie es sollte.

    es führt fehlerfrei aus, jedoch gibt es keine änderung am Buffer, hier eine kurze aufführung der ausführung der WriteProcessMemory Funktion

    7C802268 50 PUSH EAX
    7C802269 53 PUSH EBX
    7C80226A FF75 10 PUSH DWORD PTR SS:[EBP+10]
    7C80226D FF75 0C PUSH DWORD PTR SS:[EBP+C] ; OntheFly.Buffer
    7C802270 57 PUSH EDI
    7C802271 FF15 0414807C CALL DWORD PTR DS:[<&ntdll.NtWriteVirtualMemory>] ; ntdll.ZwWriteVirtualMemory

    0012FF44 FFFFFFFF
    0012FF48 1337C6F4 OFFSET OntheFly.Buffer
    0012FF4C 0012FF88
    0012FF50 00000004
    0012FF54 0012FF74
    0012FF58 00000000
    0012FF5C 1337A034 OntheFly.1337A034

    7C91DFAE n> B8 15010000 MOV EAX,115
    7C91DFB3 BA 0003FE7F MOV EDX,7FFE0300
    7C91DFB8 FF12 CALL DWORD PTR DS:[EDX]
    7C91DFBA C2 1400 RETN 14

    0012FF40 7C802277 RETURN to kernel32.7C802277 from ntdll.ZwWriteVirtualMemory
    0012FF44 FFFFFFFF
    0012FF48 1337C6F4 OFFSET OntheFly.Buffer
    0012FF4C 0012FF88
    0012FF50 00000004
    0012FF54 0012FF74
    0012FF58 00000000
    0012FF5C 1337A034 OntheFly.1337A034

    7C91E510 n> 8BD4 MOV EDX,ESP
    7C91E512 0F34 SYSENTER
    7C91E514 n> C3 RETN

    0012FF3C 7C91DFBA RETURN to ntdll.7C91DFBA
    0012FF40 7C802277 RETURN to kernel32.7C802277 from ntdll.ZwWriteVirtualMemory
    0012FF44 FFFFFFFF
    0012FF48 1337C6F4 OFFSET OntheFly.Buffer
    0012FF4C 0012FF88
    0012FF50 00000004
    0012FF54 0012FF74
    0012FF58 00000000
    0012FF5C 1337A034 OntheFly.1337A034

    kann es sein das mein buffer nicht geändert wird weil ich die aufrufe der funktionen protectvirtualmemory und flushinstructioncache, die bei writeprocessmemory verwendet werden, weggelassen habe?



  • hab mein problem bereits gefunden...

    im debugger meiens compillers wurde der stack von unten nach oben angezeigt, und in ollydbg von oben nach unten... dementsprechend habe ich es programmiert

    *facepalm*


Anmelden zum Antworten