Kompiliertes Programm nachträglich verändern?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Thalius
Beiträge: 476
Registriert: 17.02.2005 16:17
Wohnort: Basel / Schweiz

Beitrag von Thalius »

xperience2003 's Tip ist wohl der einfachste.

anonsten gibts da die DataSection (in die du auch zb. per IncludeBInary zeug anhängen kannst). Um das ganze zu verändern etc gibts im CodeArchiv genug Beispiele:

Siehe zb. hier:
http://www.purearea.net/pb/CodeArchiv/O ... difying.pb

Thalius
"...smoking hash-tables until until you run out of memory." :P
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ich hab mal schnell ein Beispiel für dich gemacht, wie ich es machen
würde:

Zuerst der Source für die inkludierte EXE. Einfach zu "Programm.exe"
kompilieren.

Code: Alles auswählen

Procedure.s GetText()
  Protected FileID.l, Size.l, length.l, Text.s
  
  FileID = ReadFile(#PB_Any, ProgramFilename())
  If FileID
    Size = Lof(FileID) - 4
    FileSeek(FileID, Size)
    length = ReadLong(FileID)
    FileSeek(FileID, Size - length - 1)
    Text = ReadString(FileID, #PB_Ascii)
    CloseFile(FileID)
  EndIf
  
  ProcedureReturn Text
EndProcedure

Define Text.s

Text = GetText()

If OpenWindow(0, 0, 0, 400, 300, Text, #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
  CloseWindow(0)
EndIf
Und jetzt der Source zum Hauptprogramm, das die "Programm.exe"
inkludiert. Wenn die "Programm.exe" existiert, einfach mal ausführen.

Code: Alles auswählen

Define Text.s, a.l, Path.s

Text = InputRequester("Titel", "Was soll in der Titelzeile stehen?", "Irgendwas")
If Text = "" : End : EndIf

Path = GetPathPart(ProgramFilename())

a = 1
While FileSize(Path + "Programm_" + Str(a) + ".exe") >= 0
  a + 1
Wend
Path + "Programm_" + Str(a) + ".exe"
If CreateFile(0, Path)
  WriteData(0, ?Program_Start, ?Program_End - ?Program_Start) ;EXE schreiben
  WriteString(0, Text, #PB_Ascii)      ;Text schreiben
  WriteByte(0, 0)
  WriteLong(0, Len(Text))   ;Textlänge schreiben
  CloseFile(0)
EndIf

RunProgram(Path)

DataSection
  Program_Start:
    IncludeBinary "Programm.exe"
  Program_End:
EndDataSection
Ich habe jetzt nichts kommentiert. Aber da der Source so kurz ist, sollte es
leicht verständlich sein.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

hab auch was gebaut.
funktioniert so, wie xperience2003 es erklärt hat.

als "myexe.exe" compilieren
das programm gibt auf der console "8" aus.

Code: Alles auswählen

OpenConsole()
Read label.s
Read n
Print(Str(n))
Input()

DataSection
  Data.s "++LABEL++"
  Data.l 8
EndDataSection
und das hier als irgendwas im selben ordener kompilieren.
jedesmal wenn es ausgeführt wird, wird die datasection von myexe.exe manipuliert, sodass myexe.exe nicxht mehr "8", sondern "9", "10", und so weiter ausgibt

Code: Alles auswählen

labelname.s = "++LABEL++"

OpenFile(0,"myexe.exe")
  While Not Eof(0)
    b=ReadByte(0)
    found=1
    For i=1 To Len(labelname)
      If Not (Chr(b) = Mid(labelname,i,1))
        found=0
        Break
      EndIf
      b=ReadByte(0)
    Next
    If found
      pos=Loc(0)
      n=ReadLong(0)
      FileSeek(0,pos)
      WriteLong(0,n+1)
    EndIf
  Wend
CloseFile(0)
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

Danke, besonders das letzte Beispiel war ziemlich einfach. :allright:
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Antworten