Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
C ++ Zahaczanie funkcji pamięci
#1
Cześć, oszustów. =) Mam mały problem z zaczepieniem. Powiedzmy, że próbuję zmodyfikować funkcję, jeśli jeden z argumentów ma określoną wartość. Funkcjonować:                       Teraz. Problem polega na tym, że mam swoją własną funkcję, a kiedy argument nie oznacza pewnej wartości, chcę podłączyć normalną funkcję, ale potem znowu gra się zawiesza. Czy ktoś mógłby wskazać mi, jak poprawnie zdefiniować funkcję "w pamięci"? Dziękuję Ci!               Kod:   DWORD (__fastcall * pLoadLoginWindow) (int, int) = (DWORD (__fastcall *) (int, int)) (0x59a663); DWORD __fastcall m_loadLoginWindow (int, int); // DllMain: DetourAttach (& (PVOID &) pLoadLoginWindow, m_loadLoginWindow); // I funkcja: DWORD __fastcall m_loadLoginWindow (int a1, int a2) {printf ("LoadPanels | a1:% d", a1); if (a1 == 0x300ec0c) {HANDLE hFile; hFile = CreateFile (L "rsrcs \\ dane \\ ui \\ loginwindow.dds", GENERIC_READ, FILE_SHARE_DELETE, 0, 3u, 0x10000001u, 0); if (hFile == INVALID_HANDLE_VALUE) {MessageBox (NULL, TEXT ("Nie można załadować pliku loginwindow.dds."), TEXT ("Wyłączanie"), MB_ICONERROR); PostQuitMessage (0); return - 1; } Printf ("HFile:% d \ r \ n", hFile); DWORD dwSize = GetFileSize (hFile, NULL); if (dwSize == 0xFFFFFFFF) {MessageBox (NULL, TEXT ("Nieprawidłowy rozmiar załadowanych plików .dds."), TEXT ("Wyłączanie"), MB_ICONERROR); PostQuitMessage (0); return - 1; } Printf ("DWSize:% d \ r \ n", dwSize); void * buffer = malloc (dwSize); * (DWORD *) a2 = * (DWORD *) bufor; if (! buffer) {MessageBox (NULL, TEXT ("Za mało pamięci."), TEXT ("Błąd krytyczny"), MB_ICONERROR); PostQuitMessage (0); return - 1; } DWORD dwReaded = 0; if (! ReadFile (hFile, * (LPVOID *) a2, dwSize i dwReaded, 0)) {MessageBox (NULL, TEXT ("Nie można odczytać z pliku."), TEXT ("Błąd krytyczny"), MB_ICONERROR); PostQuitMessage (0); return - 1; } Printf ("Odczytywany rozmiar:% d \ r \ n", dwReaded); * (DWORD *) (a2 + 4) = dwReaded; return dwSize; } return pLoadLoginWindow (a1, a2); }             Z poważaniem.
Reply
#2
Jego stdcall i nie fastcall. Naucz się podstaw, zanim spróbujesz czegoś takiego jak funkcje objazdowe.
Reply
#3
Zacytować: Originally Posted by JD96 Jego stdcall i nie fastcall. Naucz się podstaw, zanim spróbujesz czegoś takiego jak funkcje objazdowe. Więc jak byś mi wytłumaczył, że już podpinałem więcej niż 5 funkcji typu stdcall i to z użyciem fastcall? Nie pracowali z tymi typami - tylko fastcall sprawił, że działały poprawnie. P.S .: Ofc, już próbowałem podłączyć tę funkcję za pomocą stdcall - nie został nawet wywołany. P.S.2: W końcu po 5 godzinach .. Dla każdego, kto ma ten sam problem - pamiętaj, aby dodać nazwę argumentu w zdefiniowanej funkcji; takie jak to: Kod: DWORD (__stdcall * pLoadLoginWindow) (int a1, int a2) = (DWORD (__stdcall *) (int, int)) 0x59a663; @Up: Czy tak trudno było wskazać Panu Nie Podstawowemu?
Reply
#4
Wyłącz Optymalizacje i upewnij się, że wszystko zostało poprawnie zainicjowane. Powinieneś również przywrócić flagi pamięci zmodyfikowane za pomocą VirtualProtect.
Reply
#5
Zacytować: Napisał MarkHC Wyłącz Optymalizacje i upewnij się, że wszystko zostało poprawnie zainicjowane. Powinieneś również przywrócić flagi pamięci zmodyfikowane za pomocą VirtualProtect. Byłem zawsze wrogi w przypadku C ++, z powodu tych wszystkich błędów, pochodzących z nikąd. Ta rzecz; Meh, to już zrujnowało godziny mojego wolnego czasu. W każdym razie, do rzeczy. Zrobiłem to, co mi powiedziałeś. Nadal - nie miałem szczęścia. Tak więc myślę o przejrzeniu pliku * .vcxproj. Próbowałem zmienić konfigurację jeden po drugim po stronie wydania, aby wyglądać podobnie do debugera. W końcu dotarłem do ostatniej opcji - "UseDebugLibraries", która została ustawiona na "false". Ustawiłem to na "true". Mój kompilator zgłosił błąd kodu; Kod: błąd D8016: komendy "/ ZI" i "/ GL" - opcje linii są niekompatybilne - więc zmieniłem właściwość "Format informacji debugowania". Wreszcie, teraz wszystko działa również po stronie wydania. Dziękuję Ci bardzo. @ Wciąż nie mam pojęcia, co właśnie zrobiłem.
Reply




Users browsing this thread: 1 Guest(s)