Toon posts:

[C# or C++] Program counter

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoe kun je de program counter ophalen?

Ik wil de PC graag kopieren en op het scherm laten zien.
Ook zou het leuk zijn om de PC een andere waarde te geven.

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Op maandag 22 april 2002 11:59 schreef jw.oosting het volgende:
Hoe kun je de program counter ophalen?

Ik wil de PC graag kopieren en op het scherm laten zien.
Ook zou het leuk zijn om de PC een andere waarde te geven.
Euh... program counter? Wat bedoel je?

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

ff een stukje inline assembly? en waarom wil je de PC wijzigen, lijkt me niet echt handig.

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


Verwijderd

Zou dat wel eens kunnen onder windows ? Wat moet je in hemelsnaam met het PC register doen ???

Verwijderd

De programcounter == EIP (op i386) == adres van huidige instructie, ik denk dat je een ander tellertje wil hebben want ik zou echt niet weten wat je hier mee zou willen doen?

Verwijderd

Op maandag 22 april 2002 12:28 schreef Yarvieh het volgende:
De programcounter == EIP (op i386) == adres van huidige instructie, ik denk dat je een ander tellertje wil hebben want ik zou echt niet weten wat je hier mee zou willen doen?
Heet dat een EIP op de i386, wist ik niet... mijn assembly ervaringen gaan terug naar het MSX tijdperk ;)

Verwijderd

Topicstarter
Ik wil de programflow laten zien.
Met de program counter en de memorymap kan ik precies laten zien welke functies van welke processen elkaar volgen.
Ik wil dit graag zien in een release versie en niet tijdens een debug release.

Tevens wil ik de PC kunnen wijzigen, om een wiilekeurige functie uit te kunnen voeren. In de memorymap staan alle functie adressen. Daarmee kun je dus een functie aanroepen, door gewoon de PC te wijzigen.

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

(Extended)InstructionPointer, right?

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 20:58

Janoz

Moderator Devschuur®

!litemod

Op maandag 22 april 2002 12:31 schreef jw.oosting het volgende:
Ik wil de programflow laten zien.
Met de program counter en de memorymap kan ik precies laten zien welke functies van welke processen elkaar volgen.
Ik wil dit graag zien in een release versie en niet tijdens een debug release.

Tevens wil ik de PC kunnen wijzigen, om een wiilekeurige functie uit te kunnen voeren. In de memorymap staan alle functie adressen. Daarmee kun je dus een functie aanroepen, door gewoon de PC te wijzigen.
Onder windows, en al helemaal met .net, heb je hier waarschijnlijk helemaal geen toegang toe. Al zou je het voor elkaar kunnen krijgen, dan zal windows je waarschijnlijk met allemaal blauwe schermen om de oren slaan.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Onder gewoon win32 mag het wel met Get/SetThreadContext maar de toepassing waar de topicstarter het over heeft ontgaat mij een beetje, zie [topic=316467/1/255] voor 'n example.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Natuurlijk mag een applicatie wel registers wijzigen. Ook de program counter dus. Je krijgt pas een foutmelding wanneer je probeert de program counter in een ongeldige page te plaatsen.

Helaas zijn C# en C++ beiden erg ongeschikt voor het manipuleren van hardware op registernivo. Je zal hoe dan ook assembly moeten gebruiken. Zoek eens naar de Microsoft Macro Assembler (MASM), bijvoorbeeld. Ik zou in jou specifieke geval aanraden om de profiling code in assembly te schrijven en te linken tegen een C++/C# executable, want GUI's bouwen in assembly is een hel. :)

