Win32 App, Ressource ändern

GlockMane88

Lt. Commander
Registriert
Aug. 2008
Beiträge
1.244
Hey Leute,

ich habe ein sehr spezielle Problem mit einer Messsoftware.

Und zwar zeigt es mir in der Leiste ganz unten (siehe blauer Pfeil) eine Zahl an, welche ich gerne ausblenden würde.

Die Zahl ist eine Werkzeug-Nr.. Wir benutzen das Messgerät aber seit Jahren mit einer anderen Software, welche auch weiterhin parallel betrieben wird und dort beginnt die Nummerierung mit 1, in der dargestellten Software mit 0.. Außerdem sind die Werkzeugplätze in der Realität auch mit 1-9 gekennzeichnet. Nun könnte man sagen, ist doch kein großes Problem, aber das Messgerät wird von vielen Mitarbeitern genutzt und diese sind alle die Nummerierung von 1-9 gewohnt. Nun kann ich die Werkzeuge auch in der neuen Software auf 1-9 umbenennen, doch an dieser einen Stelle nimmt er anscheinend nicht den eingegebenen String sondern nummeriert einfach ab 0.. Im Feld daneben könnte ich die korrekte Nr. mit einbringen (als Suffix), da diese auf jeden Fall sichtbar sein muss.. Aber dann stehen halt aktuell zwei Nummern nebeneinander, was auch verwirrt.. Das Ganze ist immens wichtig, der Benutzer denken könnte, dass alles in Ordnung ist (die tatsächliche Werkzeugnummer 3 stimmt mit der Anzeige 3 überein, aber im Programm ist stattdessen Werkzeug 4 eingewechselt und dann kracht beim Messen oder beim nächsten Werkzeugwechsel.

Der Software Hersteller wird es leider nicht anpassen und so habe ich überlegt, ob man das ganze mit dem Ressource Hacker ändern könnte.. Habe in verschiedenen DLLs auch allerhand Menüs gefunden, aber diese Leiste leider nicht.. Habt ihr eine Idee?

1692635435820.png
 
Mit was ist die Anwendung denn entwickelt wurden?
C++, Delphi, .NET

Mithilfe von Detect it Easy sollte das beim analysieren der Executable ersichtlich sein.
Zu finden unter > https://github.com/horsicq/DIE-engine/releases

Ungeachtet dessen, ist es aber möglich, dass die Anwendung bei Modifizierung der Executable oder einer DLL dann den Dienst verweigert. Beliebt sind u.a. CRC-Checks die die Integrität der Anwendung sicherstellen sollen.

P.S. Ressource Hacking ist bereits "illegal". Da unter Einsatz der Software ja augenscheinlich Geld verdient wird, wiegt es doppelt schwer.
 
@Zer0DEV

Ich verstehe deinen Einwand, allerdings geht es hier nicht um die Umgehung irgendeiner Sicherheit oder Freischaltung von Funktionen.. Es geht um einen speziellen Fall, indem eine angezeigte Zahl zu Verwirrung oder im schlimmsten Fall zu einer teuren Beschädigung der Maschine führen kann.

1692636905958.png
 
@GlockMane88 Es geht mir nicht um die Umgehung von Lizenzierungsmechanismen (Freischaltung). Hintergrund ist halt, dass der Hersteller/Entwickler es so vorgesehen hat und man hat sich dazu entschieden das Produkt irgendwann zu kaufen (ggfs. mit Support). Der Entwickler, wie Du ja auch schreibst, wird das ja nicht anpassen. Entsprechend gehe ich davon aus, dass Du/Ihr das bei ihm angefragt habt, möglicherweise auch unter dem Gesichtspunkt ihm dafür Geld zu geben...

Lange Rede kurzer Sinn:
Ressource Hacker (http://www.angusj.com/resourcehacker/) scheinst Du ja zu kennen.
Wenn Du eine Executable, DLL oder ggfs. auch andere Datei damit öffnest und muss es mindestens die Sektion "DIALOG" geben. Da kann man dann die Dialoge anpassen. Wenn man die bearbeitete Datei dann speichert, kann es aber eben sein, dass das Programm nicht nicht mehr startet.
 
@Zer0DEV

Wie gesagt, unser Fall ist wahrscheinlich zu speziell und ich würde auch einfach die Beschriftung an unserem Rack ändern und die Nummerierung in der anderen Software, aber dann müsste ich diese in bestimmt 200 Programmen für x-Werkzeuge ändern und dann bekomme ich das aus den Köpfen von einigen Mitarbeitern immernoch nicht heraus..

Mit dem ResHacker habe ich bereits alle DLLs und die EXE hinsichtlich Dialogen durchgeklickt und auch alles mögliche gefunden, aber die Leiste irgendwie nicht..

Hatte auch gehofft, es gibt vielleicht ein Tool mit welchem ich bei geöffnetem Programm über die Stelle hovern kann und er verrät mir Informationen, die mir beim Suchen des Elements helfen..
 
Du kannst mit einem Debugger, bspw. mit x64dbg (https://x64dbg.com/) das Programm möglicherweise öffnen. Sofern das Programm es zulässt, dass es in x64dbg gestartet werden kann, wäre es möglich etwaige geladene Librarys (Bibliotheken) zu sehen und/oder gar die Anzeige zu "patchen" das anstelle von 0 mit 1 begonnen wird.

Es gibt auch ein Tool womit man beim daraufziehen eines Fadenkreuzes sich Informationen zum Dialog anzeigen kann, komme nur gerade nicht auf den Namen. Bin mir aber fast sicher, dass das nur Infos zum gesamten Dialog, aber nicht zu Teilen im Dialog anzeigen kann.
Ergänzung ()

@GlockMane88 Habe das Tool in meinem Fundus entdeckt > https://github.com/AlexanderPro/WindowTextExtractor

Eventuell zeigt er was an, was dich weiterbringt
 
Zuletzt bearbeitet:
Sowas kann grundsätzlich auch "von außen" korrigiert werden, ohne auch nur 1 Byte der Original-EXE zu verändern.

Mit Tools wie z.B. dem in Microsoft Visual Studio enthaltene Spy++ kann man sich Infos zu Fenstern laufender Prozesse sowie darin enthaltener Elemente anzeigen lassen oder gar interaktiv drauf zeigen. Gerade bei alten Win32 Tools hat man gute Chancen, dass man so an die Fensterklassen und Element-IDs oder zumindest die aktuellen Windows-Handles kommt.

Bewaffnet mit diesen Infos könnte man ein "Begleitprogramm" schreiben, dass immer mitgestartet wird bzw. permanent nach dem geöffneten Programm sucht. Es könnte dann das Fenster (FindWindow API) und das betreffende Gui-Element suchen (im einfachsten Fall per GetDlgItem, im Zweifel über die Koordinaten), den aktuellen Text auslesen (GetWindowText, GetDlgItemText etc...) und auch auf korrigierte Werte verändern (SetWindowText, SetDlgItemText etc.).

Was man dabei in den Griff bekommen müsste ist, sich zu merken, ob man den derzeit angezeigten Wert schon um 1 erhöht hat oder nicht. Problematisch wäre es, wenn das Ziel-Programm den zur Laufzeit nochmal ändert. Beispiel: Zu Beginn hat das Begleitprogramm im Feld eine 0 gefunden, und auf 1 korrigiert. Sollte das Zielprogramm das Feld irgendwann auf 2 setzen, könnte das Begleitprogramm erkennen "oh, die 2 ist nicht von mir, mache ich mal ne 3 draus". Wenn das Zielprogramm die Zahl aber nicht auf 2, sondern auf 1 "ändert" (es weiß ja vermutlich nix von der externen Änderung), würde das Begleitprogramm gar nicht feststellen können, dass es die 1 nun auf 2 erhöhen müsste. Ein netter Kniff wäre ggf. aus der "0" eine "01" zu machen, aus einer "1" eine "02" usw. - dann wären einstellige Werte immer vom Zielprogramm und zweistellige immer vom Begleitprogramm...

Auch problematisch wäre, falls das Zielprogramm den Wert aus der Gui an manchen Stellen zurück liest und dann mit dem veränderten Wert falsche Dinge tut. Das wäre aber an sich schlechtes Programmdesign und hoffentlich so nicht vorhanden...
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: kuddlmuddl
@Zer0DEV

Danke dir, werde ich mir anschauen!

@Purche

Gute Idee, leider ändert sich der Wert immer mal wieder zur Laufzeit, deshalb wäre es mir lieber, entweder ein Offset setzen zu können (Idealfall) oder diesen ganz auszublenden. Letzteres könnte man vielleicht auch über ein Overlay realisieren, welches die Zahl mit einem Bild überdeckt? Allerdings müsste das immer an der richtigen Position sitzen, was ich mir dann wieder schwierig vorstelle, oder man geht davon aus, dass das Programm eh in 95% der Fälle maximiert ausgeführt wird..
 
Statt überdecken könnte man das Element vermutlich auch ausblenden (ShowWindow auf das Element mit Parameter SW_HIDE)
 
  • Gefällt mir
Reaktionen: kuddlmuddl
Habe einen anderen Ansatz gefunden. Ich erstelle einfach ein weiteres Werkzeugrack in der Software (welches in Wirklichkeit nicht existiert) und ein Dummy Werkzeug, dieses bekommt dann die Nummer 0.. Da ich die 0 aber auch brauche als Referenz lege ich das neue Rack genau über das vorhandene, sodass ich Werkzeug 0 oder Werkzeug 1 anwählen kann und er holt in wirklichkeit das selbe Werkzeug..
 
Zurück
Oben