/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
ram adresse
Fra : finn knussen


Dato : 14-08-06 19:32

hej

Hvordan skriver og læser man fra en bestemt rat adresse f.eks skrive
til 0x00400004 = 0x55 og læser det igen ?


 
 
Kent Friis (14-08-2006)
Kommentar
Fra : Kent Friis


Dato : 14-08-06 19:34

Den 14 Aug 2006 18:32:28 GMT skrev finn knussen:
> hej
>
> Hvordan skriver og læser man fra en bestemt rat adresse f.eks skrive
> til 0x00400004 = 0x55 og læser det igen ?

1. Bruger DOS. Nyere operativsystemer tillader ikke at skrive til
tilfældige adresser.

2. Laver en pointer og sætter den til at pege på adressen. Alternativt
cast'er den til en pointer, men det første er nok nemmest.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Ukendt (14-08-2006)
Kommentar
Fra : Ukendt


Dato : 14-08-06 20:27


"finn knussen (slet SNSK0)" <finn@SNSK0familie.tele.dk> skrev i en
meddelelse news:11555806170.892789779062195@dtext.news.tele.dk...
> hej
>
> Hvordan skriver og læser man fra en bestemt rat adresse f.eks skrive
> til 0x00400004 = 0x55 og læser det igen ?
>

*((volatile unsigned char*) 0x00400004) = 0x55
int a = *((volatile unsigned char*) 0x00400004)

Men lav lige en #define til det
Kræver som nævnt at dit OS tillader det eller at du kører uden OS

tpt



finn knussen (14-08-2006)
Kommentar
Fra : finn knussen


Dato : 14-08-06 20:46

kan du forklare det nærmer *((volatile unsigned char*)
0x00400004) hvad betyder det ? jeg kan se det vist er noget med
en pointer og en cast, men jeg forstår den ikke lige helt
hvordan det bliver til en adresse ?


Mogens Hansen (14-08-2006)
Kommentar
Fra : Mogens Hansen


Dato : 14-08-06 20:58


"finn knussen (slet 2FI2I)" <finn@2FI2Ifamilie.tele.dk> wrote in message
news:11555850250.287104058501789@dtext.news.tele.dk...
> kan du forklare det nærmer *((volatile unsigned char*)
> 0x00400004) hvad betyder det ? jeg kan se det vist er noget med
> en pointer og en cast, men jeg forstår den ikke lige helt
> hvordan det bliver til en adresse ?

En pointer er (konceptuelt, og sommetider reelt) en adresse.
Det vil sige at
int i;
int* pi = &i;
så indeholder pointeren "pi" adressen på "i".

Når man caster så siger man til compileren: "stol på mig - der ligge en
unsigned char på den adresse".
Hvis man prøver at snyde compileren skal den nok få sin hævn - helt
generelt.

Venlig hilsen

Mogens Hansen



Kent Friis (14-08-2006)
Kommentar
Fra : Kent Friis


Dato : 14-08-06 21:06

Den 14 Aug 2006 19:45:57 GMT skrev finn knussen:
> kan du forklare det nærmer *((volatile unsigned char*)
> 0x00400004) hvad betyder det ? jeg kan se det vist er noget med
> en pointer og en cast, men jeg forstår den ikke lige helt
> hvordan det bliver til en adresse ?

"volatile" betyder at værdien kan ændre sig, den kan altså ikke bare
kopiere den ind i et register og genbruge værdien.

"unsigned char" er normalt det samme som en byte.

(volatile unsigned char*) er en pointer til en (volatile) unsigned
char, altså en pointer til en byte der ikke må genbruges.

((volatile unsigned char*) 0x00400004) er en pointer til en
unsigned char der peger på adresse 0x00400004.

Og til sidst *((volatile unsigned char*) 0x00400004) betyder at
du ønsker værdien som pointeren peger på.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Bertel Brander (14-08-2006)
Kommentar
Fra : Bertel Brander


Dato : 14-08-06 20:34

finn knussen (slet SNSK0) wrote:
> hej
>
> Hvordan skriver og læser man fra en bestemt rat adresse f.eks skrive
> til 0x00400004 = 0x55 og læser det igen ?

*(int *)0x12FF88 = 121;
std::cout << *(int *)0x12FF88 << std::endl;

Men det er ikke sikkert at det giver noget fornuftigt.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Michael Rasmussen (14-08-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 14-08-06 20:38

On Mon, 14 Aug 2006 18:32:28 +0000, finn knussen wrote:

> Hvordan skriver og læser man fra en bestemt rat adresse f.eks skrive til
> 0x00400004 = 0x55 og læser det igen ?
Nu har andre givet bud på læsning, så jeg vil give et bud på skrivning.
Skriver du til et hvilket som helst hukommelsesområde uden for det af dig
tildelte adresseområde, vil du øjeblikketligt få en segmentation fault
- heri medregnes ikke DOS og andre OS, der ikke kører i protected mode.

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Kent Friis (14-08-2006)
Kommentar
Fra : Kent Friis


Dato : 14-08-06 21:02

Den Mon, 14 Aug 2006 21:37:51 +0200 skrev Michael Rasmussen:
> On Mon, 14 Aug 2006 18:32:28 +0000, finn knussen wrote:
>
>> Hvordan skriver og læser man fra en bestemt rat adresse f.eks skrive til
>> 0x00400004 = 0x55 og læser det igen ?
> Nu har andre givet bud på læsning,

De fleste har svaret på både læsning og skrivning.

> så jeg vil give et bud på skrivning.
> Skriver du til et hvilket som helst hukommelsesområde uden for det af dig
> tildelte adresseområde, vil du øjeblikketligt få en segmentation fault

Det får man også ved læsning.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Søren Krarup Olesen (15-08-2006)
Kommentar
Fra : Søren Krarup Olesen


Dato : 15-08-06 09:26

Michael Rasmussen wrote:
> On Mon, 14 Aug 2006 18:32:28 +0000, finn knussen wrote:
>
>> Hvordan skriver og læser man fra en bestemt rat adresse f.eks skrive til
>> 0x00400004 = 0x55 og læser det igen ?
> Nu har andre givet bud på læsning, så jeg vil give et bud på skrivning.
> Skriver du til et hvilket som helst hukommelsesområde uden for det af dig
> tildelte adresseområde, vil du øjeblikketligt få en segmentation fault
> - heri medregnes ikke DOS og andre OS, der ikke kører i protected mode.

Eller mere præcist: Dét der sker er, at man prøver at skrive ud i
programmets virtuelle adresse-område (gælder både Linux og Windows), og
det var *næppe* dét der var hensigten. Af samme grund kan man også være
"heldig", at man ikke får en segmentation fault, idet adressen (ved en
tilfældighed) jo kunne ramme en lovlig variabel.

Hvis man i user mode insisterer på at skrive ud i en fysisk adresse (i
modsætning til en virtuel adresse), og mon ikke det er det vi taler om
her, så er der ingen vej udenom at tilgå adressen vha. en driver.
Drivere kører i kernel mode og "må alt".

Søren

Søg
Reklame
Statistik
Spørgsmål : 177428
Tips : 31962
Nyheder : 719565
Indlæg : 6407944
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste