Autor Beitrag
Lichtel
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 22.07.04 14:53 
Hallo.

Folgende Frage: gibt es irgendeine Möglichkeit innerhalb einer procedure den Namen dieser Prozedur herauszufinden?
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Do 22.07.04 16:01 
nein, weil der name ist lediglich ein Mittel für den Programmierer. Beim kompilieren wird dieser entfernt. Es ist dann lediglich noch eine Adresse zu der gesprungen wird.
Wo man eventuell von Namen sprechen kann sind Exporte von DLLs.

grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Do 22.07.04 17:46 
MSCH hat folgendes geschrieben:
Wo man eventuell von Namen sprechen kann sind Exporte von DLLs.

Nicht nur eventuell ;-)
Wo man auch noch von Namen sprechen kann, das sind Methoden. Nicht umsonst gibt es die von TObject eingeführten Methoden MethodAddress(const Name: ShortString); und MethodName(Address: Pointer);, mit deren Hilfe man jeweils die Adresse bzw. den Namen der Funktion ermitteln kann.
Habs (noch) nicht probiert:
Du könntest mal versuchen in der Methode (Wichtig! Keine Prozedur, eine Methode!) nach hinten nach "558BEC" (hex) zu suchen. Das ist das Anfang einer jeden Prozedur in Assemblerform:
ausblenden Quelltext
1:
2:
55     push ebp
8BEC   mov ebp, esp

Die Adresse, wo das "558BEC" steht speicherst Du in p und übergibst es der self.MethodName(p);.
Das wäre das, was mir dazu einfiele... Wie gesagt, nicht getestet und wenn, dann funktionierts nur bei Methoden!

//edit: Wobei sich mir zumindest justamente die Frage stellt, wie komme ich an die aktuelle Speicheradresse, an der sich der EIP grad befindet... :?


raziel

_________________
JSXGraph
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Do 22.07.04 18:52 
Musste man um das zu realisieren das Programm nicht immer in einem Debugger (den man abfragen kann) laufen lassen?

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Do 22.07.04 19:00 
maxk hat folgendes geschrieben:
Musste man um das zu realisieren das Programm nicht immer in einem Debugger (den man abfragen kann) laufen lassen?

Meinst Du wirklich "Musste" oder "Müsste"? Also man müsste nicht, wenn mir einfiele, wie ich die aktuelle Code-Position rausfinden könnte... :? Aber wozu das gut sein soll, entzieht sich meiner Kenntnis, denn wenn ich während der Laufzeit rausfinden will, in welcher Prozedur ich bin, dann scroll ich im Delphi-Editfenster ein bisschen nach oben und notier ein kurzes procMemo.Lines.Add(Prozedurname);.

raziel

_________________
JSXGraph
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Do 22.07.04 20:03 
Ich meine natürlich "müsste", aber den Thread über Rechtschreibung haben wir ja woanders :wink:
Wofür eine solche Abfrage gut ist, wüsste ich auch gerne. Und wie du ja schon sagtest, weiss man ja wo man sich befindet, wenn man den Code reinschreibt, um rauszufinden, wo man sich befindet 8)

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Do 22.07.04 23:07 
raziel hat folgendes geschrieben:
...Wo man auch noch von Namen sprechen kann, das sind Methoden. Nicht umsonst gibt es die von TObject eingeführten Methoden MethodAddress(const Name: ShortString); und MethodName(Address: Pointer);, mit deren Hilfe man jeweils die Adresse bzw. den Namen der Funktion ermitteln kann.
Habs (noch) nicht probiert:...


Die idee ist gut, hat aber leider einen entscheidenen hacken: MethodAddress und MethodName sind RTTI funktionen und die steht leider nur im published abschnitt zur verfügung. Also geht das nicht mit jeder beliebigen methode.

schade!

_________________
mfg.
mâximôv
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Fr 23.07.04 09:51 
Aber wenigstens mit den published Methoden (auch wenn mir nach wie vor jedweder Sinn der Sache ferngeblieben ist... Klär uns auf Lichtel ;-)):

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  // One and a half words - santa's little helper
  TOAAHW = packed record
    b1, b2, b3: Byte;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  // Das prüft, ob eine Prozedurkopf vorhanden ist:
  function CheckForProcEntry(ToCheck: TOAAHW): Boolean;

implementation

{$R *.dfm}

function CheckForProcEntry(ToCheck: TOAAHW): Boolean;
begin
  result := false;
  // Jede Prozedur mit Anzahl Parameter <> 0 oder Anzahl Lokale Variablen <> 0
  // beginnt mit $558BEC. In Assembler siehts so aus:
  //
  //  55    push ebp
  //  8BEC  mov ebp, esp
  //
  // Das ist der Code zum sichern des Stackframe.

  if (ToCheck.b1 = $55and (ToCheck.b2 = $8Band (ToCheck.b3 = $ECthen
    result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  p: ^Pointer;
  i, j: Integer;
  poaahw: ^TOAAHW;
begin
  // Dirty 'Lil Trick um in die Nähe der aktuellen Position (EIP) zu kommen:
  asm
    jmp @thecall;
    @callme:
    mov p, esp;
    ret;
    @thecall:
    call @callme;
  end;

  j := Integer(p^);
  p := nil;

  // Toleranz ändern(orig: 200), wenn ihr keinen Method-Namen bekommt und keine Adresse bekommt.
  for i := j downto j-200 do
  begin
    poaahw := Pointer(i);
    if CheckForProcEntry(poaahw^) then
    begin
      p := Pointer(i);
      break;
    end;
  end;

  if p <> nil then
    showmessage(inttohex(Integer(p), 8) + ': ' + Self.MethodName(p))
  else
    showmessage('nüscht :(');
end;

end.


raziel

_________________
JSXGraph
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Sa 24.07.04 18:13 
raziel hat folgendes geschrieben:
Das ist das Anfang einer jeden Prozedur in Assemblerform:
ausblenden Quelltext
1:
2:
55     push ebp
8BEC   mov ebp, esp


Nur der Form halber: Das trifft nur bei Prozeduren/Funktionen mit Parameter(n) und/oder lokaler/n Variable(n) zu, ansonsten gibt es nichts was man Header nennen könnte.

RTTI wird für die Formulare benötigt.