Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Wyślij klucze do gry za pomocą haka DirectInput
#1
Cześć chłopaki. Próbuję wysłać klucze do gry online o nazwie Shaiya. Próbowałem SendMessage i PostMessage (w celu wysłania kluczy, gdy okno nie jest skupione) w c #, ale to nie działa dla mnie. Wysyła klucz do czatu, ale postać się nie porusza. Sprawdziłem klucze za pomocą szpiega ++ i wysyłam je poprawnie. Zrobiłem więc kilka badań i myślę, że Shaiya potrzebuje DirectInput. Aby wysyłać klucze z okienkiem DirectInput musi się skupić. Mam to działa z c # ale jak powiedziałem, że to wymaga skupienia, ale chcę wysłać klucze do zminimalizowanego / nieukierunkowanego okna.Aby to zrobić, przeszukałem wiele forów i od czego się uczę, muszę podłączyć DirectInput i zmień bufor klawiszy za pomocą moich kluczy. Znajduję poniższy kod i zmieniam zmienne, które trzeba zmienić i wstrzyknęłam plik DLL do gry. Powoduje to wstrzyknięcie i kiedy klikam "F5" nic się nie dzieje. Spojrzałem na szpiega ++, to nawet nie wysyła klucza do gry, otrzymałem 0 wiadomość o tym kluczu. Oto mój kod. Z tego co widzę, SendKeyDInput nie działa. Ktoś ma na to rozwiązanie?         Kod:   // dllmain.cpp: Definiuje punkt wejścia dla aplikacji DLL. #define _CRT_SECURE_NO_WARNINGS // ignoruje niektóre ostrzeżenia ... #define _CRT_NON_CONFORMING_SWPRINTFS // ... #include "stdio.h" #include <windows.h> #include "detours.h" #include <cstdio> #include <string> #include <cstring> #include <wektor> #include <time.h> #include "dinput.h" #pragma comment (lib, "detours.lib") #pragma comment (lib, "user32.lib") typedef HRESULT (__stdcall * GetDeviceState_t) (LPDIRECTINPUTDEVICE, DWORD, LPVOID *); HRESULT __stdcall hkGetDeviceState (LPDIRECTINPUTDEVICE pDevice, DWORD cbData, LPVOID * lpvData); DWORD Base = 0; DWORD GetDeviceStateOffset = 0x7670; // To jest przesunięcie GetDeviceState z DInput8.dll // Otwórz IDA i Importuj DInput8.dll, następnie spójrz w tabelę funkcji dla DirectInput8Create // Istnieje adres (1000XXXX lub 0CXXXXX) - skopiuj go i zapisz na później // Następnie spójrz na CDIDev_GetDeviceState i skopiuj również ten adres // Teraz odbierz adres z CDIDev_GetDeviceState od DIrectInput8Create, a otrzymasz swój HANDLE PRZESUNIĘCIA tmpHandle = NULL; HMODULE hModDInput8 = NULL; DWORD dwGetDeviceState = NULL; FARPROC dwDirectInput8Create = NULL; struct MyKeys {BYTE Key; DWORD StartTime; DWORD TTL; BOOLEAN isDown; }; MyKeys KeyBuffer [256]; DWORD WINAPI HookThread (); void add_log (format char *, ...); void SendKeyDInput (bajt DIK_, czas DWORD); GetDeviceState_t pGetDeviceState; BOOL APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {switch (ul_reason_for_call) {case DLL_PROCESS_ATTACH: add_log ("========== LOG START =========="); add_log ("Dołączony DLL"); add_log ("Tworzenie wątku ..."); tmpHandle = CreateThread (0, 0, (LPTHREAD_START_ROUTINE) i HookThread, 0, 0, 0); if (! tmpHandle) {add_log ("ThreadCreation Failed!"); } złamać ; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } DWORD WINAPI HookThread () {Base = (DWORD) GetModuleHandleA ("game.exe"); // Zdobądź bazę GAME (zmienia się za każdym razem, gdy otworzysz grę) add_log ("Thread Created"); add_log ("game.exe Base:% x", Base); while (! hModDInput8) {add_log ("Wyszukiwanie dinput8.dll ..."); hModDInput8 = GetModuleHandle (L "dinput8.dll"); Sen (100); } add_log ("Znaleziono dinput8.dll:% x!", hModDInput8); while (! dwDirectInput8Create) {add_log ("Wyszukiwanie GetDeviceState ..."); dwDirectInput8Create = GetProcAddress (hModDInput8, "DirectInput8Create"); Sen (100); } add_log ("Found DirectInput8Create:% x!", dwDirectInput8Create); dwGetDeviceState = (DWORD) ((DWORD) dwDirectInput8Create - GetDeviceStateOffset); add_log ("GetDevicestate jest tutaj (DirectInput8Create -% x):% x", GetDeviceStateOffset, dwGetDeviceState); add_log ("Hooking GetDeviceState ..."); pGetDeviceState = (GetDeviceState_t) DetourAttach (& (PVOID &) dwGetDeviceState, (PBYTE) hkGetDeviceState); add_log ("Initiate Keyboard Buffer ..."); // zainicjuj bufor dla (int i = 0; i <256; i ++) {KeyBuffer [i]. isDown = false; KeyBuffer [i]. Klawisz = 0; KeyBuffer [i]. StartTime = 0; KeyBuffer [i]. TTL = 0; } Add_log ("Przechodzenie do głównej pętli ..."); while (true) {if (GetAsyncKeyState (VK_F5) i 1 << 15) {// Sprawdzamy najbardziej znaczący bit z VK_F5 (F5), podczas gdy zmieniliśmy go z 15 bitów na lewy 1 //, a następnie mały del
Reply
#2
więc, pozwól mi zrozumieć: próbujesz wprowadzić naciśnięcia klawiszy z kierunkiem, a następnie sprawdzasz, czy działa, sprawdzając, czy naciśnięcie klawisza zostało wstawione jako wiadomość okna? Czy masz jakieś pojęcie o tym, co robisz?
Reply
#3
Nie można oczekiwać, że zmiany w buforze w GetDeviceState będą propagować zmiany stanu klucza. Albo jak to rozgryzłeś? edytuj: sry, to jest w porządku, jeśli twój dziennik nie jest wyświetlany, hak nie jest wywoływany, to zgaduję, niewłaściwe przesunięcie?
Reply
#4
Zacytować: Originally Posted by learn_more więc, pozwól mi zrozumieć: próbujesz wprowadzić naciśnięcia klawiszy z kierunkiem, a następnie sprawdzasz, czy działa, sprawdzając, czy naciśnięcie klawisza zostało wstawione jako wiadomość okna? Czy masz jakieś pojęcie o tym, co robisz? Przede wszystkim nie jest to kierunek, to DirectInput. Sprawdziłem, czy program wie, czy klawisz F5 naciska, czy nie? Zacytować: Originally Posted by kingdeking Nie można oczekiwać, że zmiany w buforze w GetDeviceState będą propagować zmiany stanu klucza. Albo jak to rozgryzłeś? edytuj: sry, to jest w porządku, jeśli twój dziennik nie jest wyświetlany, hak nie jest wywoływany, to zgaduję, niewłaściwe przesunięcie? Sprawdziłem przesunięcia, jak 3 razy Reakcja DirectInput8Create offset i CDIDev_GetDeviceState offset jest poprawna
Reply
#5
Zacytować: Originally Posted by learn_more mówiłem o tym, wstrzykujesz directinput, a oczekujesz, że szpieg ++ zobaczy komunikat okna? nie wiem, co palisz, ale przestań to robić, to nie pomaga. także, jeśli gra używa directinput: istnieje więcej niż jeden sposób użycia directinput, więc może wypróbuj inną funkcję, która może być wykorzystana do pobrania danych wejściowych. nie wiem o czym mówisz, ale wygląda na to, że działa.i można zobaczyć SendInput z szpiegiem ++ tutaj trochę ss z tego EDYCJA: nie chcę pobrać danych wejściowych, które obecnie sprawdzam za pomocą GetAsyncKeyState.Chcę wysłać dane wejściowe.
Reply
#6
powiedział nuff.
Reply
#7
Zacytować: Originally Posted by learn_more powiedział nuff. Zrobiłem to za pomocą c # i musi się skupić, ale jak już powiedziałem, wersja c ++ nawet nie wysyła klucza, który mam na myśli w c # z PostMessage Widziałem wiadomości w szpiegu ++, ale to nie porusza postaci, Z SendInput w c # postać był w ruchu, a ja otrzymywałem wiadomości, ale niestety muszę się skupić.
Reply
#8
Zacytować: Originally Posted by SwordStroker Zrobiłem to za pomocą c # i musi się skupić, ale jak już powiedziałem, wersja c ++ nawet nie wysyła klucza, który mam na myśli w c # z PostMessage Widziałem wiadomości w szpiegu ++, ale to nie porusza postaci, Z SendInput w c # postać był w ruchu, a ja otrzymywałem wiadomości, ale niestety muszę się skupić. Cóż, wysyłanie klucza 0x80, który jest w wirtualnych kodach VK_F17: | Spróbuj odczytać klucz-bufor i wyświetlić go gdzieś, jestem pewien, że nasz wstrzyknięcie niewłaściwy kod
Reply
#9
Zacytować: Originally Posted by JD96 Cóż, wysyłanie klucza 0x80, który jest w wirtualnych kodach VK_F17: | Spróbuj odczytać klucz-bufor i wyświetlić go gdzieś, jestem pewien, że nasz wstrzyknięcie niewłaściwy kod buffer [KeyBuffer [i] .Key] = 0x80; Nie zmieniam wartości Key, 0x80 to keydown i 0 jest kluczem do góry
Reply
#10
Zacytować: Originally Posted by SwordStroker buffer [KeyBuffer [i] .Key] = 0x80; Nie zmieniam wartości Key, 0x80 to keydown i 0 jest kluczem do góry Oh my, nie przeczytałem tego jeszcze raz .. Cóż, spróbuj mojej sugestii i przeczytaj coś z bufora, a także dołącz inne funkcje
Reply




Users browsing this thread: 1 Guest(s)