동방프로젝트(이하 동프)를 분석하고 오토봄을 만들어 보자!
(코딩편) - 피탄을 감지 하자!
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키를 누르는 부분입니다(아직 키를 누르는 곳은 구현 되지않음)
자세한 내용을 원하실 경우 댓글로 질문 해주세요.
'잡글 > 덕질관련' 카테고리의 다른 글
동방프로젝트(풍신록) 오토봄 만들기 (4) (0) | 2017.11.13 |
---|---|
동방프로젝트(풍신록) 오토봄 만들기 (3) (0) | 2017.11.12 |
동방프로젝트(풍신록) 오토봄 만들기 (2) (2) | 2017.11.09 |
동방프로젝트(풍신록) 오토봄 만들기 (1) (0) | 2017.11.08 |
WRITTEN BY
- Dukup11ch1
무근본, 실력 0, 아는척하기위한 블로그. 저는 귀엽습니다
,