🧼C, C++/WinAPI, UX(UI)
무한HP 핵 만들기 Win32API
안녕하세요!
이번에는 저가 예전에 만들었던
RPG 게임 "Monster Beat v1.0"을
Win32 API를 이용해서 무한 HP핵을 만들어보겠습니다!
[[ 참고자료 ]]
일단 오늘 준비물은 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("[ 시작의 마을 ]");
}
그리고 저가 추가로 저번에 올렸던 "프로세스 죽이기"에
대한 글에서 사용한 방법으로도 만들어봤습니다!
#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"));
}
그럼 오늘은 여기서 이만....!
감사합니다!!!
'🧼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 |
댓글