AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi KeyboardLayout einer fremden Anwendung ändern
Thema durchsuchen
Ansicht
Themen-Optionen

KeyboardLayout einer fremden Anwendung ändern

Offene Frage von "Zacherl"
Ein Thema von Zacherl · begonnen am 7. Mai 2009 · letzter Beitrag vom 11. Mai 2009
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

KeyboardLayout einer fremden Anwendung ändern

  Alt 7. Mai 2009, 22:46
Hey,

ich versuche bei einem Spiel das Keyboard Layout aus meiner eigenen Anwendung heraus zu ändern. LoadKeyboardLayout() wirkt sich aber nur auf den aufrufenden Thread aus und auch meine Versuche mit DLL Injection und dem KLF_SETFORPROCESS Flag schlagen fehl. (MSDN sagt, dass dieses Flag bei Vista auch nicht verfügbar ist)

Hat jemand eine Idee, möglichst ohne den Kontext des Zielthreads zu manipulieren? Die Eingabeschemagebietsleiste muss das Ganze ja auch irgendwie schaffen!

Gruß Zacherl
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#2

Re: KeyboardLayout einer fremden Anwendung ändern

  Alt 7. Mai 2009, 23:08
rein theoretisch: Würde das nicht funktionieren die Keys zu hooken und statt den Key weiterzuleiten (CallNextHook) einen eigenen Key zu simulieren?
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#3

Re: KeyboardLayout einer fremden Anwendung ändern

  Alt 8. Mai 2009, 16:37
Wie ließt das Spiel seine Zeichen von der Tastatur ein? Viele Spiele verwenden hierzu DirectInput, welches IMHO nur die physikalische Tastennummer übermittelt und nicht unbedingt direkt an das Keyboardlayout gekoppelt ist.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

Re: KeyboardLayout einer fremden Anwendung ändern

  Alt 8. Mai 2009, 17:11
Ja vermute es ist DirectInput, da das Spiel auch auf DX basiert.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

Re: KeyboardLayout einer fremden Anwendung ändern

  Alt 8. Mai 2009, 17:39
Folgendermaßen ist jetzt mein Ansatz: Dieser funktioniert, wenn der Zielprozess schon einige Zeit aktiv war. Bei Verwendung von CREATE_SUSPENDED im CreateProcess() schmiert die Zielanwendung nach meinem Hijack allerdings sofort ab.

Delphi-Quellcode:
function W32HijackThread(hProcess, hThread: Cardinal; Code: Pointer;
  CodeLen: DWord): Boolean;
var
  lpRoutine: Pointer;
  dwWritten: DWord;
  lpNewContext: TContext;
  ASMStub: Array[0..4] of Byte;
begin
  Result := false;
  SuspendThread(hThread);
  try
    FillChar(lpNewContext, SizeOf(TContext), #0);
    lpNewContext.ContextFlags := CONTEXT_CONTROL;
    if not GetThreadContext(hThread, lpNewContext) then
      Exit;
    lpRoutine := VirtualAllocEx(hProcess, nil, CodeLen + 5, MEM_COMMIT,
      PAGE_EXECUTE_READWRITE);
    if not Assigned(lpRoutine) then
      Exit;
    ASMStub[0] := $68;
    CopyMemory(@ASMStub[1], @lpNewContext.Eip, 4);
    if not WriteProcessMemory(hProcess, lpRoutine, @AsmStub[0], 5,
      dwWritten) then
      Exit;
    if not WriteProcessMemory(hProcess, Pointer(Cardinal(lpRoutine) + 5), Code,
      CodeLen, dwWritten) then
      Exit;
    lpNewContext.Eip := DWord(lpRoutine);
    Result := SetThreadContext(hThread, lpNewContext);
  finally
    ResumeThread(hThread);
  end;
end;
Delphi-Quellcode:
procedure HijackProc; assembler;
asm
  pusha
  nop
  push dword ptr 129
  push dword ptr $FFFFFFFF
  mov eax, $FFFFFFFF
  //call eax
  popa
end;
procedure HijackProcEnd; begin end;

const
  LANGUAGEID: PAnsiChar = '00000409' + #0;

var
  dwHijackSize,
  dwOldProtect,
  dwAddress,
  dwWritten: DWord;
  lpLang: Pointer;
  lpProcessInfo: TProcessInformation;
  lpStartupInfo: TStartupInfo;
begin
  FillChar(lpStartupInfo, SizeOf(TStartupInfo), #0);
  if CreateProcess('C:\Program Files (x86)\Subagames\CrossFire\crossfire.exe', nil, nil, nil, false, CREATE_SUSPENDED,
    nil, nil, lpStartupInfo, lpProcessInfo) then
  begin
    W32InjectModule('user32.dll', lpProcessInfo.hProcess);
    lpLang := VirtualAllocEx(lpProcessInfo.hProcess, nil, 9, MEM_COMMIT,
      PAGE_EXECUTE_READWRITE);
    if Assigned(lpLang) and WriteProcessMemory(lpProcessInfo.hProcess, lpLang,
      LANGUAGEID, 9, dwWritten) then
    begin
      dwHijackSize := Cardinal(@HijackProcEnd) - Cardinal(@HijackProc);
      if VirtualProtect(@HijackProc, dwHijackSize, PAGE_EXECUTE_READWRITE,
        dwOldProtect) then
      begin
        dwAddress := DWord(lpLang);
        CopyMemory(Pointer(Cardinal(@HijackProc) + 9), @dwAddress, 4);
        dwAddress := DWord(GetProcAddress(LoadLibrary('user32.dll'),
          'LoadKeyboardLayoutA'));
        CopyMemory(Pointer(Cardinal(@HijackProc) + 14), @dwAddress, 4);
        W32HijackThread(lpProcessInfo.hProcess, lpProcessInfo.hThread,
          @HijackProc, dwHijackSize);
      end;
    end;
    ResumeThread(lpProcessInfo.hThread);
  end;
end;
Hat jemand ne Idee, woran das liegen könnte?

Gruß Zacherl
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: KeyboardLayout einer fremden Anwendung ändern

  Alt 8. Mai 2009, 17:50
Ein Teil der Prozess-Initialisation wird vom ersten Thread des Prozesses durchgeführt, der erfolgreich startet, bevor er die eigentliche Thread-Funktion ausführt. Vermutlich wird durch das SetThreadContext diese Initialisation unterbunden. Das ist allerdings nur geraten.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

Re: KeyboardLayout einer fremden Anwendung ändern

  Alt 9. Mai 2009, 13:38
An sowas in der Art dachte ich auch. Nur wie setzt MS das Layout für fremde Prozesse?
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

Re: KeyboardLayout einer fremden Anwendung ändern

  Alt 11. Mai 2009, 11:43
* push *
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz