Projektpfad aus EXE ermitteln

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 483
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 11 Mal

Projektpfad aus EXE ermitteln

Beitrag von azzo »

Hallo,
ich suche nach einer Möglichkeit, eine EXE Datei zu lesen und nach einem Wort zu suchen.
Memoread oder f_open funktioniert bei mir leider nicht.

Man kann eine EXE mit F3 vom TotalCommander aus aufmachen und dann nach:
INITSTATICS
suchen.
Man sieht dann, den Projektpfad.
LG
Otto
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Projektpfad aus EXE ermitteln

Beitrag von HaPe »

Hallo Otto !
Memoread oder f_open funktioniert bei mir leider nicht.
Welcher Rückgabe-Code bzw. Fehler-Code kommt denn?
Was sagt FError()?
Zuletzt geändert von HaPe am Fr, 23. Feb 2018 14:01, insgesamt 1-mal geändert.
--
Hans-Peter
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von brandelh »

FOpen() kann JE Datei öffnen, solange genug Rechte auf dem Verzeichnis vorhanden sind.
Du schreibst deine Funktion anders, also könnte es eine spezielle Version sein, die eventuell die Parameter anders setzt.
FOpen( <cFilename>, [<nMode>]) --> nHandle

<nMode> ist ein ganzzahliger, numerischer Wert, der den Modus für den Dateizugriff spezifiziert. Der Standardwert ist 0, d.h. wenn <nMode> nicht angegeben ist, wird eine Datei im "Read-only" und "shared" Modus geöffnet. Für das Argument <nMode> sind in der Header-Datei "Fileio.ch" verschiedene symbolische Konstanten definiert, mit denen der Zugriffsmodus für eine Einzelplatz- oder eine Netzwerkanwendung spezifiziert werden kann.
bei der Standardversion wird Read-Only und shared geöffnet, somit sollte das auch auf einem Laufwerk funktionieren, bei dem die EXE läuft und das Schreibschutz hat.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von Tom »

Ich kann F_Open(), MemoRead() und FileStr() mit jeder beliebigen Datei veranstalten, wenn ich an sie rankomme. Das funktioniert auch bei EXEn, die über 100 MB groß sind.

Aber, mal ganz blöd gefragt: Was soll der "Projektpfad" sein, der irgendwo in der Nähe von "INITSTATICS" in der EXE steckt? Ich kann eine EXE ja in jedes beliebige Verzeichnis kopieren und dort starten, aber ihr Inhalt ändert sich dadurch nicht. Das wäre ja auch noch schöner. Ich finde allerdings bei DEBUG=yes Pfad und Name von PRG und OBJ (sonst nicht!), und bei direkt gelinktem Manifest alle darin enthaltenen Informationen. Anders gefragt: Wonach suchst Du?
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von brandelh »

Ich habe dieses Programm mal in der Workbench laufen lassen ...

Code: Alles auswählen

#include "Common.ch"
PROCEDURE Main
   LOCAL cExe, cBinBuffer, nError, cSuch
   /* we use the ansi charset by default */
   SET CHARSET TO ANSI

   SET ALTERNATE TO test.txt
   SET ALTERNATE ON

   cSuch := "INIT" + "STATICS"  // sonst wird es wegen diesem String gefunden
   cExe  := AppName(.T.)
   ?
   ? "Testprogramm: ",cExe
   ?
   ? "Versuche EXE zu öffenen ..."

   cBinBuffer := file2Str(cExe,,,@nError)

   ? "Ergebnis nError=",nError,"  Eingelesene Bytes: ",len(cBinBuffer)

   ? "Ist '"+cSuch+"' EXE vorhanden ? "

   IF cSuch $ upper(cBinBuffer)
      ? "JA, ab Byte", at(cSuch,cBinBuffer)
   ELSE
      ? "NEIN"
   END IF

   SET ALTERNATE OFF

   inkey(20)


   /* $TODO: place your application code here */
RETURN


*---------------------------------------------------------------------------------------------
FUNCTION File2Str(cFile,nStartPos,nLen,nError)      // memoread() könnte Umwandeln !!!
   LOCAL nHandle, cBuffer, nReadBytes,nSeekPos      // nError muss per Referenz übergeben werden
   cBuffer    := ""
   nReadBytes := 0
   DEFAULT nStartPos TO 1    // normalerweise will man ab dem 1. Zeichen.
   DEFAULT nLen      TO 0    // 0 steht für keine Begrenzung
   IF nStartPos < 1
      nStartPos := 1
   ENDIF
   nError  := 0              // 0 steht für keinen Fehler
   nHandle := FOpen(cFile)
   IF nHandle = -1
      nError := FError()
   ELSE
      IF nLen=0
         nLen := FSize( nHandle )
      ENDIF
      IF nStartPos > 1
         nSeekPos := FSeek( nHandle, nStartPos-1 )
         IF nSeekPos <> nStartPos-1
            nError := -2
         ENDIF
      ENDIF
      cBuffer    := space(nLen)
      nReadBytes := FRead( nHandle, @cBuffer, nLen)
      IF nReadBytes < nLen    // eventuell kein Fehler, sondern nur weniger Daten verf³gbar.
         nError := FError()
      ENDIF
   ENDIF
   FClose(nHandle)
RETURN left(cBuffer,nReadBytes)
das ist das Ergebnis:
Testprogramm: C:\Users\BRANDELH\Documents\Xbase++\Projects\test\Test.exe

Versuche EXE zu öffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 16384
Ist 'INITSTATICS' EXE vorhanden ?
JA, ab Byte 10997
also, es geht ganz einfach mit fOpen() oder meiner damit erstellten Funktion, die EXE Längen sollten auch kein Problem darstellen
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von brandelh »

OK, prüfen wir noch DEBUG=OFF ... EXE wird neu erstellt, direkt gestartet und ...
Testprogramm: C:\Users\BRANDELH\Documents\Xbase++\Projects\test\Test.exe

Versuche EXE zu ”ffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 14848
Ist 'INITSTATICS' EXE vorhanden ?
JA, ab Byte 10997
Es sind weniger Bytes, also wird was weg gelassen, aber die Sprungadresse auf INITSTATICS bleibt gleich.
Was man dort finden soll weiß ich aber auch nicht ...
Gruß
Hubert
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 483
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 11 Mal

Re: Projektpfad aus EXE ermitteln

Beitrag von azzo »

Hallo Hubert,
danke für deine Hilfe.
Ich habe deinen Code mit xHarbour kompiliert.
Ich musste nur SET CHARSET TO ANSI kommentieren und habe den Pfad zur gewünschten EXE fix eingegeben.
Hier erhalte ich keinen Treffer.
Könntest du mir bitte zum Testen eine EXE mit xBase geben. Vielleicht kannst du meinen Pfad eingeben.

Mit bestem Dank im Voraus,
Otto

Code: Alles auswählen

  LOCAL cExe, cBinBuffer, nError, cSuch
   /* we use the ansi charset by default */
//  SET CHARSET TO ANSI

   SET ALTERNATE TO test.txt
   SET ALTERNATE ON

   cSuch := "INIT" + "STATICS"  // sonst wird es wegen diesem String gefunden
   cExe  := "c:\xwinhotel\xZahlung.exe" //AppName(.T.)


Testprogramm: c:\xwinhotel\xZahlung.exe
Versuche EXE zu öffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 2075
Ist 'INITSTATICS' EXE vorhanden ?
NEIN
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 483
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 11 Mal

Re: Projektpfad aus EXE ermitteln

Beitrag von azzo »

Hallo Tom,
danke für deine Infos. Ich suche die prg-Datei , die die main Funktion der EXE enthält.

LG
Otto
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Projektpfad aus EXE ermitteln

Beitrag von AUGE_OHR »

Frage : über welche Xbase++ Version redet ihr :?:

ich habe das \SOURCE\samples\ Verzeichnis mit TC nach *.EXE und Text = "INITSTATICS" und "DEBUG" durchsucht und nichts gefunden :shock:
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von brandelh »

Jimmy,

ich habe das mal mit 2 normalen EXE Dateien auspropiert und kann dir nur Zustimmen, warum mein anderes Beispiel etwas gefunden hat ... vermutlich den Suchbegriff selbst
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von brandelh »

So ich habe mein Programm angepasst, damit der String nicht aus dem Quellcode direkt in der EXE landet und siehe da ... den gibt es gar nicht ;-)

Code: Alles auswählen

