본문 바로가기

자료

Python과 치트 엔진을 이용한 게임 해킹

728x90

안녕. 이 글에서는 치트 엔진으로 메모리를 편집하여 게임을 해킹하는 방법을 보여주고 자동으로 메모리를 편집하고 해킹을 수행하는 Python 프로그램을 작성하는 방법을 보여 드리겠습니다. 게임 해킹을 배우는 동안 Python을 사용한 게임 해킹과 C++에 대한 자세한 내용에 대한 리소스가 거의 없다는 것을 알았습니다. 하지만 저는 파이썬 팬이기 때문에 정말 좋은 파이썬 모듈의 도움으로 직접 배웠습니다. 시작하자

치트 엔진을 사용하여 메모리 주소 찾기

이 데모에서는 ultrakill이라는 게임을 해킹할 것입니다. 우리가 시도할 것은 건강을 수정하고 우리 자신에게 많은 건강을 제공하는 것입니다. 그래서 우리는 ultrakill을 부팅하고 여기에 치트 엔진을 연결하여 시작합니다.

게임을 시작하면 시작 시 체력이 200인 것을 볼 수 있습니다.

이제 우리가 해야 할 일은 이 상태를 담당하는 메모리 주소를 찾는 것입니다. 치트 엔진에서는 int 값 200을 검색합니다.

값이 200인 3,802개의 메모리 주소가 제공되었음을 알 수 있습니다. 범위를 더 좁힐 필요가 있습니다. 따라서 게임에서는 앞에 있는 산탄총 폭발물을 사용하여 체력을 수정하겠습니다.

이제 체력은 165입니다. 이제 이전에 찾은 주소 목록을 스캔하고 해당 값 중 165로 변경된 것이 있는지 살펴보겠습니다. 다음 스캔을 사용하면 이를 수행할 수 있습니다.

이제 주소는 1개뿐입니다. 주소 목록에 추가하려면 두 번 클릭하세요. 이를 변경하여 이것이 건강의 메모리 주소임을 확인할 수 있습니다. 이를 변경하면 게임 내 건강도 변경되어야 합니다.

그러면 주소 값을 300으로 변경하고 게임 내 체력도 300이 되는 것을 볼 수 있습니다. 노이스

상태 주소를 가리키는 정적 포인터 찾기

이제 건강 주소를 찾았지만 이는 고정된 주소가 아닙니다. 게임을 다시 로드하거나 다시 시작하면 이 주소는 유효하지 않게 됩니다. 그래서 우리가 해야 할 일은 건강의 기억을 가리키는 정적 주소를 찾는 것입니다. 이 주소에 대한 상태 및 포인터 검색의 메모리 주소를 마우스 오른쪽 버튼으로 클릭하면 이를 수행할 수 있습니다. 기본 설정은 이미 양호하므로 확인을 클릭하세요. 시간이 좀 걸릴 수 있습니다.

많이 발견한 것을 알 수 있습니다. 우리는 이것을 좁혀야 합니다. 이를 위해서는 게임을 다시 시작하고 이 글의 첫 번째 부분에 따라 상태 주소를 찾아야 합니다.

이제 이미 완료했고 주소는 0x173AC32475C입니다.

이제 다음에 해야 할 일은 포인터 스캔 창으로 돌아가서 포인터 스캔을 클릭한 다음 메모리를 다시 스캔하는 것입니다. 새 주소를 붙여넣고 확인을 클릭하세요.

이제 14958이 있습니다. 이전 스캔보다 적습니다. 프로세스를 다시 반복하여 포인터 경로를 낮추거나 다음 부분으로 진행할 수 있습니다. 이 예에서는 더 이상 스캔하지 않겠습니다.

이제 다음 단계를 위해 추측을 해야 합니다. 이 주소 중 실제로 주소를 가리키는 주소는 무엇입니까? 따라서 임의의 포인터를 두 번 클릭하겠습니다. 참고로 스레드 스택은 무시하십시오. 4가지 값을 골랐어요

이제 이러한 포인터가 실제로 상태를 가리키는지 테스트해 보겠습니다. 게임을 다시 시작하면 됩니다.

게임을 다시 시작한 후에도 해당 값이 여전히 게임 내 상태와 일치하는 것을 볼 수 있습니다. 즉, 모두 실제로 상태 주소를 가리킨다는 의미입니다. 이제 해당 주소 중 하나를 선택할 수 있지만 저는 첫 번째 주소를 선택하겠습니다. 값을 수정하여 이것이 건강을 가리키는 포인터임을 추가로 확인할 수 있습니다.

이제 우리는 이 포인터가 게임의 건강 주소를 가리킨다는 것을 100% 확신합니다. 두 번 클릭하면 다단계 포인터임을 알 수 있습니다.

