|
| 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
| |
|
|