메모리 스캔 질문해요~ RPM, VirtualProtectEx, VirtualQueryEx
노을빛
메모리 스캐너(차후 에디터로)를 만드는 중인데, 문제가 생겼어요.일단 아래는 허접하게나마 짜본 소스입니다...소스를 실행해서 몇몇 프로그램들을 대상으로 값을 스캔하면 잘 스캔이 됩니다만워게임 문제를 풀던 도중 나온 리버싱 문제의 프로그램은 이 소스로 스캔이 안되더라고요.그래서 이건 원래 안되는건가... 하고 시중에 돌아다니는 치트오메틱이라는 프로그램으로 스캔을 해보니 잘 됬습니다.아마 제 소스상에 문제가 있는 것 같은데 스캔이 너무 빨리 되는것도 수상하고... 그렇네요치트오메틱은 한 1~2초정도 걸리던데 말이에요.수정해주실 수 있는 분을 찾습니다 ^^소스는 초보가 짠거라 좀 미흡한 부분이 많으니 양해 바랍니다#includestdio.h#includewindows.h#includemalloc.h#includetlhelp32.h#define ARRAY_EACH_SIZE 256DWORD FindProcess(char* szProcess){HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);DWORD dwPid=atoi(szProcess);if(hSnapshot){PROCESSENTRY32 ProcessEntry32;BOOL bProcessFound;ProcessEntry32.dwSize=sizeof(PROCESSENTRY32);bProcessFound=Process32First(hSnapshot, &ProcessEntry32);while(bProcessFound){if(strcmp(ProcessEntry32.szExeFile, szProcess)==0)return ProcessEntry32.th32ProcessID;else if(ProcessEntry32.th32ProcessID==dwPid && dwPid!=0)return dwPid;bProcessFound=Process32Next(hSnapshot, &ProcessEntry32);}CloseHandle(hSnapshot);}return 0;}BYTE *ByteArray(unsigned n, unsigned size){BYTE *Array=new BYTE[size];for(unsigned i=0;isize;i++){Array[i]=n%256;n/=256;}return Array;}PDWORD MemoryFind(HANDLE hProcess, int find, int size, int *count){SYSTEM_INFO SI;MEMORY_BASIC_INFORMATION MBI;DWORD Address=0;int i, j, Result=0;BYTE *SrcArray, *DestArray;DWORD *FindData=new DWORD[ARRAY_EACH_SIZE*4];SrcArray=ByteArray(find, size);GetSystemInfo(&SI);Address=(DWORD)SI.lpMinimumApplicationAddress;DWORD OldProtect;do{if(VirtualQueryEx(hProcess, (LPVOID)Address, &MBI, sizeof(MBI))==sizeof(MBI)){if(MBI.RegionSize0 && MBI.Type==MEM_PRIVATE && MBI.State==MEM_COMMIT){DestArray=new BYTE[MBI.RegionSize];VirtualProtectEx(hProcess, MBI.BaseAddress, size, PAGE_EXECUTE_READWRITE, &OldProtect);if(ReadProcessMemory(hProcess, MBI.BaseAddress, DestArray, MBI.RegionSize, NULL)!=0){for(i=0;i(int)MBI.RegionSize;i++){for(j=0;j(int)size;j++){if(i+size+1(int)MBI.RegionSize)break;if(DestArray[i+j]!=SrcArray[j])break;else if(j==size-1){if(Result%ARRAY_EACH_SIZE==0)FindData=(DWORD *)realloc(FindData, size*ARRAY_EACH_SIZE*(Result/ARRAY_EACH_SIZE+1));FindData[Result]=(DWORD)MBI.BaseAddress+i;Result++;}}}}VirtualProtectEx(hProcess, MBI.BaseAddress, size, OldProtect, NULL);delete DestArray;}Address=(DWORD)MBI.BaseAddress+(DWORD)MBI.RegionSize;}}while(Address(DWORD)SI.lpMaximumApplicationAddress);*count=Result;delete SrcArray;return FindData;}void MemoryWrite(HANDLE hProcess, DWORD address, DWORD value, int size){DWORD OldProtect;VirtualProtectEx(hProcess, (LPVOID)address, size, PAGE_EXECUTE_READWRITE, &OldProtect);WriteProcessMemory(hProcess, (LPVOID)address, &value, size, NULL);VirtualProtectEx(hProcess, (LPVOID)address, size, OldProtect, NULL);}int main(){HANDLE hProcess;DWORD *Result;char Process[100];int Find, Count, Address, Value;printf(프로세스 이름 : );scanf(%s, Process);hProcess=OpenProcess(PROCESS_ALL_ACCESS, FALSE, FindProcess(Process));if(hProcess==NULL)return 0;printf(스캔할 값 : );scanf(%d, &Find);Result=MemoryFind(hProcess, Find, 4, &Count);printf(주소\n);for(int i=0;iCount;i++)printf(%X\n, Result[i]);printf(결과 : %d 개\n, Count);scanf(%d, &Find);printf(쓸 주소 : );scanf(%X, &Address);printf(쓸 값 : );scanf(%d, &Value);MemoryWrite(hProcess, Address, Value, 4);return 0;}
라고 네이버 지식인에 올렸어요...ㅇㅅㅇ 구마S에서도 도움의손길을 구해요!!
-
큰맘 2023-07-02
그렇군요 좋은거 배워갑니다 :)
IPC를 사용함에 따른 이점은 무엇인가요?
보안시스템의 후킹을 회피하기 위한 목적 이외에도 있나요? -
히나 2023-07-02
IPC가 서로 다른 프로세스간의 통신이잖아요.
그냥 ReadProcessMemory보다 dll에서 값을검색한뒤 검색결과만 IPC로 보내는게 더 빠르지않나요
(물론 Dll에서 GUI 띄우는게 훨씬 빠르고;) -
모두가람 2023-07-02
검색 루틴이 dll내부에 있으면 더 빠르던데요.
메모리를 몽땅 복사해서 보내는게 아니라. -
단순드립 2023-07-02
프로세스에서 dll을 관리하는 방식은 더블링크리스트인데 PEB 어드레스 구하셔서 dll의 앞뒤 링크를 끊으시면 안걸려요.
신기한건 커널단이 아닌 유저레벨에서 관리되는 메모리상에 존재한다는거에요 ㄷ -
황소자리 2023-07-02
DLL인젝션을 하면 쉴드에 걸리지 않나요 ?
-
찰스 2023-07-02
참고로 메모리를 검색하는 수다님께 정석일거에요
-
겨레 2023-07-02
아하 readonly만 줘도 되겟군요!
맞아요 소스를 구하는건 힘드네요 ㅠ흑 담에 수다님 개발이 끝나셔서 소스 공개 하실때 스캔부분을 참고해봐야겠어요! -
빈길 2023-07-02
VirtualProtectEx에서 page_readonly만 줘보세요.(쓰기는 나중에 시도할거니까)
치트오메틱이나 티서치같은건 잘 모르겠네요, 소스를 보거싶어도 소스를 못구하니 ㄷㄷ
아 그리고 메모리 비교는 루프말고 memcmp로해보세요. -
새우깡 2023-07-02
DLL 인젝션을 통한 스캔이라니.. 대단하네요!
그런데 문제는 스캔 속도는 둘째치더라도 스캔이 안되는 현상이 발생하기도 하네요...
간단한 게임을 대상으로 스캔했을때 글 내용처럼 치트오메틱에서는 스캔이 되는데 제껄로는 안되는..
스캔하는 부분에 제가 뛰어넘는 주소가 있거나 VirtualProtect가 잘 안 드는 걸까요? -
가욋길 2023-07-02
아, 네넹
저보다 잘 만드셨네요
그 제 검색속도가 빠른 이유는 검색하는 소스 가 외부에 있지 않고 메이플스토리 내부에 있기때문이에요
아무래도 내부메모리를 검색하는 속도가 훨씬 빠르고 RPM이나 WPM을 이용하면 페이지 크기만큼 다른 프로세스로 복사하는 과정이 너무 오래걸리니?저처럼 dll인젝션을 해서 메모리를 검색하시거나 IPC를 이용해보세요.