Hệ điều hành Windows có rất nhiều những công cụ phục vụ cho nhu cầu học tập, công việc hay giải trí. Vì thế, các nhà lập trình của Microsoft dành thời gian viết ra các phần mềm, đặc biệt là các game giải trí dành cho giới văn phòng và nổi bật nhất là Minesweeper. Hôm nay, mình sẽ hướng dẫn các bạn cách gian lận trò chơi Minesweeper này.
Chuẩn bị
Các bạn cần chuẩn bị những công cụ để thực hiện việc gian lận game Minesweeper:
Thực hành
OllyDBG
Đầu tiên, chúng ta mở game và nhấn thử một ô bất kỳ trong các ô vuông trong game Minesweeper. Sau đó các bạn cứ để thời gian trong game nó chạy và các bạn mở OllyDBG lên và xem các thanh ghi trong game.
|
Cửa sổ OllyDBg |
Chúng ta nhìn vào
menu bar của phần mềm OllyDBG, chọn
View Memory và nó sẽ hiện ra các dòng dữ liệu dưới dạng mã hex. Chúng ta tìm tới chỗ
minesam .data và chuột phải chọn
Dump để dump dữ liệu trong file đó ra. Chúng ta sẽ tìm tới dòng có số là
10005340 để xác định dữ liệu trong game được lưu vào trong thanh ghi.
|
Cửa sổ Dump |
Chúng ta nhìn vào
menu bar chọn
View ->
CPU sẽ hiện cửa sổ các thanh ghi chứa các dữ liệu và các tiến trình trong game. Chúng ta tiếp tục chọn
Debug ->
Run để chạy chương trình ở chế độ debug.
|
Cửa sổ CPU |
Chúng ta thử click vào ô bất kỳ trong game, khi đó dữ liệu trong thanh ghi cũng sẽ thay đổi theo. Do đó, chúng ta biết được game sẽ được lưu vào trong bộ nhớ RAM.
|
Cửa sổ game |
Chúng ta có thể đọc được RAM, chúng ta có thể gian lận nó trong game. Các bạn lưu ý là cái dòng
0A 00 00 00 09 00 00 00 09 00 00 00 là chuỗi byte bảng game trong RAM, chúng ta có thể dùng phần mềm để dump dữ liệu ra và thay đổi dữ liệu trong đó.
Procdump
Chúng ta tắt trò chơi, mở Procdump ra gõ
procdump –ma Minesweeper.exe mine để dump ra một file khác có tên là
mine.dmp
|
Cửa sổ cmd |
HxD
Mở HxD và chọn file
mine.dmp để mở. Sau đó, chúng ta nhấn tổ hợp phím
Ctrl+F, chọn tab
Hex-Value và gõ
0A 00 00 00 09 00 00 00 09 để tìm chuỗi byte trong thanh RAM.
|
Cửa sổ HxD |
Chúng ta chọn
Search ->
Find Again để tìm dữ liệu của bảng game.
|
Cửa sổ HxD |
Python
Chúng ta sẽ thực hiện một đoạn code python để hiển thị các "trái mìn" trong bảng game.
import os
# Dump memory
cmd = "del mine.dmp"
os.system(cmd)
cmd = "procdump -ma minesam.exe mine"
os.system(cmd)
# Find gameboard
mark ='\x0A\x00\x00\x00\x09\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x10\x10\x10\x10'
nread = 20
boardfound = 0
gameboard = []
with open("mine.dmp", "rb") as f:
line = f.read(20)
while (boardfound == 0):
c = f.read(1)
if c == "":
print "File ended, but gameboard not found!"
exit()
line = line[1:] + c
nread += 1
if nread % 0x100000 == 0:
print "Looking at byte", hex(nread), nread
if line == mark:
print "Gameboard found at ", hex(nread)
boardfound = 1
for i in range(4):
gameboard.append('\x10')
for i in range(500):
gameboard.append(f.read(1))
# Print Gameboard
l = len(gameboard)
m = 32 # items per line
for i in range(0, l-m, m):
line = ""
for j in range(m):
g = gameboard[i+j]
# print i, j, ord(g)
if g == '\x10':
c = "-"
elif g == '\x0f':
c = " "
elif g == '\x8f':
c = "*"
elif g == '\x00':
c = " "
else:
c = chr( ord(g) - 16 )
line += c
print line
Chúng ta chạy file python bằng câu lệnh
python cheat.py để thực hiện đoạn cheat. Chúng ta sẽ thấy những dấu sao, đó là nơi sẽ có những trái mìn. Chúng ta cứ theo đó và làm theo trò chơi và chúng ta sẽ hoàn thành game một cách nhanh nhất.
|
Hoàn thành game |
Tóm tắt
Chúng ta đã hoàn thành hack game Minesweeper ở chế độ
dễ nhất. Chúng ta sử dụng những phần mềm có thể debug được phần mềm, dump dữ liệu và xem nó được lưu ở đâu trong game. Với một chút kiến thức lập trình, chúng ta có thể dễ dàng lấy dữ liệu trong game ra và gian lận một cách dễ dàng. Qua các bài sau, mình sẽ thực hiện demo với các mức độ cao hơn.