#include "Common.ch"
PROCEDURE Main
   LOCAL cExe, cBinBuffer, nError, cSuch1, cSuch2, cSuch
   /* we use the ansi charset by default */
   //   SET CHARSET TO ANSI

   SET ALTERNATE TO test.txt
   SET ALTERNATE ON

   cSuch1 := "IniT"     // sonst wird es wegen diesem String gefunden
   cSuch2 := "STaTICS"  // sonst wird es wegen diesem String gefunden
   cSuch  := upper(rtrim(ltrim(cSuch1)-ltrim(cSuch2)))
   // cExe  := AppName(.T.)
   cExe  := "c:\xwinhotel\xZahlung.exe" //AppName(.T.)
   ?
   ? "Testprogramm: ",cExe
   ?
   ? "Versuche EXE zu öffenen ..."

   cBinBuffer := file2Str(cExe,,,@nError)

   ? "Ergebnis nError=",nError,"  Eingelesene Bytes: ",len(cBinBuffer)

   ? "Ist '"+cSuch+"' in EXE vorhanden ? "

   IF cSuch1 $ upper(cBinBuffer)
      ? "JA, ab Byte", at(cSuch,cBinBuffer)
   ELSE
      ? "NEIN"
   END IF

   SET ALTERNATE OFF

   inkey(20)


   /* $TODO: place your application code here */
RETURN


*---------------------------------------------------------------------------------------------
FUNCTION File2Str(cFile,nStartPos,nLen,nError)      // memoread() könnte Umwandeln !!!
   LOCAL nHandle, cBuffer, nReadBytes,nSeekPos      // nError muss per Referenz übergeben werden
   cBuffer    := ""
   nReadBytes := 0
   DEFAULT nStartPos TO 1    // normalerweise will man ab dem 1. Zeichen.
   DEFAULT nLen      TO 0    // 0 steht für keine Begrenzung
   IF nStartPos < 1
      nStartPos := 1
   ENDIF
   nError  := 0              // 0 steht für keinen Fehler
   nHandle := FOpen(cFile)
   IF nHandle = -1
      nError := FError()
   ELSE
      IF nLen=0
         nLen := FSize( nHandle )
      ENDIF
      IF nStartPos > 1
         nSeekPos := FSeek( nHandle, nStartPos-1 )
         IF nSeekPos <> nStartPos-1
            nError := -2
         ENDIF
      ENDIF
      cBuffer    := space(nLen)
      nReadBytes := FRead( nHandle, @cBuffer, nLen)
      IF nReadBytes < nLen    // eventuell kein Fehler, sondern nur weniger Daten verf³gbar.
         nError := FError()
      ENDIF
   ENDIF
   FClose(nHandle)
RETURN left(cBuffer,nReadBytes)
Ergebnis in test.txt:

Testprogramm: c:\xwinhotel\xZahlung.exe
Versuche EXE zu öffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 10752
Ist 'INITSTATICS' in EXE vorhanden ?
NEIN
Diese Variable wird nicht von Xbase++ selbst gesetzt ... versuchen wir es noch mit DEBUG=YES ...


Testprogramm: c:\xwinhotel\xZahlung.exe
Versuche EXE zu öffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 11776
Ist 'INITSTATICS' in EXE vorhanden ?
NEIN
Wichtig an der Geschichte ist aber, dass fOpen() die EXE fehlerfrei öffnet (nError=0 bedeutet KEIN Fehler) und meine Funktion die Datei in einen String lädt.
Gruß
Hubert
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 483
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 11 Mal

Re: Projektpfad aus EXE ermitteln

Beitrag von azzo »

Hallo Hubert,
auch hier wird mit fOpen() die Datei geöffnet. Aber leider wird nach einigen Bytes dann der Lesevorgang abgebrochen.
LG
Otto
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Projektpfad aus EXE ermitteln

Beitrag von georg »

Hallo, Otto -


wie liest Du, verwendest Du fRead() oder fReadStr()?

fReadStr() hört auf, wenn ein Chr(0) gelesen wird, und das hört sich nach Deinem Problem an.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 483
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 11 Mal

Re: Projektpfad aus EXE ermitteln

Beitrag von azzo »

Hallo Georg,
danke für deine Hilfe und den Hinweis Chr(0).

Genau das war mein Problem.

Ich habe mir immer nur
cBuf := MEMOREAD( cExe )
angeschaut und anzeigen lassen.
Hier wird dann nach dem ersten CHR(0) einfach abgeschnitten.
Anbei die Funktion die bei mir nun funktioniert.
Die Funktion liefert den Pfad des prg Files - file in dem die main -Funktion enthalten ist - der EXE zurück.
Die Funktion dürfte 1:1 auch mit xBase funktionieren.
LG
Otto


Code: Alles auswählen

function PrjPath( cExe )

   local cBuf, nAt

   if Empty( cExe )
      return nil
   endif

   cBuf  := MEMOREAD( cExe )
   cBuf  := AfterAtNum( "(_INITSTATICS", cBuf, 1 )
   cBuf  := AfterAtNum( Chr( 0 ), cBuf, 1 )
   cBuf  := BeforAtNum( Chr( 0 ), cBuf, 1 )

return cBuf

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von brandelh »

