Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Czytanie
#1
Pracuję nad tym mini pomysłem, który miałem i potrzebuję zmienić zewnętrzną funkcję PaintTraverse vtable.   Część pamięci jest chroniona i nie wiem, czy można bezpiecznie zmienić ochronę pamięci. Czy ktoś to zrobił, czy wie o tym?
Reply
#2
Czy myślałeś o użyciu .. idk .. VirtualProtect? EDYCJA: Ah widzę, pytasz, czy to jest bezpieczne. No cóż, zmiana flag ochrony jest bezpieczna. Zapisywanie w sekcji .text choć ... nie tak bardzo
Reply
#3
Zacytować: Napisał MarkHC Poważnie? Czy myślałeś o użyciu .. idk .. VirtualProtect? Nie pytałem, jak to zrobić, zapytałem, czy jest to bezpieczne i czy VAC wykrywa takie rzeczy, nie robiło zbyt wiele na zewnątrz. Wiedziałem, jak to zrobić od samego początku.
Reply
#4
Zacytować: Napisał pierwotnie SzwagiAQN Nie pytałem, jak to zrobić, zapytałem, czy jest to bezpieczne i czy VAC wykrywa takie rzeczy, nie robiło zbyt wiele na zewnątrz. Wiedziałem, jak to zrobić od samego początku. Tak, zdałem sobie z tego sprawę, zobacz moją edycję.
Reply
#5
Zacytować: Napisał pierwotnie SzwagiAQN Nie pytałem, jak to zrobić, zapytałem, czy jest to bezpieczne i czy VAC wykrywa takie rzeczy, nie robiło zbyt wiele na zewnątrz. Wiedziałem, jak to zrobić od samego początku. Możesz to zrobić, ofc ... nie powinno być "wykrywane". Możesz to traktować jak zwykły RPM pod względem wykrywania Kod: // Spróbuj napisać wartość (typu T) do określonego obszaru chronionej pamięci procesowej. // Zwraca: Prawda, jeśli pisanie się powiedzie. // KREDYTY: TEAMGAMERFOOD (ofc) szablon bool WriteProtected (DWORD dwAddress, T ValueToWrite) { DWORD_PTR oldprotect; if (! VirtualProtectEx (hProcess, (LPVOID) dwAddress, sizeof (T), PAGE_EXECUTE_READWRITE, i oldprotect)) zwraca false; if (! Write (dwAddress, ValueToWrite)) zwraca false; if (! VirtualProtectEx (hProcess, (LPVOID) dwAddress, sizeof (T), oldprotect, NULL)) zwraca false; return true; }
Reply
#6
Zacytować: Oryginalnie wysłane przez podwójne v Możesz to zrobić, ofc ... nie powinno być "wykrywane". Możesz to traktować jak zwykły RPM pod względem wykrywania Kod: // Spróbuj napisać wartość (typu T) do określonego obszaru chronionej pamięci procesowej. // Zwraca: Prawda, jeśli pisanie się powiedzie. // KREDYTY: TEAMGAMERFOOD (ofc) szablon bool WriteProtected (DWORD dwAddress, T ValueToWrite) { DWORD_PTR oldprotect; if (! VirtualProtectEx (hProcess, (LPVOID) dwAddress, sizeof (T), PAGE_EXECUTE_READWRITE, i oldprotect)) zwraca false; if (! Write (dwAddress, ValueToWrite)) zwraca false; if (! VirtualProtectEx (hProcess, (LPVOID) dwAddress, sizeof (T), oldprotect, NULL)) zwraca false; return true; } Jeśli jednak piszę do vtable, czy zostanie to zauważone przez vac? Przełączanie wskaźników funkcji wirtualnych jest bezpieczne wewnętrznie, ale nie jest pewne, czy zewnętrzne nie są z tego powodu: Zacytować: Napisał MarkHC . No cóż, zmiana flag ochrony jest bezpieczna. Zapisywanie w sekcji .text choć ... nie tak bardzo
Reply
#7
Zacytować: Napisał pierwotnie SzwagiAQN Jeśli jednak piszę do vtable, czy zostanie to zauważone przez vac? Przełączanie wskaźników funkcji wirtualnych jest bezpieczne wewnętrznie, ale nie jest pewne, czy zewnętrzne nie są z tego powodu: Okay, chcesz zmienić wskaźnik vtable? Tylko to? Tego nie wykryto. Z tego, jak to napisałeś, myślałem, że chcesz coś zmienić w funkcji PaintTraverse.
Reply
#8
Zacytować: Oryginalnie wysłane przez podwójne v Możesz to zrobić, ofc ... nie powinno być "wykrywane". Możesz to traktować jak zwykły RPM pod względem wykrywania Kod:
Reply
#9
Zacytować: Napisał ChrisHD W twoim kodzie, jeśli "Zapis" się nie powiedzie, stara ochrona nie zostanie przywrócona. Kod: szablon bool WriteProtected (DWORD dwAddress, T ValueToWrite) { bool bReturn = true; DWORD_PTR oldprotect; if (! VirtualProtectEx (hProcess, (LPVOID) dwAddress, sizeof (T), PAGE_EXECUTE_READWRITE, i oldprotect)) bReturn = false; if (! Write (dwAddress, ValueToWrite)) bReturn = false; if (! VirtualProtectEx (hProcess, (LPVOID) dwAddress, sizeof (T), oldprotect, NULL)) bReturn = false; return bReturn; } Tak, masz rację, nie zauważyłem Dzięki
Reply
#10
Zacytować: Napisał ChrisHD W twoim kodzie, jeśli "Zapis" się nie powiedzie, stara ochrona nie zostanie przywrócona. Kod: szablon bool WriteProtected (DWORD dwAddress, T ValueToWrite) { bool bReturn = true; DWORD_PTR oldprotect; if (! VirtualProtectEx (hProcess, (LPVOID) dwAddress, sizeof (T), PAGE_EXECUTE_READWRITE, i oldprotect) ||! Write (dwAddress, ValueToWrite) ||! VirtualProtectEx (hProcess, (LPVOID) dwAddress, sizeof (T), oldprotect, NULL )) bReturn = false; return bReturn; } Czy to nie jest to samo w kodzie, który podałeś? Po prostu przeszedłem to, być może jestem po prostu głupi, ale jeśli zapis nie powiedzie się, to zwróci true, więc instrukcja JEŻELI zakończy się pominąwszy VirtualProtectEx, który jest mentem do odzyskania oldprotect
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)