pobranie adresu aktualnej instrukcji (C + ASM)

0

Witam, potrzebuje adres aktualnie wykonywanej instrukcji do mojego programu w C. Wiem, że znajduje się w EIP i że dobieram się do niego za pomocą $. Problem leży w tym, że jak piszę w samym asemblerze to działa a jak robię wstawkę w C to zamiast $ wpisuje mi 0. Czy ktoś wie dlaczego i jak temu zaradzić?

#include <windows.h>

int main() {
    __asm {
        mov eax, $ // disassembly: 001113BE  mov         eax,0
    }
    return 0;
}

Chcę to wykorzystać do zrobienia czegoś takiego:
user image
Chcę złożyć początek adresu z EIP z końcówką adresu messageboxa z tablicy importów.

1

zrób call do następnej instrukcji, i masz adres powrotu odłożony na stosie. pamiętaj żeby zdjąć go ze stosu.

0

dzięki

0

delta offset stosuje się jak się NIE WIE, gdzie się jest, normalnie się wali labela "dupa:" + "mov eax,offset dupa", co do innych kombinacji delta offsetu to z metasploita ciekawa metoda, zapisująca stan FPU, gdzie zapisany jest też m.in. adres ostatnio wykonywanej instrukcji FPU:

        local   fpEnvironment[32]:byte

        finit                                   ; inicjalizuj FPU
tutaj:  fldz                                    ; byle jaka instrukcja
        lea     eax,fpEnvironment
        fnstenv byte ptr[eax]                   ; zapisz stan srodowiska
        mov     eax,dword ptr[eax+12]           ; adres ostatniej instrukcji FPU
        ; eax = offset tutaj
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1