Und wieder einmal zeigt es sich, dass es NICHT egal ist mit welchem Clipper Nachfolger man arbeitet !

1. EXE von Xbase++ oder auch PowerBasic enthalten kein Schlüsselwort INITSTATICS, das habe ich jetzt bei 5 EXE Dateien mit HEX-Editor überprüft.

2. MemoRead() aus Xbase++ liest eine BIN Datei (also auch jede EXE) komplett ein, egal ob chr(0) oder sonstwas drin enthalten ist; wobei ich nicht auf chr(26) getestet habe.

Hier die Ausgabe eines Abwandelten Xbase++ Test Programmes (einmal mit memoedit(), das zweite mal mit meiner file2str() Funktion):
Versuche EXE zu öffenen, MemoEdit() ...
Ergebnis Eingelesene Bytes: 15360
Versuche EXE zu öffenen, File2Str() ...
Ergebnis nError= 0 Eingelesene Bytes: 15360
Ist 'IniTStaTICS' EXE vorhanden ?
NEIN
(x)Harbour übersetzt ja RRG Code nach C-Code und ein C-Compiler übersetzt das dann.
Für C-Compiler Funktionen ist es normal bei chr(0) nicht mehr weiter zu lesen.

Alaska hat bei Xbase++ beide Verhaltensweisen ...

Memoread() liest alles, aber fReadStr() hört auch bei chr(0) auf.
Dennoch, Memoread() sollte laut Alaska nicht verwendet werden, da es eigentlich eine Text-Funktion ist, EXE Dateien etc. sind aber Binär-Daten.
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Projektpfad aus EXE ermitteln

Beitrag von ramses »

Hallo Hubert

bist du dir mit Harbour sicher?
Meine Version die ich unter FreeBSD verwende übersetzt PRG's in Pseudo-Code und das Runtime-Modul arbeitet diese dann ab.

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von brandelh »

Ich ging davon aus, dass das von AZZO beschriebene Verhalten von Memoedit() unter xHarbour beobachtet wurde.

Da könnte ich mich aber auch täuschen. Wie die Runtime das dann umsetzt weiß ich auch nicht, aber dass C-Funktionen normalerweise chr(0) als Ende des Strings interpretieren stimmt.
Wenn man das anders machen möchte, muss man die "Strings" als Array of Byte behandeln und dann geht das auch mit den chr(0) im Datenstrom, sonst wäre eine Verarbeitung von Binär-Daten ja nicht möglich.
Aber um es deutlich zu sagen, meine C-Kenntnisse beschränken sich auf das Lesen von Parameter Aufrufen für meine DLL Libs ;-)

Was ich eigentlich nur sagen wollte ist:

Wenn man wie in diesem Thread (zudem unter Allgemein !) ein (Fehl-)Verhalten schildert und eben NICHT Xbase++ nutzt, bitte dazu schreiben soll, dass es um XYZ Compiler geht.
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Projektpfad aus EXE ermitteln

Beitrag von ramses »

Hallo Otto

du könntest doch mit dem Texteditor eine "File Suche" in den prg's in deinen Verzeichnisen und Unterverzeichnisen suchen. z.B. nach " main" Multiedit liefert dir dann alle Dateien im gewählten Verzeichnisbaum die " main" enthalten.

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 483
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 11 Mal

Re: Projektpfad aus EXE ermitteln

Beitrag von azzo »

Hallo Carlo,
ich habe schon weiter oben gepostet, dass ich dank eurer Hilfe das Problem lösen konnte.
Danke nochmals an alle.
LG
Otto

Hallo Georg,
danke für deine Hilfe und den Hinweis Chr(0).

Genau das war mein Problem.

Ich habe mir immer nur
cBuf := MEMOREAD( cExe )
angeschaut und anzeigen lassen.
Hier wird dann nach dem ersten CHR(0) einfach abgeschnitten.
Anbei die Funktion die bei mir nun funktioniert.
Die Funktion liefert den Pfad des prg Files - file in dem die main -Funktion enthalten ist - der EXE zurück.
Die Funktion dürfte 1:1 auch mit xBase funktionieren.
LG
Otto

Code: Alles auswählen

function PrjPath( cExe )

   local cBuf, nAt

   if Empty( cExe )
      return nil
   endif

   cBuf  := MEMOREAD( cExe )
   cBuf  := AfterAtNum( "(_INITSTATICS", cBuf, 1 )
   cBuf  := AfterAtNum( Chr( 0 ), cBuf, 1 )
   cBuf  := BeforAtNum( Chr( 0 ), cBuf, 1 )

return cBuf

Antworten