동방프로젝트(이하 동프)를 분석하고 오토봄을 만들어 보자!
(코딩편) - 피탄을 감지 하자!
0. 동방프로세스를 읽어온다.
1. readprocessmemory를 통해 0x477834에 있는 ebp값을 받아온다.
2. readprocessmemory를 통해 ebp+478에 있는 값을 실시간으로 받아온다.
3. 읽어온 값이 02면 'x'키를 입력하여 봄을 사용하게 한다.
4. 1부터 반복
저번에 이야기 했던 코딩 계획입니다.
이번에는 0~2까지만 하겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | #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를 찾아주는 역할을 합니다
각 파트별로 설명하겠습니다.
1 2 3 4 5 6 7 8 9 10 | DWORD dwPID = 0xFFFFFFFF; // find process dwPID = FindProcessID(DEF_PROC_NAME); if (dwPID == 0xFFFFFFFF) { printf ( "풍신록 감지 실패\n" ); system ( "pause" ); return 1; } |
풍신록이 실행 중인지 확인 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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를 가져옵니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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, 아는척하기위한 블로그. 저는 귀엽습니다