リソース修飾子

1 はじめに

「コマンド & コンカー: レッド アラート (3)」は、古典的なゲームとして、多くの人々の子供時代の思い出です。また、ブロガーのお気に入りの子供時代のゲームでもあります。このため、私は最近、ゲーム「レッド アラート」を再ダウンロードしました。 3のダウンロードアドレスは以下の通りです。


リンク: https://pan.baidu.com/s/1yCDmmmYpiDfW4TnwSGme9g?pwd=ajsi 
抽出コード: ajsi


この記事は、金貨と電力の無線変更のためのソース コードと関連チュートリアルに焦点を当てています。

2. クラック法

1. Red Alert 3 ゲーム プログラムのハンドルを取得します。

const char* text = "命令与征服:红色警报3";
    HWND hwnd = FindWindow(NULL, text);
    if (hwnd == NULL)
    {
        MessageBox(NULL, TEXT("RA3 is not found! ACanary must find it again!"), TEXT("crack_ra3"), MB_ICONSTOP);
        return 1;
    }

    DWORD pid;
    GetWindowThreadProcessId(hwnd, &pid);
    HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

2. ゲームのゴールド コインの初期値を使用して、ゴールド コインの値が保存されているアドレスを見つけます (デフォルトは 10,000 で、ゲーム開始インターフェイスで変更できます)。

多数のアドレスが見つかったので、これに基づいて検索を続ける必要があります。

    int value[1024] = { -1 };
    int value_input = 1;
    cout << "请输入需要寻找的值:";
    cin >> value_input;
    int ans[1024] = { 0 };
    int num = 0;
    for (int addr = 0x00000000; addr < 0x08000000; )
    {
        ReadProcessMemory(handle, (LPVOID)addr, &value, 4096, NULL);
        for (int i = 0; i < 1024; i++) {
            if (value[i] == value_input)
            {
                ans[num++] = addr + 4 * i;
                cout << num << " . 0x";
                printf("%x\n", addr + 4 * i);
            }
        }
        addr += 4096;
    }
    cout << "find addr number is: " << num << endl;

3. 金貨を使用します (建物を建てたり、兵士を訓練したりできますか? それは問題ではありません。主な目的は金貨の数を変更することです)

4. ステップ 2 で見つかったアドレスを走査し、アドレス格納値が現在の金貨の数であるアドレスをフィルターで除外し、アドレスの数がより小さい値に達するまでフィルターを停止します。

    int v = -1;
    int n = 0;
    int res[512];
    n = 10;
    while (n > 4) {
        n = 0;
        cout << "请输入需要寻找的值(设置的值不得为-1,即-1为退出查找):";
        cin >> value_input;
        for (int i = 0; i < num; i++)
        {
            ReadProcessMemory(handle, (LPVOID)ans[i], &v, 4, NULL);
            if (v == value_input)
            {
                res[n++]= ans[i];
                cout << n << " . 0x";
                printf("%x\n", ans[i]);
            }
        }
    }

5. 金貨格納アドレスの値を変更する

    int money = 1000000000;
    cout << "ACanary,what money do you want:";
    cin >> money;
    switch(n){
    case 1:
        WriteProcessMemory(handle, (LPVOID)res[0], &money, 4, NULL);
        break;
    case 2:
        WriteProcessMemory(handle, (LPVOID)res[0], &money, 4, NULL);
        WriteProcessMemory(handle, (LPVOID)res[1], &money, 4, NULL);
        break;
    case 3:
        WriteProcessMemory(handle, (LPVOID)res[0], &money, 4, NULL);
        WriteProcessMemory(handle, (LPVOID)res[1], &money, 4, NULL);
        WriteProcessMemory(handle, (LPVOID)res[2], &money, 4, NULL);
        break;
    case 4:
        WriteProcessMemory(handle, (LPVOID)res[0], &money, 4, NULL);
        WriteProcessMemory(handle, (LPVOID)res[1], &money, 4, NULL);
        WriteProcessMemory(handle, (LPVOID)res[2], &money, 4, NULL);
        WriteProcessMemory(handle, (LPVOID)res[3], &money, 4, NULL);
        break;
    }

プログラムハンドルを閉じて正常にクラックします

3. クラック試験

