🧼C, C++/WinAPI, UX(UI)

무한HP 핵 만들기 Win32API

Mawile 2020. 10. 18.
728x90

안녕하세요!

이번에는 저가 예전에 만들었던

RPG 게임 "Monster Beat v1.0"을

 

Win32 API를 이용해서 무한 HP핵을 만들어보겠습니다!


[[    참고자료   ]]

 

C++ 게임 [ MonsterBeat Ver.1 ]

안녕하세요~!~!~!~!~!~!!! Decode입니다! (이번에 닉변했어요 고정닉이걸로쓸려고요) 저가 이번에 C++ 콘솔게임을 하나 만들어가지고 버전업해나가면서 계속 배포할려구요 심심할때마다 한번씩 미니�

mawile.tistory.com

 

 

Cheat Engine

Downloads Read before download: Cheat engine is for educational purposes only. Before you attach Cheat Engine to a process, please make sure that you are not violating the EULA/TOS of the specific game/application. cheatengine.org does not condone the ille

www.cheatengine.org

 

 


일단 오늘 준비물은 CheatEngine이라는 프로그램인데

이 프로그램은 특정 프로세스의 메모리에 접근하고

그 메모리를 변조할 수 있고 마음껏 다룰 수 있도록 도와주는 프로그램입니다!

 

그럼 시작하겠습니다.....!!

 

 

[[[   프로세스 메모리 접근   ]]]

#include <iostream>
#include <windows.h>
using namespace std;

int main(){
	DWORD pid;
	HWND hwnd = FindWindow(0,"[  시작의 마을  ]");
	GetWindowThreadProcessId(hwnd,&pid);
}

 

 

우선 "windows.h"헤더파일을 추가해줍니다~

그다음 윈도우제목으로 프로세스를 찾습니다

Monster Beat의제목은 보시다시피

"[  시작의 마을  ]"로 되어있습니다

그렇기 때문에 FindWindow()함수로 찾아주시고

GetWindowThreadProcessId() 함수는 이거를 pid값으로 바꿔주는 함수입니다

그다음 이 pid값을 이용해서 프로세스가

성공 적으로 열렸는지 확인 하고 열어보겠습니다!

 

 

 

 

 

 

#include <iostream>
#include <windows.h>
using namespace std;

int main(){
	DWORD pid;
	HWND hwnd = FindWindow(0,"[  시작의 마을  ]");
	GetWindowThreadProcessId(hwnd,&pid);
	HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,0,pid);
	
	if(!handle) cout << "Process is not opened!";
	else cout << "Process is opened!";
	
	CloseHandle(handle);
}

위 사진처럼 성공적으로 열렸네요!

 

 

 

 

그러면 이제부터 본격적으로 메모리를 변조해볼 건데

메모리의 값을 바꾸려면 기본적으로 해당 프로세스 내에 있는 메모리 주소를 알아야 합니다

그러면 CheatEngine으로 넘어가 보도록 하겠습니다!

 

 

 

 

 

 

 

이 영상은 치트 엔진으로

"Monster Beat v1.0"의 HP 메모리 주소를 찾는 과정입니다!

 

치트엔진

다 찾으셨으면 "Address"부분에 있는 메모리 주소를 복사해서 앞에 "0x"를 붙이면 됩니다!

 

 

 

 

 

#include <iostream>
#include <windows.h>
using namespace std;

int main(){
	int HP=100;
	
	DWORD pid;
	HWND hwnd = FindWindow(0,"[  시작의 마을  ]");
	GetWindowThreadProcessId(hwnd,&pid);
	HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,0,pid);
	
	if(!handle) cout << "Process is not opened!";
	else cout << "Process is opened!";
	
	WriteProcessMemory(handle,(LPVOID)0x00474028,&HP,(DWORD)sizeof(HP),0);
    //WriteProcessMemory(핸들,메모리주소,값,값의크기,NULL);
	
	CloseHandle(handle);
}

 

이제 이것을 응용해서 무한 HP프로그램을 만들어보겠습니다!

 

 

#include <iostream>
#include <windows.h>
using namespace std;

void hp(const char name[]){
	int HP=100;
	
	DWORD pid;
	HWND hwnd = FindWindow(0,name);
	GetWindowThreadProcessId(hwnd,&pid);
	HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,0,pid);
	
	if(!handle) cout << "Process is not opened!";
	else cout << "Process is opened!";
	
	while(1) WriteProcessMemory(handle,(LPVOID)0x00474028,&HP,(DWORD)sizeof(HP),0);
	
	CloseHandle(handle);
}

int main(){
	hp("[  시작의 마을  ]");
}

 

 

 

 

 

그리고 저가 추가로 저번에 올렸던 "프로세스 죽이기"에

대한 글에서 사용한 방법으로도 만들어봤습니다!

 

프로세스 죽이기 Win32API

안녕하세요! Win32 API 관련 함수들을 소개하기 위해서 새로운 카테고리를 하나 더 만들었습니다~! Win32 API를 해본 결과 소켓이 함수 암기 20 이해 80이라면 이건 거의 함수암기80이해20이네요~ 함수 �

mawile.tistory.com

 

 

 

 

 

#include <iostream>
#include <windows.h>
#include <TlHelp32.h>
using namespace std;

bool hp(const char name[]){
	int HP=100;
	
	HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0),h;
	PROCESSENTRY32 proc = {0};
	proc.dwSize = sizeof(PROCESSENTRY32);
	
	Process32First(handle,&proc);
	
	while(1){
		if(!strcmp(proc.szExeFile,name)){
			h = OpenProcess(PROCESS_ALL_ACCESS,0,proc.th32ProcessID);
			cout << "Process is opened!";
			while(1) WriteProcessMemory(h,(LPVOID)0x00474028,&HP,(DWORD)sizeof(HP),0);
		}
		if(!Process32Next(handle,&proc)) break;
	}
	CloseHandle(h);
	CloseHandle(handle);
	return false;
}

int main(){
	while(!hp("monsterbeat1.exe"));
}

 

 

 

 

 

그럼 오늘은 여기서 이만....!

감사합니다!!!

728x90

'🧼C, C++ > WinAPI, UX(UI)' 카테고리의 다른 글

파일 자가복제 C++ #2  (0) 2020.11.23
WINAPI C++ #2  (0) 2020.11.07
WINAPI C++ #1  (0) 2020.11.04
프로세스 관리자권한으로 실행 Win32API  (0) 2020.10.15
프로세스 죽이기 Win32API  (0) 2020.10.15

댓글