동방프로젝트(이하 동프)를 분석하고 오토봄을 만들어 보자!

(코딩편) - 피탄을 감지 하자!


0. 동방프로세스를 읽어온다.

1. readprocessmemory를 통해 0x477834에 있는 ebp값을 받아온다.

2. readprocessmemory를 통해 ebp+478에 있는 값을 실시간으로 받아온다.

3. 읽어온 값이 02면 'x'키를 입력하여 봄을 사용하게 한다.

4. 1부터 반복

저번에 이야기 했던 코딩 계획입니다.

이번에는 0~2까지만 하겠습니다.


#include "stdio.h"
#include "windows.h"
#include "tlhelp32.h"
#include "stdlib.h"

#pragma warning(disable : 4996)
#define DEF_PROC_NAME ("th10.exe")

DWORD FindProcessID(LPCTSTR szProcessName);
BOOL hack_start(DWORD dwPID);

int main(int argc, char* argv[])
{
	for (;;) {
		int a;
		printf("풍신록 오토봄 프로그램입니다. 풍신록을 실행 후 '1'을 입력해 주세요. ");
		scanf("%d",&a);
		if (a == 1)break;
		else printf("잘못된 값 입니다.");
	}
	DWORD dwPID = 0xFFFFFFFF;

	// find process
	dwPID = FindProcessID(DEF_PROC_NAME);
	if (dwPID == 0xFFFFFFFF)
	{
		printf("풍신록 감지 실패\n");
		system("pause");
		return 1;
	}
	
	if (!hack_start(dwPID))printf("메모리 구하기 실패\n");
	system("pause");
	return 0;
}

DWORD FindProcessID(LPCTSTR szProcessName)
{
	DWORD dwPID = 0xFFFFFFFF;
	HANDLE hSnapShot = INVALID_HANDLE_VALUE;
	PROCESSENTRY32 pe;

	// Get the snapshot of the system
	pe.dwSize = sizeof(PROCESSENTRY32);
	hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);

	// find process
	Process32First(hSnapShot, &pe);
	do
	{
		if (!_stricmp(szProcessName, pe.szExeFile))
		{
			dwPID = pe.th32ProcessID;
			break;
		}
	} while (Process32Next(hSnapShot, &pe));

	CloseHandle(hSnapShot);

	return dwPID;
}

BOOL hack_start(DWORD dwPID)
{
	HANDLE hProcess;

	// #1. dwPID 를 이용하여 대상 프로세스(th10.exe)의 HANDLE을 구함
	if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)))
		return FALSE;
	
	for (;;) {
		DWORD address = { 0x477834 };
		DWORD buffer = 0;
		bool uak = false;
		//메모리에 저장된 EBP값 읽어옴
		ReadProcessMemory(hProcess, (LPVOID)address, &buffer, 16, NULL);
		
		//메모리에 저장된 피탄 후 프레임 카운트를 받음
		address = { buffer + 0x478 };
		//프레임 카운트 읽어옴
		ReadProcessMemory(hProcess, (LPVOID)address, &buffer, 16, NULL);
		if (buffer == 0&&!uak) {
			printf("피탄감지!\n");

			uak = true;
			
			//SendMessage((HWND)hProcess, WM_KEYDOWN, 0x50, 0);
			continue;
		}
		if (buffer != 2 && uak) {
			uak = false;
			//SendMessage((HWND)hProcess, WM_KEYUP, 0x50, 0);
		}

	}
	return TRUE;
}


미완성 소스지만 이번 글을 쓰기에는 충분 한 소스입니다.



일단 사용한 주요함수부터 알아 봅시다.

1. ReadProcessMemory : 말 그대로 입니다. 지정된 프로세스의 메모리를 읽어 오는 함수 입니다.


2. FindProcessID : http://reversecore.com/40에서 가져온 함수 입니다. 프로세스의 PID를 찾아주는 역할을 합니다



각 파트별로 설명하겠습니다.


	DWORD dwPID = 0xFFFFFFFF;

	// find process
	dwPID = FindProcessID(DEF_PROC_NAME);
	if (dwPID == 0xFFFFFFFF)
	{
		printf("풍신록 감지 실패\n");
		system("pause");
		return 1;
	}

풍신록이 실행 중인지 확인 합니다. 


DWORD FindProcessID(LPCTSTR szProcessName)
{
	DWORD dwPID = 0xFFFFFFFF;
	HANDLE hSnapShot = INVALID_HANDLE_VALUE;
	PROCESSENTRY32 pe;

	// Get the snapshot of the system
	pe.dwSize = sizeof(PROCESSENTRY32);
	hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);

	// find process
	Process32First(hSnapShot, &pe);
	do
	{
		if (!_stricmp(szProcessName, pe.szExeFile))
		{
			dwPID = pe.th32ProcessID;
			break;
		}
	} while (Process32Next(hSnapShot, &pe));

	CloseHandle(hSnapShot);

	return dwPID;
}

프로세스 목록을 확인 한 뒤 제가 찾는 프로세스(th10.exe)를 찾아 PID를 가져옵니다.


BOOL hack_start(DWORD dwPID)
{
	HANDLE hProcess;

	// #1. dwPID 를 이용하여 대상 프로세스(th10.exe)의 HANDLE을 구함
	if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)))
		return FALSE;
	
	for (;;) {
		DWORD address = { 0x477834 };
		DWORD buffer = 0;
		bool uak = false;
		//메모리에 저장된 EBP값 읽어옴
		ReadProcessMemory(hProcess, (LPVOID)address, &buffer, 16, NULL);
		
		//메모리에 저장된 피탄 후 프레임 카운트를 받음
		address = { buffer + 0x478 };
		//프레임 카운트 읽어옴
		ReadProcessMemory(hProcess, (LPVOID)address, &buffer, 16, NULL);
		if (buffer == 0&&!uak) {
			printf("피탄감지!\n");

			uak = true;
			
			//SendMessage((HWND)hProcess, WM_KEYDOWN, 0x50, 0);
			continue;
		}
		if (buffer != 2 && uak) {
			uak = false;
			//SendMessage((HWND)hProcess, WM_KEYUP, 0x50, 0);
		}

	}
	return TRUE;
}

피탄을 감지하고 x키를 누르는 부분입니다(아직 키를 누르는 곳은 구현 되지않음)

자세한 내용을 원하실 경우 댓글로 질문 해주세요.


WRITTEN BY
Dukup11ch1
무근본, 실력 0, 아는척하기위한 블로그. 저는 귀엽습니다

,