Suche Helfer und Lehrer zur Bewältigung von Hobbyprojekt



  • 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...



  • Ja danke! Jetzt hab ich, kriege nach jedem neustart die neue Adresse! Danke!



  • Ich stehe vor einem ähnlichen Problem.
    kann mir jemand ein codebeispiel posten zum ermitteln des basepointers?



  • Es wurde doch bereits alles dazu gesagt... ?


Anmelden zum Antworten