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)
2.初回探索(現在の資源金貨は10,000枚)
3. 資源を活用する(発電所を建設する)
3.第二探索(現在の資源金貨は9200枚)
4. 変更値 99999999 を入力し、ゲーム リソースを 99999999 に変更します。
[注意:] ゲームリソースの金貨を変更した後、金貨のリソースはすぐに更新されず、再度金貨のリソースを使用する必要があります。その後、ゲームのリソースは更新されます。
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;
}
記事はオリジナルであり、許可なく複製することはできません。転載する前にブログに連絡して許可を得てください。この記事は学習とコミュニケーションのみを目的としています。