Macで歩く「たのしいバイナリの歩き方」うさみみハリケーンの代わりに、Cheat Engine / Bit slicerを使用する
2026.04.12

どもです。
前回、「たのしいバイナリの歩き方」をMacで代替ツール使うとしたら、という感じでまとめさせていただきましたが、そのなかの今回は、うさみみハリケーンの代わりに、Cheat Engine / Bit slicerを使用してみた。という内容になります。
早速、ChatGPTさんにメモリ改竄用のゲーム作ってくれーとお願いしたところ、pygameのソースを出していただけました。
単純に落ちてくるオブジェクトをキャッチするとスコアが増えていきます。

このスコアをツールを用いてチートで変更していこうというもの。
まずはともあれpygameをインストール。
pip install pygame
shooting.py
import pygame
import random
pygame.init()
WIDTH = 600
HEIGHT = 400
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Cheat Engine Demo Shooter")
font = pygame.font.SysFont(None, 36)
player_x = WIDTH // 2
enemy_x = random.randint(0, WIDTH)
enemy_y = 0
score = 0
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player_x -= 5
if keys[pygame.K_RIGHT]:
player_x += 5
enemy_y += 3
if enemy_y > HEIGHT:
enemy_y = 0
enemy_x = random.randint(0, WIDTH)
# 当たり判定
if abs(player_x - enemy_x) < 30 and abs(350 - enemy_y) < 30:
score += 10
enemy_y = 0
enemy_x = random.randint(0, WIDTH)
screen.fill((0,0,0))
pygame.draw.rect(screen,(0,255,0),(player_x,350,40,20))
pygame.draw.rect(screen,(255,0,0),(enemy_x,enemy_y,20,20))
score_text = font.render(f"Score: {score}",True,(255,255,255))
screen.blit(score_text,(10,10))
pygame.display.update()
clock.tick(60)
pygame.quit()
実行。
python shooting.py
起動しました。
数行のPythonでゲームを起動できるpygameは素敵ですね。
というか、更にChatGPTさんにお願いすれば3分程で用意できる環境になったのは本当便利。
では、解析ツールのCheat Engineをインストールしていくのですが、普通ではインストールできませんね。メモリにアタッチしたりするのでCheat Engine自体がウィルスとして扱われます。
右クリックで開くだけではアプリは開けず、システム設定 > プライバシーとセキュリティで許可が必要。と起動するまでちょっと面倒な感じになっています。
やっとこさ起動したところになります。

UIもうさみみハリケーンぽいですね。
このまま使って行こうと思ったのですが、MacだとBit slicerの方がシンプルで使いやすかったのでBit slicerを使っていくことにしました。インストールもスムーズでした。
また、Python + Pygame のゲームだと、scoreの値が メモリ内に複数コピーされやすいためか全然値が絞れなかった。ので、値が絞りやすい様にC言語で簡単なゲームをChatGPTに作ってもらいました。
コンパイルはClangを使います。
hack_game.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
typedef struct {
int hp;
int ammo;
int score;
} Player;
Player *player;
void init_game() {
player = malloc(sizeof(Player));
player->hp = 100;
player->ammo = 30;
player->score = 0;
}
void print_status() {
printf("HP: %d | AMMO: %d | SCORE: %d\n",
player->hp,
player->ammo,
player->score);
}
int main() {
srand(time(NULL));
init_game();
printf("=== Memory Hack Practice Game ===\n");
printf("Process PID: %d\n", getpid());
printf("Use Bit Slicer to modify values!\n\n");
while (1) {
int r = rand() % 3;
if (r == 0) {
player->score += 10;
printf("Enemy destroyed!\n");
}
if (r == 1) {
player->hp -= 5;
printf("Player hit!\n");
}
if (r == 2) {
player->ammo -= 1;
printf("Shoot!\n");
}
print_status();
sleep(2);
}
}
clang hack_game.c -o hack_game
実行。
./hack_game
HP: 95 | AMMO: 29 | SCORE: 10 HP: 90 | AMMO: 28 | SCORE: 20
2秒ごとにランダムでHPが減ったり、アーマーが削れたり、スコアが増えたりゲームとし、scoreの値を変更していきます。
プログラムを実行し、プロセスをhack_gameに合わせ、まずは、HPのメモリを変更していきたいと思います。今のHPの値を検索すると、ヒットしました。しかも絞れましたので、3000に変更。

コンソールの方にも変更されたHP:3000の値が確認できます。

さらに現在のスコアを確認し、検索。

Address 0x101026048のValue264となっているのがスコアのメモリのようなので1000に変更すると、

スコアも変更されたのが確認できました。
というわけ簡単ではありますが、Macのほうではうさみみハリケーンは使えませんが、代替として、Cheat Engine または、 Bit slicerを使うことによって、メモリを改竄することができました。
また、その他の解析ツールも機会があればと。
ではではぁ。
またまた。