1. ゲームエンカウンターまたは LAN を開きます (初期リソースは 10000)

216cfd0f2a764e04a33e72f36e47a1d9.png

 

f4305f5d5ede4edb93536f719326f73f.png

 

 2.初回探索(現在の資源金貨は10,000枚)

b70c298183224acca71237dcc32aa27a.png

 3. 資源を活用する(発電所を建設する)

 

b4e4b0c26caa475599efd82774d95ccb.png

 3.第二探索(現在の資源金貨は9200枚)

a138fee74e224b32b2bba9197ac3036d.png

4. 変更値 99999999 を入力し、ゲーム リソースを 99999999 に変更します。

 [注意:] ゲームリソースの金貨を変更した後、金貨のリソースはすぐに更新されず、再度金貨のリソースを使用する必要があります。その後、ゲームのリソースは更新されます。

 

a6cca890adeb408eb7ec96e329515368.png

 4. 完全なコード (実行できない場合は、管理者として exe ファイルを実行する必要があり、権限が不十分です)

#include<iostream>
#include<Windows.h>
using namespace std;

int main()
{
    const char* text = "命令与征服:红色警报3";
    HWND hwnd = FindWindow(NULL, text);
    if (hwnd == NULL)
    {
        MessageBox(NULL, TEXT("RA3 is not found! ywh must find it again!"), TEXT("crack_ra3"), MB_ICONSTOP);
        return 1;
    }

    DWORD pid;
    GetWindowThreadProcessId(hwnd, &pid);
    HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    if (!handle)
    {
        printf("ErrorCode=%x\n", GetLastError());
    }
    int value[1024] = { -1 };
    int value_input = 1;
    cout << "请输入需要寻找的值:";
    cin >> value_input;
    int ans[1024] = { 0 };
    int num = 0;
    for (int addr = 0x00000000; addr < 0x08000000; )
    {
        ReadProcessMemory(handle, (LPVOID)addr, &value, 4096, NULL);
        for (int i = 0; i < 1024; i++) {
            if (value[i] == value_input)
            {
                ans[num++] = addr + 4 * i;
                cout << num << " . 0x";
                printf("%x\n", addr + 4 * i);
            }
        }
        addr += 4096;
    }
    cout << "find addr number is: " << num << endl;
    int v = -1;
    int n = 0;
    int res[512];
    n = 10;
    while (n > 4) {
        n = 0;
        cout << "请输入需要寻找的值(设置的值不得为-1,即-1为退出查找):";
        cin >> value_input;
        for (int i = 0; i < num; i++)
        {
            ReadProcessMemory(handle, (LPVOID)ans[i], &v, 4, NULL);
            if (v == value_input)
            {
                res[n++]= ans[i];
                cout << n << " . 0x";
                printf("%x\n", ans[i]);
            }
        }
    }

    int money = 1000000000;
    cout << "ACanary,what money do you want:";
    cin >> money;
    switch(n){
    case 1:
        WriteProcessMemory(handle, (LPVOID)res[0], &money, 4, NULL);
        break;
    case 2:
        WriteProcessMemory(handle, (LPVOID)res[0], &money, 4, NULL);
        WriteProcessMemory(handle, (LPVOID)res[1], &money, 4, NULL);
        break;
    case 3:
        WriteProcessMemory(handle, (LPVOID)res[0], &money, 4, NULL);
        WriteProcessMemory(handle, (LPVOID)res[1], &money, 4, NULL);
        WriteProcessMemory(handle, (LPVOID)res[2], &money, 4, NULL);
        break;
    case 4:
        WriteProcessMemory(handle, (LPVOID)res[0], &money, 4, NULL);
        WriteProcessMemory(handle, (LPVOID)res[1], &money, 4, NULL);
        WriteProcessMemory(handle, (LPVOID)res[2], &money, 4, NULL);
        WriteProcessMemory(handle, (LPVOID)res[3], &money, 4, NULL);
        break;
    }

    CloseHandle(handle);
    return 0;
}

 記事はオリジナルであり、許可なく複製することはできません。転載する前にブログに連絡して許可を得てください。この記事は学習とコミュニケーションのみを目的としています。

 

 

 

おすすめ

転載: blog.csdn.net/HUANGliang_/article/details/128193442