Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
PatternScanner
#1
Pomyślałem, że właśnie wydam mój skan wzoru. Konstruktywna krytyka jest mile widziany.   Skanuje wszystkie dostarczone wzorce, zwraca adres, który dostał najwięcej trafień i zapewnia stosunek do wszystkich wzorców. Dodatkowo podaje informacje, które wzorce są łamane.       Kod:   enum class PatternType {Adres, wskaźnik, wskaźnikBYTE, PointerWORD, PointerDWORD, PointerQWORD, RelativePointer, RelativePointerBYTE, RelativePointerWORD, RelativePointerDWORD, RelativePointerQWORD,}; typedef struct {char * pattern; Typ PatternType; } Wzór ; #ifdef _WIN64 # typedef DWORD64 XWORD #element # typedef DWORD XWORD #endif klasa PatternScanner {prywatny: szablon <nazwa_typu T, nazwa_pliku ret> static ret ResolveRelativePtr (void * adres) {if (! Adres) return NULL; T offset = * (T *) Adres; if (! offset) zwraca NULL; return (ret) ((XWORD) Address + offset + sizeof (T)); } Szablon <typename T> static void * ResolveRelativePtr (void * Address) {return ResolveRelativePtr <T, void *> (Address); } Szablon <nazwa_typu T, nazwa_typu_pliku> static ret ResolvePtr (void * adres) {jeśli (! Adres) zwraca NULL; return (ret) * (T *) Adres; } Szablon <typename T> static void * ResolvePtr (void * Address) {return ResolvePtr <T, void *> (Address); } Public: static void * FindPattern (void * startAddress, DWORD searchSize, const Pattern & pattern); static void * FindPattern (const std :: string & ModuleName, const Pattern & pattern); static std :: vector <void *> FindPatterns (const std :: string & ModuleName, const Pattern & pattern); static std :: vector <void *> FindPatterns (void * startAddress, DWORD searchSize, const Pattern & pattern); static void * FindPattern (void * startAddress, DWORD searchSize, Pattern * patterns, float * ratio = nullptr); static void * FindPattern (const std :: string & ModuleName, wzorce Pattern *, float * ratio = nullptr); };     Kod:   void * PatternScanner :: FindPattern (const std :: string & ModuleName, const Pattern & pattern) {return PatternScanner :: FindPattern (GetModuleHandle (nazwa modułu. c_str ()), GetModuleSize (nazwa modułu. c_str ()), wzorzec); } Std :: vector <void *> PatternScanner :: FindPatterns (const std :: string & ModuleName, const Pattern & pattern) {return PatternScanner :: FindPatterns (GetModuleHandle (nazwa modułu c_str ()), GetModuleSize (nazwa modułu. C_str () ), wzór ); } Std :: vector <void *> PatternScanner :: FindPatterns (void * startAddress, DWORD searchSize, const Pattern & pattern) {std :: vector <void *> ret; void * base = startAddress; Rozmiar DWORD = searchSize; void * addr = base; do {addr = PatternScanner :: FindPattern ((void *) ((XWORD) addr + 1), rozmiar - ((XWORD) addr - (XWORD) podstawa + 1), wzorzec); jeśli (addr) ret. push_back (addr); } while (addr! = nullptr); return ret; } Void * PatternScanner :: FindPattern (void * startAddress, DWORD searchSize, const Pattern & pattern) {size_t len = strlen (wzorzec); if (len == 0) return nullptr; XWORD poz = 0; int byteCount = 1; uint i = 0; while (i <len - 1) {if (wzorzec wzorca [i] == '') byteCount ++; i ++; } Bajt * patt = (bajt *) malloc (byteCount + 1); jeśli (! patt) zwróci nullptr; bajt * maska = (bajt *) malloc (byteCount + 1); jeśli (! maska) zwróci nullptr; int offset = 0; int bytesCounted = 0; i = 0; while (i <len - 1) {if (wzorzec wzorca [i] == '[') {i ++; offset = bytesCounted; } Jeśli (wzorzec wzorca [i] == "\ 0") jest zerwany; if (wzorzec wzorca [i] == "?" i wzorzec wzorzec [i + 1] == "?") {maska [bytesCounted] = '?' ; patt [bytesCounted] = '\ 0'; } else {byte hn = wzór. wzór [i]> "9"? wzór . wzór [i]
Reply
#2
Bardzo dobrze.
Reply
#3
Fajnie, użyję tego + rep
Reply
#4
@sh! ft Przede wszystkim za twoje sugestie. Teraz prędkość nie jest dla mnie ważna. Ale może rozważyć dodanie niektórych sugestii, gdy tak się stanie. Podoba mi się pomysł na oddzwonienie.
Reply
#5
Jeśli chodzi o szybkość, możesz użyć std :: async z std :: future, aby uzyskać pewne przyspieszenie prędkości, pozwalając na skanowanie wszystkich wzorców w tym samym czasie.
Reply
#6
Zacytować: Originally Posted by atom0s Jeśli chodzi o szybkość, możesz użyć std :: async z std :: future, aby uzyskać pewne przyspieszenie prędkości, pozwalając na skanowanie wszystkich wzorców w tym samym czasie. Nigdy o tym nie słyszałem. Z pewnością spróbuję tego, kiedy będę w domu.
Reply
#7
Zacytować: Originally Posted by Chaos Leader Nie słyszałem o tym. Zdecydowanie spróbuję tego, kiedy będę w domu. fantazyjne c ++ owijki wokół wątków.
Reply




Users browsing this thread: 1 Guest(s)