[C/C++] [RCE] Creative Mode Switcher

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von MasterJulian, 19. Januar 2013 .

  1. 19. Januar 2013
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    [RCE] Creative Mode Switcher

    Hintergrund:
    Spoiler
    Ich muss hier, je nach Soft/Hardware diverse Audio Einstellungen vornehmen. Dazu möchte ich mir ein Tool schreiben welches alles erledigt. Das meiste lässt sich via Windows API regeln. Was mir jedoch fehlt, ist die Umschaltung der Modi meiner X-FI Xtreme Music. Ich habe also beim Creative Support angefragt, und der nette Mitarbeiter hat mich darauf hingewiesen, dass es keine öfftliche API gibt, jedoch ein Tool names "Auto Mode Switcher". Das funktioniert zwar, ist für meine Zwecke aber ungeeignet, da keine x64 Programm supported werden.
    Ziel ist es also den Auto Mode Switcher von Creative zu reversen und dessen Switch Funktionalität nachzubilden. Das Tool kommt mit nur zwei zusätzlichen DLLs aus "CTAudEp.dll" und "ShHook.dll". Der Hook exportiert nur zwei Funktionen (startHook und endHook) und ist wohl zum erkennen des gestarteten Programms zuständig. Die "CTAudEp.dll" bietet zwar jede Menge, allerdings wird nur "CTCheckForAudioEndpointSupport(int *)" importiert. Ich nehme an hier wird einfach geprüft ob überhaupt eine kompatible Karte installiert ist. Leider sind meine RCE Kenntnisse sehr beschränkt. Ich habe den Umschaltvorgang mal mit ProcMon und API Monitor aufgezeichnet. Zum umschalten werden zwei neue Threads erzeugt und mehrfach die ID des Audio Renderes aus der Registry gelesen. Mehr kann ich aus den Logs nicht herauslesen und somit hörts da dann auch schon auf . Leider lässt sich der API Log nicht exportieren. Wenn mir jemand helfen könnte oder einen anderen Ansatz nennen könnte wäre das nicht schlecht. Die Applikation selber habe ich (sowohl als Setup als auch die Files aus dem Programmverzeichnis) mal hochgeschoben:
    Download: AutoMode_Installed.rar | www.xup.in
    Download: AutoMode_Setup.rar | www.xup.in

    PS: Ich weiß, dass es einen 3rd Pary Mode Switcher gibt, der emuliert jedoch Tasten und bedient so die Creative Software.
     
  2. 19. Januar 2013
    AW: [RCE] Creative Mode Switcher

    Kannst du kurz Beschreiben was bei der Umschaltung der Modis passiert?
    Die Chancen stehen schlecht das jemand das System hat und sich mit RCE auskennt. Und ohne wird es wohl relativ schwer da was raus zu finden.

    Wenn du den Ausgabekanal/gerät switchen möchtest gibt es ein undokumentierte Windows Schnittstelle mit der man das Erledigen kann. Dazu mal nach IPolicyConfig suchen, da hat sich jemand die mühe gemacht diese zu Reversen, soll unter Win7 und Vista gehen.
    Eventuell ist da auch das dabei was du suchst.

    Mfg Rushh0ur
     
    1 Person gefällt das.
  3. 19. Januar 2013
    Zuletzt bearbeitet: 19. Januar 2013
    AW: [RCE] Creative Mode Switcher

    Ich habe keine Ahnung was intern da passiert. Das Umschalten selbst ist nur mit den Creative Tools möglich. Hier reagiert z.B. die Sourrund Erweiterung im "Unterhaltungsmodus" anders als im "Spielemodus". Auch ein knacken ist während des Umschaltvorganges zu hören. Ich schätze mal, das Device bekommt einen Reset Impuls. Laut FAQ ein Relais welches geschaltet wird
    //edit: Hier mal der passende FAQ Eintrag von Creative dazu:
    Creative Wereldwijde Ondersteuning
     
  4. 19. Januar 2013
    AW: [RCE] Creative Mode Switcher

    Hmm.. das APIMonitor Programm kannte ich noch nicht und muss sagen, dass es ziemlich geil ist. Hätte ich das mal früher gekannt.
    Ich bin absolut nicht erfahren darin Zeug zu reverse-engineern, aber ich hab versucht es herauszufinden und meine Vermutung ist, dass er COM/OLE benutzt um den Modus umzuschalten. Hierbei wird API verwendet, welche durch bereits vorhandene Komponenten bereit gestellt wird. In diesem Fall wurde was durch die Datei C:\Windows\SysWOW64\CTXFISPI.EXE bereit gestellt.

    Vorab: Ich hab noch ein anderes Programm gefunden, welches das mit dem Umschalten macht:
    http://www.spectra9.com/xfmc/xfmc.html
    Das kann man glaub ich auch per Kommandozeile triggern.
    Hier gibts einen Thread zum Programm:
    X-Fi Mode Chan - Page 29
    Auf genau dieser Seite versucht jemand anderes die API in einem vbs Skript zu nutzen, der Entwickler von xfmc sagt aber
    "Regarding CTXFISPI, I haven't had much luck calling any of the exported functions inside it, and unfortunately CL Dev is keeping silent about this"
    Also er scheint es nicht in seinem Programm zu verwenden.

    Nichtsdestotrotz wird es durch AutoModeSwitcher verwendet.
    (Auffällig ist in ProcMon, dass kurz nach dem Triggern des Buttons Ctxfihlp.exe und CTXFISPI.EXE aktiv werden.)

    Sich den AutoModeSwitcher in einem Disassembler anzuschauen hat mir nicht so viel gebracht. Es wäre interessant zu erfahren welche Routine ausgeführt wird, wenn man den Button drückt, aber ich hab keine Ahnung wie man daran kommt. Herauszufinden, ob das tatsächliche Ändern des Modus tatsächlich über COM/OLE läuft hat sich als schwierig herausgestellt.

    In API Monitor letztlich wird deutlich, dass sehr viele verschiedene Arten von Aufrufen getriggert werden, der entsprechende COM/OLE Aufruf ist jedoch auch dabei.

    Um herauszufinden, welche API genau angeboten wird, hab ich das Tool OLE/COM Viewer aus dem Win2000 Ressource Kit gefunden. Die Datei CTXFISPI.EXE bietet tatsächlich einen Haufen Zeug an u.a. auch: (ich kann das Tool bei Bedarf auch kurz hochladen)
    Code:
    library CT20kSpiLib
    { ..
     interface IMode;
    ..
    [ uuid(FE14A442-9833-4172-AEC5-8711BAF89EFD),
     helpstring("Mode Class")
     ]
     coclass Mode {
     [default] interface IMode;
     };
     [
     odl,
     uuid(782B6622-CB27-43DE-8E3D-134D0823603C),
     helpstring("IMode SPI Interface")
     ]
     interface IMode : IUnknown {
     [helpstring("method EnumMode")]
     HRESULT _stdcall EnumMode(
     [in] unsigned long dwIndex, 
     [out] GUID* pModeGUID);
     [helpstring("method IsModeSupported")]
     HRESULT _stdcall IsModeSupported(
     [in] GUID ModeGUID, 
     [out] long* pbSupported);
     [helpstring("method GetModeDefault")]
     HRESULT _stdcall GetModeDefault([out] GUID* pModeGUID);
     [helpstring("method GetActiveMode")]
     HRESULT _stdcall GetActiveMode([out] GUID* pModeGUID);
     [helpstring("method SetActiveMode")]
     HRESULT _stdcall SetActiveMode([in] GUID ModeGUID);
     [helpstring("method RestoreMode")]
     HRESULT _stdcall RestoreMode([in] GUID ModeGUID);
     };
    
    In API Monitor taucht dieser Aufruf auf
    Code:
    # Time of Day Thread Module API Return Value Error Duration
    18688 10:32:24.858 PM 1 ole32.dll IPSFactoryBuffer::CreateProxy ( 0x006b25bc, IMode, 0x0018ef90, 0x0018efa8 ) S_OK 0.0000037
    Allerdings finde ich danach keinen weiteren Aufruf auf etwa einer Methode von IMode.

    Ich kann also nicht genau sagen, ob tatsächlich darüber der Mode geändert wird oder doch durch etwas anderes.
     
    1 Person gefällt das.
  5. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.