수다닷컴

  • 해외여행
    • 괌
    • 태국
    • 유럽
    • 일본
    • 필리핀
    • 미국
    • 중국
    • 기타여행
    • 싱가폴
  • 건강
    • 다이어트
    • 당뇨
    • 헬스
    • 건강음식
    • 건강기타
  • 컴퓨터
    • 프로그램 개발일반
    • C언어
    • 비주얼베이직
  • 결혼생활
    • 출산/육아
    • 결혼준비
    • 엄마이야기방
  • 일상생활
    • 면접
    • 취업
    • 진로선택
  • 교육
    • 교육일반
    • 아이교육
    • 토익
    • 해외연수
    • 영어
  • 취미생활
    • 음악
    • 자전거
    • 수영
    • 바이크
    • 축구
  • 기타
    • 강아지
    • 제주도여행
    • 국내여행
    • 기타일상
    • 애플
    • 휴대폰관련
  • 프로그램 개발일반
  • C언어
  • 비주얼베이직

메모리 스캔 질문해요~ RPM, VirtualProtectEx, VirtualQueryEx

노을빛

2023.07.02

메모리 스캐너(차후 에디터로)를 만드는 중인데, 문제가 생겼어요.일단 아래는 허접하게나마 짜본 소스입니다...소스를 실행해서 몇몇 프로그램들을 대상으로 값을 스캔하면 잘 스캔이 됩니다만워게임 문제를 풀던 도중 나온 리버싱 문제의 프로그램은 이 소스로 스캔이 안되더라고요.그래서 이건 원래 안되는건가... 하고 시중에 돌아다니는 치트오메틱이라는 프로그램으로 스캔을 해보니 잘 됬습니다.아마 제 소스상에 문제가 있는 것 같은데 스캔이 너무 빨리 되는것도 수상하고... 그렇네요치트오메틱은 한 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에서도 도움의손길을 구해요!!

신청하기





COMMENT

댓글을 입력해주세요. 비속어와 욕설은 삼가해주세요.

  • 큰맘 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를 이용해보세요.

번호 제 목 글쓴이 날짜
2700033 배경에 그라데이션을 넣으려고 하는데요.. (4) 화이티 2025-07-01
2700005 [질문] TextField 객체의 실제 높이 알아오는 방법 ? 천사의눈물 2025-07-01
2699978 FileReferenceList를 이용하여 업로드시 자꾸 실행속도가 느리다는 팝업이... (10) 데이비드 2025-06-30
2699944 자바스크립트가 많은 사이트는... (6) 희나리 2025-06-30
2699918 브라우저마다 다른 input과 텍스트 정렬 (3) 늘봄 2025-06-30
2699887 동적텍스트를 그래픽으로?? (2) 족장 2025-06-30
2699862 scope넣기 (1) 아인 2025-06-29
2699835 exe로 만드는 방법을....알려주세요.. (5) 방방 2025-06-29
2699809 롤오버할때 백그라운드 이미지로할때 alt설명은 어떻게해야하죠?..ㅠ (4) 반혈 2025-06-29
2699757 리스트뷰에 있는 내용을 랜덤으로 추출 세실 2025-06-28
2699725 JMX 질문입니다. (1) 시나브로 2025-06-28
2699695 으으아으ㅏ으ㅏ 정말미쳐버리겟네요 진달래 2025-06-28
2699665 absolute에 대해서 궁금한게 있습니다 (1) 영빈이 2025-06-28
2699629 테마 적용이 잘 안됩니다. ㅠㅜ (2) 서희 2025-06-27
2699601 html코딩 브라우져 확인 할때.. (5) 에드워드 2025-06-27
2699575 [질문] 고수님들...가르쳐주세염....renameTo에 관하여 일본드립 2025-06-27
2699547 [급]레이어보다 object태그가 우선순위가 되는 문제 (5) DevilsTears 2025-06-27
2699518 javaScript중복체크 하는법좀.. 알려주세요 (3) 비 2025-06-26
2699495 이런 탭메뉴를 뭐라고 해야 하는지 모르겠네요 (1) 들빛 2025-06-26
2699380 메뉴가 계단식으로 나타나요.. ㅠ.ㅠ (5) 스릉흔다 2025-06-25
<<  이전  1 2 3 4 5 6 7 8 9 10  다음  >>

수다닷컴 | 여러분과 함께하는 수다토크 커뮤니티 수다닷컴에 오신것을 환영합니다.
사업자등록번호 : 117-07-92748 상호 : 진달래여행사 대표자 : 명현재 서울시 강서구 방화동 890번지 푸르지오 107동 306호
copyright 2011 게시글 삭제 및 기타 문의 : clairacademy@naver.com