Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
SlimMem - prosta w użyciu klasa do manipulacji pamięcią
#1
Cześć ludzie!   Pomyślałem, że utworzę prostą klasę manipulacji pamięcią napisaną w C ++, więc mamy szansę zobaczyć mniej ProcMem wokół UC. To nic specjalnego, a każdy, kto zna się na C ++ i WinAPI, będzie mógł go napisać w ciągu kilku minut - dlatego jest napisany dla początkujących.     Funkcje: Statyczna metoda sprawdzania, czy dany proces jest uruchomiony   Kilka metod otwierania procesu (poprzez podanie PID lub nazwy procesu oraz prostych lub szczegółowych flag dostępu)   Odczytywanie / zapisywanie pamięci (obsługa wskaźników wielopoziomowych)   Wykupienie listy wszystkich załadowanych modułów procesu docelowego   Możliwość obsługi 32/64-bitowych adresów pamięci poprzez kompilację w x64 lub x86 * duh *   Skanowanie podpisu!     Kod:         SlimMem.h   Kod:   #pragma once / * --------------------------------------------- ------------------------------ ** To oprogramowanie jest w domenie publicznej, dostarczone "tak jak jest", bez technicznych ** wsparcie, bez żadnej gwarancji, wyraźnej lub dorozumianej, co do jego użyteczności dla ** jakiegokolwiek celu. ** ** SlimMem.h ** Prosta w użyciu klasa manipulacji pamięcią ** ** Autor: Zat ** Więcej informacji: https://www.unknowncheats.me/forum/c-and...02-slimmem -symple-use-memory-manipulation-class.html ** ------------------------------------ ------------------------------------- * / #include <windows.h> // Windows- funkcje (OpenProcess, RPM, WPM, itp.) #include <tlhelp32.h> // Funkcje zbierające informacje o procesie #include <Psapi.h> // Funkcje gromadzące informacje o module #include <map> // Data-container to zapisuje przeanalizowane moduły #include <string> // String / WString implementacja #include <cctype> // funkcja tolower, która konwertuje znak na małe litery #include <algorithm> // transform-function, która jest używana do zastosowania funkcji tolower do wstring #include <cassert> // Używane do debugowania #include <type_traits> // Używane do ograniczenia użycia funkcji szablonu Read i Write do określonych typów #include <iostream> // cout #includ e <memory> // unikalna przestrzeń nazw SlimUtils {// Wyklucz nazwy modułów ze SlimModule-structs #define VERYSLIM_SLIMMODULE // Włącz raporty o błędach #define REPORT_ERRORS wbudowany bool IsProcessHandleValid (UCHWYT h) {return h> 0 && h! = INVALID_HANDLE_VALUE; } inline bool IsHandleValid (HANDLE h) {return h! = INVALID_HANDLE_VALUE; } inline BOOL Prawidłowo zamknięte ramię (HANDLE h) {auto const b = CloseHandle (h); assert (b); return b; } Static std :: wstring ToLower (std :: string string) {transform (string. Begin (), string. End (), string. Begin (), tolower); Zwróć ciąg; } Struct SlimModule; struct SigScanResult; klasa SlimMem; / * Zawiera podstawowe informacje o pojedynczym module * / struct SlimModule {std :: uintptr_t ptrBase; DWORD dwSize; SlimModule (const MODULEENTRY32W i mod, const SlimMem i mem) {ptrBase = (std :: uintptr_t) mod. modBaseAddr; dwSize = mod. modBaseSize; }}; / * Przechowuje informacje o skanie podpisu * / struct SigScanResult {bool m_Success; BYTE * m_Data; DWORD m_DataLength; DWORD m_Offset; SigScanResult (): m_Success (false), m_Offset (0), m_DataLength (0), m_Data (nullptr) {} SigScanResult (bool p_Success): m_Success (p_Success), m_Offset (0), m_DataLength (0), m_Data (nullptr) {} SigScanResult (bool p_Success, DWORD p_Offset, BYTE * p_Data, DWORD p_DataLength): m_Success (p_Success), m_Offset (p_Offset), m_DataLength (p_DataLength) {if (p_Data! = Nullptr) {m_Data = new BYTE [m_DataLength]; memcpy_s (m_Data, m_DataLength, p_Data, m_DataLength); }} SigScanResult (const SigScanResult i inne): SigScanResult (inne: m_Success, inne .m_Offset, inne .m_Data, inne. M_DataLength) {} ~ SigScanResult () {if (m_Data! = Nullptr) delete [] m_Data; } SigScanResult & operator = (const SigScanResult i inne) {if (this -> m_Data! = Nullptr) {delete [] this -> m_Data; to -> m_Data = nullptr; } this -> m_Success = inny. m_Sukces; to -> m_Offset = inne. m_Offset; jeśli (inne. m_Data! = nullptr) {this -> m_DataLength = other. m_DataLength; this -> m_Data = new BYTE [other. m_DataLength]; memcpy_s (this -> m_Data, this -> m_DataLength, other. m_Data, other. m_DataLength); } return * this; } Szablon <typename T> bool Read (wartość T i wartość DWORD) const {jeśli (index + sizeof (T)> = m_DataLength) return false; wartość
Reply
#2
chyba że jest to zamiennik dla ProcShit, nie zobaczysz go mniej (ponieważ jest używany głównie do makaronu bez wskazówki)
Reply
#3
Zacytować: Wysłany przez pierwotnie RaptorFactor ~ snip ~ Dzięki za informację zwrotną - na pewno jest kilka przypadków, w których naprawdę nie myślałem o haha Naprawię to w ciągu kilku dni!
Reply
#4
Zacytować: Originally Posted by Zat Dzięki za informację zwrotną - na pewno jest kilka przypadków, w których naprawdę nie myślałem o haha Naprawię to w ciągu kilku dni! Fajne. Cytuj / wspomnij o mnie po aktualizacji, a wtedy przyjrzę się dokładniej.
Reply
#5
Kod: #ifndef __SLIM_MEM__ #define __SLIM_MEM__ Jest 2016, #pragma raz pls Niezła robota. Od jakiegoś czasu chciałbym stworzyć własne środowisko obsługi pamięci / procesu, może twój kod i uwagi Raptora pomogą mi to zrobić: P
Reply
#6
Dlaczego nie używać size_t zamiast definiowania własnych typów wskaźników 32/64. Popraw mnie, jeśli się mylę, ale size_t jest po prostu unsigned int32 na 32-bitowym i unsigned int64 na 64-bitowym, który jest faktycznie taki sam jak dword i dword 64. jak wyżej wspomniano pragma raz, ale to prosty problem. z uprawnieniami do obsługi, nie podoba mi się to, że dokonałeś tego wyliczenia, daje to programistom mniej opcji. Niekoniecznie uważam, że twoja enum dodaje coś naprawdę użytecznego do kodu, jeśli naprawdę chcesz, możesz po prostu zdefiniować stałą lub po prostu użyć #define na typowych typach odczytu / zapisu. Ale to nie jest problem, ponieważ można go po prostu rzucić, aby przekazać go do swojej funkcji. Jak już wspomniano, stwórz stałe wchar_t *, nie będą one zmienione i ogólnie pomaga czytelność kodu. Próbowałbym trzymać się z daleka od używania nazw takich jak ciąg: Kod: std :: wstring ToLowerWString (wchar_t * string) { jak można by pomylić je ze std :: types i musiałbyś się martwić o włączenie przestrzeni nazw i kodowanie się zepsute. W każdym razie, świetna robota, na pewno wykorzystam to w pewnym momencie! Znacznie lepiej niż przekazywany jest gówniany kod ProcMem.
Reply
#7
pragma działa tylko raz na MSVC .. powinien on robić strażników nagłówkowych z ifndef dla kompatybilności z wieloma kompilatorami.
Reply
#8
Zacytować: Wysłany przez pierwotnie RaptorFactor Nie używaj std :: size_t. Nie ma gwarancji, że ma taki sam rozmiar jak void *. To, czego chcesz, to std :: uintptr_t / std :: intptr_t (który przypadkowo znajduje się w mojej oryginalnej odpowiedzi). dzięki za informację, nie wiedziałem o tym. Chociaż w jakich przypadkach nie gwarantowano by tego samego rozmiaru? Kod: #ifdef _WIN64 typedef unsigned __int64 size_t; typedef __int64 ptrdiff_t; typedef __int64 intptr_t; #else typedef unsigned int size_t; typedef int ptrdiff_t; typedef int intptr_t; #endif w oparciu o tę sytuację, niekoniecznie widzę, w jakiej sytuacji sugeruje twój komentarz? Chyba, że zajmujesz się czymś innym niż 32/64 bitowym.
Reply
#9
Zacytować: Originally Posted by maxkunes dzięki za informację, nie wiedziałem o tym. Chociaż w jakich przypadkach nie gwarantowano by tego samego rozmiaru? Kod: #ifdef _WIN64 typedef unsigned __int64 size_t; typedef __int64 ptrdiff_t; typedef __int64 intptr_t; #else typedef unsigned int size_t; typedef int ptrdiff_t; typedef int intptr_t; #endif w oparciu o tę sytuację, niekoniecznie widzę, w jakiej sytuacji sugeruje twój komentarz? Chyba, że zajmujesz się czymś innym niż 32/64 bitowym. Standard nie gwarantuje tego. To był punkt jego postu.
Reply
#10
Zacytować: Napisał Pyro666 Standard nie gwarantuje tego. To był punkt jego postu. Właśnie zastanawiałem się, jakiej sytuacji musiałbyś się martwić, nie gwarantując tego. Wygląda na to, że normalnie w każdym normalnym programie 32/64 bitowym, size_t wykonałoby zadanie w 100% idealnie jako pustka *, odpowiednio 4 bajty i 8 bajtów. Jako unsigned int i unsigned int64
Reply




Users browsing this thread: 1 Guest(s)