Suche Helfer und Lehrer zur Bewältigung von Hobbyprojekt



  • kann es sein dass die limitierung vom treiber eigentlich eine limitierung vom midi port ist und dort nicht alle daten/buttons auf einmal uebertragen werden koennen?

    wenn du schon soviel geld investiert hast, kannst du die firma in die du investiert hast nicht ueber den support nett fragen, ob sie dir nicht dabei helfen koennten?
    vielleicht bist du nicht der erste und einzige mit dem problem und sie haben schon eine loesung.
    vielleicht freuen sie sich ueber das feedback, weil sie das als feature in ihre software verbauen koennten.
    vielleicht ist die loesung viel einfach aus sicht der entwickler, als aus der reverse engineering/hacking sicht.

    btw. wenn du nur 'klicks' usw. an eine UI schicken willst, geht das viel einfacher und stabiler mit http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspx
    einfach nur process memory zu mappen und daten zu aendern heisst naemlich noch lange nicht dass die software etwas damit anfaengt, die weiss ja nicht dass sich daten veraendert haben und schickt diese vermutlich nicht auf blauen dunst ueber die schnittstelle an die hardware. aber die software verarbeitet messages, denn so funktioniert windows, all deine klicks usw. kommen als eben solche an. du kannst mit sendmessage eben diese simulieren und die software verarbeitet solche messages so schnell wie sie das eben kann.



  • Genau du hast das wohl falsch verstanden. Die Hardware soll die Software steuern, da die Software auch eins von den besten Herstellen in Sachen Lichtbedienung sind.
    Vor mir haben das auch schon andere geschafft.
    Ich habe mich dem dem ganzen ein wenig auseinander gesetzt, jedoch die Werte Im Prozess der Software zu finden schaffe ich nicht. Vereinzelnd habe ich es geschafft bereits Fader zu bewegen, jedoch bewegten sich immer mehrere gleichzeitig. Vielleicht habe auch nicht ganz die Logik dafür das zu verstehen.

    Ich habe in der Berufsschule viel C gelernt, jedoch fast nur auf Mikrocontroller-Basis.



  • Hat denn diese Software irgend ein Interface für externe Steuerpulte?
    Du hast ja was von MIDI geschrieben, also müsste es nicht reichen ein MIDI Device zu emulieren?

    Irgendwie kann ich mir nicht vorstellen dass die anderen Programme die das machen alle über WriteProcessMemory zugreifen. Es sei denn das Programm würde extra eine über WriteProcessMemory bedienbare Schnittstelle anbieten. Sowas wäre komisch, aber es wäre zumindest denkbar damit eine stabil funktionierende Kommunikation zu bewerkstelligen.

    Vielleicht solltest du mal den Code posten mit dem du momentan arbeitest, und es bereits geschafft hast irgendwas in dem Programm zu bewegen. Dann könnten wir vermutlich besser einschätzen was da abgeht. Vielleicht ist das Unterfangen ja gar nicht so aussichtslos.



  • Die Lichtsoftware kann max. 72 Midi Werte verwalten und nur auf einen Channel. Zudem müsste ich sobald ich eine Änderung mache die jewalige Taste neu zuordnen.

    Code schnibsel kann ich nicht anbieten, da ich zu den Leuten die schon mal das gleiche Projekt gebaut haben (Von denen es nur sehr wenige gibt) keinen Kontakt aufbauen kann.

    Jedoch habe ich es heute morgen geschafft in der Berufsschule die ersten 4 Fader bewegen zu können durch einen 4-Byte Hex-Wert:

    int main() {
    
      HWND hWnd = FindWindow(0, "grandMA onPC");
    
      if(hWnd == 0){
    
        MessageBox(0, "Error cannot find window.", "Error", MB_OK|MB_ICONERROR);
    
      } else {
    
        DWORD proccess_ID;
    
        GetWindowThreadProcessId(hWnd, &proccess_ID);
    
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proccess_ID);
    
        if(!hProcess){
    
          MessageBox(0, "Could not open the process!", "Error!", MB_OK|MB_ICONERROR);
    
        } else {
    
    int newdata = 0x00000000;
          DWORD newdatasize = sizeof(newdata);
    
          for(newdata=0x00000000;newdata<0x000000FF;newdata += 0x00000001){
          DWORD newdatasize = sizeof(newdata);
    
          if(WriteProcessMemory(hProcess, (LPVOID)0x66B3B67C, &newdata, newdatasize, NULL)){
    
            //MessageBox(NULL, CHAR(newdata), "Success", MB_OK + MB_ICONINFORMATION);
    
          } else {
    
            MessageBox(NULL, "Error cannot WriteProcessMemory!", "Error", MB_OK + MB_ICONERROR);
            newdata = 0x000000FF;
          }
    
          Sleep(10);
    
    }
    
    CloseHandle(hProcess);
    
        }
    
      }
    
      return 0;
    
    }
    

    Hier steht das erste Byte des newdata für den Wert des ersten Fader, das zweite Byte für den zweiten Fader und das geht in 4er Gruppen so weiter.

    Zudem zählt das kleine Programm den Fader einmal komplett hoch.



  • Wo hast du die Adresse 0x66B3B67C her?
    Und wo hast du überhaupt die Info her dass das Ding auf diese Art gesteuert werden kann? Da wo diese Info her ist, sollte es noch mehr geben. Lass dir nicht alles aus der Nase ziehen.

    Und davon abgesehen: hast du jetzt schonmal beim Hersteller angefragt ob die ein Plugin Interface haben? Oder externe Geräte über irgendwelche standardisierten Schnittstellen unterstützen?



  • Der Hersteller selber bietet keine Plugins an, wieso auch, da das Original Lichtpult fast 15.000€ kostet und die wollen ja auch verdienen 😃

    Jemand anderes hat wohl aus dem MidiBox Projekt sich dieses Lichtpult nachgebaut. Dort in den Kommentaren steht, dass er die komplette Steuerung wohl mit Write-/Readprocessmemory realisiert hat.

    Die Adresse selber habe ich mit dem Programm Cheat Engine rausgesucht und habe auch lange dafür gebraucht oder ich war einfach nur zwischenzeitlich blind. Habe nun alle 20 Fader zusammen, jedoch fehlen noch 3 die ich bis jetzt nicht finden konnte, genau so wie alle Buttons. Für die 20 Fader habe ich auch die passenden Rückgabewerte, da es ja Motorfader sind, somit könnte ich ein MidiOut für die Fader realisieren.



  • rhino-du schrieb:

    Die Lichtsoftware kann max. 72 Midi Werte verwalten und nur auf einen Channel. Zudem müsste ich sobald ich eine Änderung mache die jewalige Taste neu zuordnen.

    Erklär mal genauer. Was ist das konkrete Problem mit Midi? Und wie meinst du das mit dem neu zuordnen?

    rhino-du schrieb:

    Dort in den Kommentaren steht, dass er die komplette Steuerung wohl mit Write-/Readprocessmemory realisiert hat.

    Link?

    Wenn du willst, guck ich mal (per Teamviewer zB) rüber und suche die Werte (oder du schickst mir das Programm zum Testen).



  • Ich habe mich da jetzt Tag und Nacht mit Cheat Engine durchgekämpft. Habe jetzt Werte aller Buttons die ich brauche und auch aller fader.
    Was mich nun wundert ist das das Programm jedes mal andere Anfangs Adressen hat und immer die hinteren 4 Hex Werte bestehen bleiben zb. 0xXXXXCB60
    Dann müsste ich mich da irgendwie noch durchkämpfen und auch noch ein Midi IO realisieren mit einem kleinen GUI.

    Der Link zu der Aussage in Bezug auf der Software ist dieser: http://notapage.net/wordpress/2012/01/endlich-ist-es-vollbracht-die-software-macht-fortschritte/

    Das Problem bei der Software und Midi ist, man hat 72 Midi Werte auf 1 Kanal zur Verfügung. Die muss man für jede Show neu zuweisen, also das die Aktion der Taste auch über Midi abgerufen werden kann. Wenn ich dann die Art des Buttons ändere auf Flash um eine Lampe kurzzeitig an machen zu können schaltet sich diese Szene nach dem los lassen nicht mehr aus. Des weiteren muss ich erst die Buttons in der Software schon programmiert haben, damit ich die einem Midiwert zuweisen kann. Auf Dauer sehr Zeitaufwendig und Nervig.



  • rhino-du schrieb:

    Ich habe mich da jetzt Tag und Nacht mit Cheat Engine durchgekämpft. Habe jetzt Werte aller Buttons die ich brauche und auch aller fader.
    Was mich nun wundert ist das das Programm jedes mal andere Anfangs Adressen hat und immer die hinteren 4 Hex Werte bestehen bleiben zb. 0xXXXXCB60

    Guckst du hier:
    ASLR.
    Möglicherweise kannst du das für dein OS deaktivieren, dann hast du schon mal fixe Offsets. Auf der anderen Seite kannst du natürlich auch versuchen, die einzelnen Module der Anwendung zu identifizieren und die Offsets relativ zur Modulstartadresse bestimmen.



  • Gilt das ASLR nur ab Vista? Ich programmiere das ganze nämlich in Win7 und das Pult würde später auf WinXP laufen. Sprich da hätte ich das Problem dann nicht?



  • Hmm, das mit dem Midi kapiere ich immer noch nicht. Liegt wohl daran, dass ich davon (und Audio generell) sowieso null Ahnung habe.

    Mach dir keine Gedanken um ASLR. Wenn sich die DLLs selbst nicht verändern, dann ist auch der Code immer an derselben Stelle (in der DLL). Lediglich die DLL Basisadressen können sich ändern, deshalb nimmt man offsets.
    Also aktuelle Codeadresse minus aktueller Basisadresse ist der offset.
    Wenn das Programm neu startet, einfach die Basisadresse der DLL holen (CreateToolhelp32Snapshot(TH32CS_SNAPMODULE...) plus dem offset ist dann wieder genau die Codestelle...



  • Ich versuche jetzt schon seit 2 Tagen mich irgendwie durch Examples und Tutorials zu lesen, aber ich komme mit den Adressen einfach nicht weiter.
    Genau so wie mit Midi. 😕 👎



  • Zwei Zitate aus dem von dir verlinkten Thread

    Chris schrieb:

    Difficult to explain and no job for an evening. Finding the memory locations of the required informations took about half an year.

    und

    Bibi schrieb:

    Since the adresses I’ve found for 6.615won’t work with 6.616, i’m affraid to have to do the process each time i’ll upgrade onpc

    Und wenn das Programm nicht gerade globale Variablen für das ganze Zeug verwendet, dann gibt's sowieso keine fixen Adressen. D.h. man muss die Adressen über zwei, drei .... viele Zwischenschritte zusammenbasteln.
    Nach dem Schema A = Read(Address1), B = Read(A + Offset1), C = Read(B + Offset2), .. .
    Netterweise sagt einem aber keiner dass irgendwas nicht fix ist, und auf dem selben PC, unter ähnlichen Voraussetzungen, ergibt sich trotzdem immer die selbe Adresse. Bis sich eben eine andere ergibt.



  • Aber irgendwo muss dem Programm ja auch die Startadresse zugewiesen werden und das muss man ja irgendwo auslesen können oder?



  • Startadresse des Programms?



  • Halt ab da, wo die ganzen Adressen anfangen für das Programm. Damit ich dann nicht jedes mal die neue Adresse für das Programm im C Programm reinschreiben muss, damit ich werte auslesen und reinschreiben kann.



  • Tja, wie schon von @hustbaer erwähnt, kann das eine langwierige Geschichte sein, an gewisse Werte zu kommen (wenn das Programm zB. besonders viele (verkettete) Strukturen im dynamischen Speicher (Heap) anlegt).


  • Mod

    rhino-du schrieb:

    Halt ab da, wo die ganzen Adressen anfangen für das Programm. Damit ich dann nicht jedes mal die neue Adresse für das Programm im C Programm reinschreiben muss, damit ich werte auslesen und reinschreiben kann.

    Meinst du quasi die Stackadresse der main-Funktion? Ja, die kann man irgendwie bekommen. Aber dir ist schon bewusst, dass typische Programme viele Daten nicht auf ihrem Stack speichern?



  • Cheat Engine sagt mir z.B. die Adresse für den 1. Wert den ich brauche:
    gmaLib.dll+12B694
    und für Wert 2:
    gmaLib.dll+12B698

    also wird die Adresse in abhängigkeit von der Adresse der gmaLib.dll eigentlich immer gleich, also der Unterschied zwischen gmaLib.dll und dem 1./2. Wert.

    Jetzt müsste ich dann nur die "Adresse" von der gmaLib.dll nach jedem Programm start neu abfragen und das ist das Problem was mich nicht weiter bringt.



  • rhino-du schrieb:

    Jetzt müsste ich dann nur die "Adresse" von der gmaLib.dll nach jedem Programm start neu abfragen und das ist das Problem was mich nicht weiter bringt.

    Gregson schrieb:

    Wenn das Programm neu startet, einfach die Basisadresse der DLL holen (CreateToolhelp32Snapshot(TH32CS_SNAPMODULE...) plus dem offset ist dann wieder genau die Codestelle...


Anmelden zum Antworten