Ik denk trouwens dat het ophalen van de programcounter niet zo nuttig is. Op het moment dat je die opvraagt met een stukje code, weet je al waar die naar wijst: naar de code die de programcounter opvraagt! Wat je wil lijkt me daarom niet zo haalbaar, maar daar kom je zelf wel achter. Handiger is waarschijnlijk om op kritische punten in je programma tellers te installeren, zodat je kunt zien hoe vaak bepaalde routines worden aangeroepen e.d.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-09 00:49
Op maandag 22 april 2002 13:10 schreef Soultaker het volgende:
Ik denk trouwens dat het ophalen van de programcounter niet zo nuttig is. Op het moment dat je die opvraagt met een stukje code, weet je al waar die naar wijst: naar de code die de programcounter opvraagt! Wat je wil lijkt me daarom niet zo haalbaar, maar daar kom je zelf wel achter.
Valt wel mee. De truc is dat de EIP op de stack wordt geduwd door een CALL, om de restoren bij een RET.
Dus je show_eip functie kan die gewoon laten zien. Sterker nog, zonder asm maar met (unportable) C++ code lukt dat ook. Gewoon 1 void* op de stack zetten, een paar bytes van't adres aftrekken (effe zoeken met debugger hoeveel) en je hebt je EIP.
Simpel. Niet portable, maar als je een EIP wil weten van een Sun lukt't toch niet.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Weet iemand ook de code om de PC op te vragen?

Ik google me rot, maar kan niet echt een voorbeeld vinden.
Ik heb het eerst gewoon zo geprobeerd:

int i;

__asm movlw i,EIP

maar dit werkt niet.
Heb ook niet zo veek ervaring met assembly.

Verwijderd

*KUCH* GetThreadContext / SetThreadContext *KUCH* (2e maal)

Verwijderd

Topicstarter
Sorry.

En bedankt allemaal.

  • Sjonny
  • Registratie: Maart 2001
  • Laatst online: 08:34

Sjonny

Fratser

Op maandag 22 april 2002 13:10 schreef Soultaker het volgende:
Handiger is waarschijnlijk om op kritische punten in je programma tellers te installeren, zodat je kunt zien hoe vaak bepaalde routines worden aangeroepen e.d.
en daar hebben we profilers voor, zodat je zelf niet die tellers in je code hoeft te flansen :)

The problem is in the part of your brain that handles intelligence.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op maandag 22 april 2002 13:22 schreef MSalters het volgende:

[..]

Valt wel mee. De truc is dat de EIP op de stack wordt geduwd door een CALL, om de restoren bij een RET.
Dus je show_eip functie kan die gewoon laten zien. Sterker nog, zonder asm maar met (unportable) C++ code lukt dat ook. Gewoon 1 void* op de stack zetten, een paar bytes van't adres aftrekken (effe zoeken met debugger hoeveel) en je hebt je EIP.
Simpel. Niet portable, maar als je een EIP wil weten van een Sun lukt't toch niet.
ik zie de relatie tussen de stack pointer en de instruction pointer niet helemaal (en dan heb ik het over de huidige instructie, niet die van het returnadres van de aanroepende functie)

kun je een stukje voorbeeldcode geven?

.edit: oh wacht ik snap wat je bedoelt.. dit dus:
code:
1
2
3
4
5
int getEIP ()
{
    int i;
    return *(&i + 2);
}

.edit2: mag je trouwens wel zorgen dat ie de stackframe niet gaat lopen optimaliseren (of de functie inlinet), anders werkt het al niet meer

.edit3: of met een parameter:
code:
1
2
3
4
int getEIP (int i = 3)
{
    return *(&i - 1);
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • serkoon
  • Registratie: April 2000
  • Niet online

serkoon

mekker.

Wanneer een call wordt uitgevoerd wordt EIP op de stack gegooid, zodat bij de RET van die call daarnaar teruggesprongen kan worden.

Even in de stack kijken en je hebt EIP op de plek waar de call werd uitgevoerd dus.

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
Waarschijnlijk ten overvloede, maar voor de mensen die het nog niet doorhadden:

Je kunt de PC (EIP) niet direct benaderen, niet om te lezen en niet om te schrijven. De PC lees je indirect met een CALL en je schrijft een indirect met een RET. Hier kun je natuurlijk lekker misbruik van maken zoals al door een paar mensen is voorgesteld.

He who knows only his own side of the case knows little of that.


Verwijderd

zoiets dus :Y)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

void xtest()
{
    printf("Elvis ");
}

int main(int argc, char* argv[])
{
    __asm{
    
    push offset blaat
    push offset xtest
    ret

blaat:
    }
    printf("has left the building\n");
    return 0;
}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

met een jmp kun je m natuurlijk ook setten :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1