Zmienne a tryb chroniony?

0

Witam

Napisalem w Builderze 6.0 funkcje w asmie no i okazuje sie ze sa problemy z zapisem w pamieci ---- tak wiem wiem tryb chroniony, tylko dlaczego standardowe funkcje C moga bez przeszkod pisac w obszarze pamieci do ktorego spod asma nie mam dostepu.

Aby wszystko bylo jasne wstawie ktotki kod:

moja_funkcja ()
{
char bufor[200]
asm
   {
      mov eax, offset bufor
      mov [eax], 'a'      // tu sie wykrzacza
   } 
} 

Fnkcja jes znacznie bardziej rozbudowana, ale tutaj dla celow pogladowych ograniczylem sie tylko do ktotkiego kodu miejsca gdzie program sygnalizuje blad.
Przy czym standardowe funkcje, metody C/C++ moga bez przeszkod korzystac z tego bufora.

Czy istnieje sposob, a moze jest jakas funkcja lub API ktore zmienia domyslne prawa dostepu do obszaru pamieci zajmowanego przez zmienna, tablice.
Nie znam dobrze praw jakimi zadzi sie tryb chroniony, wiec grzebanie sie przy deskryptorach zabezpieczen raczej odpada. -- chyba ze nie ma innej metody aby to obejsc, coz wtedy sie poswiece i moze nawet cos na ten temat poczytam :P

Takwiec prosze o rady, linki, i dobre slowo :)

Pozdrawiam marcel

0

moja_funkcja ()
{
char bufor[200]
asm
{

mov eax, offset bufor
mov [eax], 'a' // tu sie wykrzacza

}
}

sprobuj tak:

_EAX=(unsigned int)&bufor
asm {
...
mov [eax],'a'
...
}

0

tak, jak ty to napisales do rejestru EAX nie byl ladowany adres buforu, lecz zawartosc czterech pierwszych bajtow spod adresu bufor.
poczytaj wiecej na temat assemblera pod cpp. mnie tez wiele rzeczy w asm zadziwilo!

0

Nie masz racji norbercie do eax na pewno trafia offset bo w buforze sa same zera

Wydaje mi sie ze tu pomoze tylko przejscie na nizszy poziom uprzywilejowania instrukcji Ring0 bylby odpowiedni :P ale w windows xp jest to owiele bardziej skomplikowane poniewaz ze wzgledow bezpieczenstwa uniemozliwiony zostal dostep do
LDT - Lokalnej tablicy deskryptorow
IDT - Tablica deskryptorow przerwan oraz
SEH - Jakas strukturalna obsluga wyjatkow :P -- sam niewiem co to jest

ale podobno oprogramowujac odpowiednio te zbiory mozna uzyskac Ring0
Niestety Xp - nie pozwala ich nawet tknac.

To tyle informacji ktore udalo mi sie zebrac na wlasna reke -- jesli jeszcze ktos wie co mozna z tym zrobic to prosze o poscik

PS. Norbert wielkie DZIEKI!!!

0

Qwa ale zemnie lama juz doszedlem co jest nie tak, niewiem sam co mi odbilo, jak moglem myslec ze zmienne lokalne sa w segmencie kodu. Kurcze juz nawet poziom uprzywilejowania instrukcji chcialem zmieniac dobrze ze mi sie nie udalo bo wtedy to by sie dopiero winda posypala.

Takwiec poprawiony kod powinien wygladac tak:

moja_funkcja()
{
char bufor[200];
asm
       {
           lea eax, bufor
           ss:[eax], 'a'
       }
}

Pozdrawiam marcel :|

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