/1. ac_client.exe 핸들 얻기
//2. ReadProcessMemory()로 0x4637E9부터 2바이트만큼 읽기
//3. 읽은 메모리가 { 0xFF, 0x0E }이면 WriteProcessMemory()로 0x4637E9부터 2바이트를 { 0x90, 0x90 }로 쓰기
//4. 게임 상에서 어떠한 점이 달라졌는지 확인하기
음...그동안 내가 짰던 코드를 이것저것 떼어와서 붙였더니 끔찍한 혼종이 되어버려따...
그러므로 3주차 과제부터는 코드를 다 새로 짜서 업로드할 예정입니당..
대략 코드 설명을 하자면 Read함수는 메모리를 읽어서 쓰는 역할이고
스크린 샷은 main함수에서 합니다.
그럼 이만ㅎㅅㅎ..!
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 | #include<stdio.h> #include<stdlib.h> #include<wchar.h> #include<Windows.h> #include<tlhelp32.h> #include <psapi.h> #pragma comment(lib, "psapi.lib") void Read(PROCESSENTRY32 *sub) { HANDLE openPro; SIZE_T readSize; BYTE buf1[3] = { 0x90, 0x90 }, buf2[20] = { 0 }; int errCode; openPro = OpenProcess(PROCESS_ALL_ACCESS, FALSE, sub->th32ProcessID); ReadProcessMemory(openPro, (LPCVOID)0x4637E9, buf2, 2, &readSize); if (buf2[0] == 0xFF && buf2[1] == 0x0E) { memset(buf2, 0, sizeof(buf2)); printf("값 바꾼 후..\n"); WriteProcessMemory(openPro, (LPVOID)0x4637E9, buf1, 2, &readSize); ReadProcessMemory(openPro, (LPCVOID)0x4637E9, buf2, 2, &readSize); printf("\n"); errCode = GetLastError(); printf("errCode : %d\n", errCode); } else printf("Error...?\n"); } int main() { HANDLE hProcessSnap; PROCESSENTRY32 processinform, sub; processinform.dwSize = sizeof(PROCESSENTRY32); sub.dwSize = sizeof(PROCESSENTRY32); hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) printf("CreateToolhelp32Snapshot error \n"); if (!Process32First(hProcessSnap, &processinform)) { printf("Process32First error ! \n"); CloseHandle(hProcessSnap); return 0; } printf("LIST> \n"); printf("\t\t[Process name \t[PID]\t[개수]\t[부모프로세스ID] \n"); do { wprintf(L"%25s %8d %8d %16d \n", //유니코드 출려과 아스키코드 출력은 다르므로 유니코드를 출력하는 wprintf를 사용해야함 processinform.szExeFile, processinform.th32ProcessID, processinform.cntThreads, processinform.th32ParentProcessID); } while (Process32Next(hProcessSnap, &processinform)); printf("프로세스 이름 입력 :"); memset(&sub, 0, sizeof(sub)); wscanf(L"%[^\n]s", &sub.szExeFile); //%[^\n]s : 개행이 오기전까지 입력받음 CloseHandle(hProcessSnap); hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) printf("CreateToolhelp32Snapshot error \n"); if (!Process32First(hProcessSnap, &processinform)) { printf("Process32First error ! \n"); CloseHandle(hProcessSnap); return 0; } while (Process32Next(hProcessSnap, &processinform)) { if (!wcscmp(sub.szExeFile, processinform.szExeFile)) { sub.th32ProcessID = processinform.th32ProcessID; sub.cntThreads = processinform.cntThreads; sub.th32ParentProcessID = processinform.th32ParentProcessID; printf("\t\t[Process name] \t[PID]\t[개수]\t[부모프로세스 ID] \n"); wprintf(L"%25s %8d %8d %16d \n", //유니코드 출려과 아스키코드 출력은 다르므로 유니코드를 출력하는 wprintf를 사용해야함 sub.szExeFile, sub.th32ProcessID, sub.cntThreads, sub.th32ParentProcessID); Read(&sub); } } CloseHandle(hProcessSnap); return 0; } | cs |
'@안티치트' 카테고리의 다른 글
프로세스 메모리 읽고 쓰기(ASLR) (0) | 2018.10.05 |
---|---|
다른 프로세스의 메모리 읽기 (0) | 2018.10.05 |
프로세스 메모리 읽어오기 (0) | 2018.10.05 |
START! (0) | 2018.10.05 |