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