Java Class Laden um einen String daraus zu matchen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Java Class Laden um einen String daraus zu matchen

Beitrag von Bauer321 »

hi, ich würde gerne eine Java Klasse in einen String laden und via RegEx bestimmte Zeichenfolgen matchen.

Code: Alles auswählen

procedure xyz();
var
  s: TStringList;
  a: String;
  x: Integer;
begin
  s := TStringList.Create();
  s.LoadFromFile('minecraft.class');
  for x := 0 to s.Count-1 do
    begin
      a := a+s[x];
    end;
  s.Free;
end;
wenn ich das ganze jetzt noch in ein Memo ausgebe sehe ich nur "??"

wie muss ich vorgehen?
-> ich habe die klasse mal angehangen (ist einfach ein .txt als endung, damit ich sie hochladen konnte) -> Notepad 2 z.B. kann die Datei öffnen und zeigt mit den bytecode mit dem ich nichts anfangen kann und eben auch einige Strings die man lesen kann z.B.: Minecraft Minecraft 1.3. Die will ich finden um die Version feststellen zu können. Finden tue ich sie via RegEx, dazu muss ich aber erstmal die datei laden, was so noch nicht funktioniert
Dateianhänge
Minecraft.class.txt
(34.28 KiB) 71-mal heruntergeladen
www.mcpatcher.net | www.hoeper.me

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Java Class Laden um einen String daraus zu matchen

Beitrag von m.fuchs »

.class-Dateien sind kompilierte ByteCode-Dateien. Da wäre ein Laden als Textdatei nicht unbedingt das Mittel meiner Wahl. Schnapp dir den String den du suchen willst, ermittele den Wert als Byte-Array und suche dann in der Datei auf diese Art und Weise. Ein Hexeditor dürfte dir zur Analyse nützlich sein.

Und eine Übersicht über den Aufbau der .class-Dateien findest du hier: http://en.wikipedia.org/wiki/Java_class_file" onclick="window.open(this.href);return false;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Java Class Laden um einen String daraus zu matchen

Beitrag von Bauer321 »

kann ich denn dann via RegEx suchen und den gefunden String/die gefundenen Bytes abrufen und als String ausgeben?
Es geht darum die Version aus einer Java Klasse zu extrahieren, um die Version eines Programms herauszufinden.
www.mcpatcher.net | www.hoeper.me

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Java Class Laden um einen String daraus zu matchen

Beitrag von mschnell »

Bauer321 hat geschrieben:Es geht darum die Version aus einer Java Klasse zu extrahieren, um die Version eines Programms herauszufinden.
Wir machen das in einem Projekt, das den Objekt-Code irgendeiner CPU auf einer embedded Platin verwaltet so, dass solche Informationen entweder an einer fest vorgegebenen Stelle stehen (das geht bei Java Bytecode vermutlich nicht), oder dass die variablen Informationen in konstante findbare Strings eingebettet sind.

Wenn Du in Java einen String ">>>>Version====12345<<<<<" definierst, wäre es denkbar, dass du den kompletten Byte-Code (mit TFilstream.Read und Start-Position auf myString[1]) einen String einlesen kannst und dann mit pos() das ">>>>Version====" findest. Kommt aber natürlich darauf an, wie Java die String-Konstanten codiert. In jedem Fall nur 7-Bit ASCII-Zeichen verwenden !.

-Michael

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Java Class Laden um einen String daraus zu matchen

Beitrag von Bauer321 »

Danke, ich werde mich gleich mal dran versuchen, werde aber vermutlich gleich noch weitere Fragen diesbezüglich haben.

- Sven
www.mcpatcher.net | www.hoeper.me

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Java Class Laden um einen String daraus zu matchen

Beitrag von Bauer321 »

Also es scheitert jetzt daran, das ich überhaupt nicht weiß, wie ich die Bytes, die ich dann lese in einen String umwandeln soll (bestehend aus 7-Bit ASCII-Zeichen, soweit ich das verstehe). -> muss ich vom meinem Stream jetzt immer 7-bit lesen und in einen Char umwandeln?
Zudem müsste ich ja den String welcher aus 7-Bit ASCII-Zeichen besteht in einen UTF8 String (oder Ansi???) umwandeln um in die richtig ausgeben zu können.