Python 스크립팅

이제 이 부분에서는 이 포인터에 액세스하고 그것이 가리키는 메모리 주소에 액세스하고 Python을 사용하여 수정합니다. 내가 테스트한 모든 라이브러리 중에서 이것이 유일하게 작동했기 때문에 우리는 이 글을 위해 pymeow를 사용할 것입니다. 여기에서 pymeow를 다운로드할 수 있습니다 https://github.com/qb-0/PyMeow

그래서 우리는 새로운 스크립트를 만들고 라이브러리를 가져오는 것부터 시작하겠습니다.

그 후에 코딩을 시작할 수 있습니다. https://github.com/qb-0/PyMeow/blob/master/cheatsheet.txt 에 대한 pymeow의 치트시트를 따르겠습니다.

프로세스를 가져오는 방법에는 process_by_name과 process_by_pid의 두 가지 방법이 있습니다. 더 쉽기 때문에 process_by_name을 사용하겠습니다.

여기에 ULTRAKILL.exe 프로그램의 이름을 전달했습니다.

이제 포인터의 기본 주소를 얻어야 합니다.

우리의 경우 기본 주소는 “mono-2.0-bdwgc.dll”+004A1820입니다. 따라서 먼저 mono-2.0-bdwgc.dll의 주소를 가져와서 여기에 0x004A1820을 추가하여 기본 주소를 가져와야 합니다. pymeow에서 Process 객체에는 모든 모듈을 포함하는 모듈이라는 사전이 있으며 해당 모듈도 사전이며 baseaddr이라는 매개변수가 있습니다.

이제 우리가 원하는 것은 mono-2.0-bdwgc.dll의 기본 주소를 얻고 process[“modules”][“mono-2.0-bdwgc.dll”][“baseaddr”]를 사용하여 액세스할 수 있는 것입니다. 포인터의 기본 주소를 얻기 위해 여기에 0x017C58C0을 추가합니다.

치트 엔진에서 이 주소가 올바른지 확인할 수 있습니다.

이제 오프셋을 처리해야 합니다. 먼저 오프셋이 어떻게 작동하고 어떻게 처리할지 설명하겠습니다.

여기서는 7개의 오프셋이 있음을 알 수 있습니다. 아래에서 첫 번째 주소는 0x7ff920af1820임을 알 수 있습니다. 그런 다음 첫 번째 오프셋인 140이 나왔습니다. 이는 첫 번째 주소인 0x7ff920af1820에 0x140바이트를 추가한 다음 오프셋이 있는 해당 주소의 값을 가져오는 것입니다. 이제 해당 주소는 다른 포인터를 가리키고 다시 사용자 상태의 실제 메모리 주소인 마지막 부분에 도달할 때까지 해당 포인터에 0x1F0 바이트를 추가합니다. 이제 코드에서 구현해 보겠습니다.

pymeow에는 포인터_체인 메서드가 있지만 작동하지 않으므로 대신 자체 함수를 구현하겠습니다.

나는 read_offsets라는 함수를 생각해 냈습니다. 3개의 인수가 필요합니다. 첫 번째는 프로세스인 proc이고, 두 번째는 기본 주소이고, 세 번째는 오프셋 배열입니다. 4번째 줄에서는 기본 주소의 포인터를 가져옵니다. 6행에서는 기준점 변수에서 current_pointer라는 새 변수를 만듭니다. 그런 다음 마지막 문자를 제외한 모든 오프셋을 반복하여 수행합니다. current_pointer+offset에서 포인터를 읽고 다음 반복을 위해 current_pointer 값을 설정합니다. 그런 다음 마지막 부분에서는 최종 포인터를 반환합니다.

우리는 64비트 프로그램을 작업 중이고 64비트 프로그램의 메모리 주소가 8바이트이므로 read_int64를 사용합니다. 이제 작동하면 시도해 보겠습니다.

내 코드의 배열에 오프셋을 매핑했습니다. 이제 실행해 보겠습니다.

작동하는 것을 볼 수 있으며 치트 엔진에서 이전에 설정한 체력 값인 1337 값을 얻었습니다. 이제 write_int를 사용하여 해당 주소를 수정해 보겠습니다.

이제 다시 게임으로 돌아가면,

성공적으로 완료되어 이제 건강 상태가 200이 된 것을 확인할 수 있습니다.

 
728x90

'자료' 카테고리의 다른 글

VB.NET/C# FLAT UI Theme/Form Skin  (0) 2023.07.26
Mega 할당량초과 무시 다운로드 방법 프로그램 공유  (2) 2023.07.17
네이버 로그인 소스코드  (0) 2023.04.06
CryptoJS PHP 통신  (0) 2023.03.23
JS,PHP CryptoJS  (0) 2023.03.23