/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= { 0x900x90 }, 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, 0sizeof(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, 0sizeof(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

+ Recent posts