Wie ich den TStream generell nutze habe ich aus dem Wiki: http://wiki.freepascal.org/File_Handlin ... nary_files" onclick="window.open(this.href);return false;

Code: Alles auswählen

procedure xyz();
var
  a: String;
  TotalBytesRead, BytesRead : Int64;
  Buffer : array [0..4095] of byte;
  FileStream : TFileStream;  
begin
  try
    FileStream := TFileStream.Create('minecraft.class', fmOpenRead);
 
    FileStream.Position := 0;
    Memo1.Lines.EndUpdate;
    while TotalBytesRead <= FileStream.Size do
    begin
      BytesRead := FileStream.Read(Buffer,sizeof(Buffer));
      inc(TotalBytesRead, BytesRead);
 
      a := a + chr(BytesRead); //geht nicht, eine andere, was ich mit den bytes machen könnte habe ich erstmal auch nicht :/
      Memo1.Lines.Add(a);
    end;
    Memo1.Lines.EndUpdate;
    FileStream.Free;
  except
    Memo1.Lines.Add('error while reading file minecraft.class');
  end;
end;
Zitat: (mit TFilstream.Read und Start-Position auf myString[1])
Das verstehe ich nicht, wieso auf myString[1]?

- Sven
www.mcpatcher.net | www.hoeper.me

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Java Class Laden um einen String daraus zu matchen

Beitrag von mschnell »

Bauer321 hat geschrieben:Also es scheitert jetzt daran, das ich überhaupt nicht weiß, wie ich die Bytes, die ich dann lese in einen String umwandeln soll
Gar nicht. Entweder steht Deine String-Konstante im Bytrestran drin, dann OK, oder Java Bytecode macht da irgendwas spezielles, dann schlecht.

-Michael

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Java Class Laden um einen String daraus zu matchen

Beitrag von mschnell »

TFileStream.Read bekommt als "Puffer" das die Speicherzelle, wo die Information hingelesen werden soll. Das ist MyString[1]. Vorher muss der String aber mit SetLength() groß genug angelegt sein, um alles fassen zu können !

-Michael

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Java Class Laden um einen String daraus zu matchen

Beitrag von Bauer321 »

für a bekomme ich dann z.B. solche Werte: 0x2c1738 #202#163#146#255#183#135'r'#255'd5 '#193, allerdings kann ich - warum auch immer - in der while schleife keinen Breakpoint setzen :/

mit diesem Code versuche ich es momentan:

Code: Alles auswählen

var
  s: TStringList;
  re: TRegExpr;
  a: String;
  x: Integer;
  TotalBytesRead, BytesRead : Int64;
  Buffer : array [0..4095] of Byte;
  FileStream : TFileStream;   
 
 
  try
    FileStream := TFileStream.Create('minecraft.class', fmOpenRead);
 
    s := TStringList.Create();
    FileStream.Position := 0;
    SetLength(a, 5000); //welche Größe muss a denn haben haben? - 4096?
    while TotalBytesRead <= FileStream.Size do
    begin
      BytesRead := FileStream.Read(a, sizeof(a));
      inc(TotalBytesRead, BytesRead);
 
      try
        s.Append(a);
      except
        s.Append('NULL');
      end;
    end;
 
    Memo1.Lines := s;
    Memo1.Lines.Add(IntToStr(s.Count));
    FileStream.Free;
    s.Free;
  except
    Memo1.Lines.Add('error while reading file minecraft.class');
  end;
in meinem Memo ist am ende nicht zu sehen, außer eine 0.#

es muss aber auf jeden Fall gehen, denn wenn ich die Datei mit diesem Programm öffne: http://www.flos-freeware.ch/notepad2.html" onclick="window.open(this.href);return false; dann sind einige Strings und eben auch die, welche ich suche lesbar.
www.mcpatcher.net | www.hoeper.me

Antworten