Game - Sử dụng dnSpy để cheat game Hammerwatch
Chào các bạn, các tựa game hiện nay khá dễ dàng để tinh chỉnh các đoạn mã và khiến cho các nhân vật trong game trở nên mạnh mẽ trái với các quy luật đặt ra bởi game. Nhưng, đối với một số người thích tò mò thì điều đó không thể ngăn cản sự tò mò khiến cho game trở nên thú vị hơn. Do đó, mình sẽ giới thiệu các bạn đến công cụ dnSpy và cách sử dụng để cheat game Hammerwatch với vài bước dễ dàng.
Hammerwatch là một tựa game dạng phiêu lưu hành động RPG có đồ họa Pixel với góc nhìn 2D và được sản xuất bởi studio Crackshell. Trong trò chơi, bạn sẽ hóa thân là một hiệp sĩ vào trong các hang động để đánh bại hàng tá quái vật xuất hiện và giành lấy nhiều kho báu có giá trị. Đây sẽ là một tựa game đòi hỏi người chơi có kỹ năng tốt để có thể tránh các đòn tấn công của quái vật và sống sót nhiều nhất có thể.
Hammerwatch được phát triển trên nền tảng Mono (là một framework của C# dạng cộng đồng, hỗ trợ rất mạnh đối với các thư viện game như Unity, Xamarin). Do đó, chúng ta sử dụng công cụ dnSpy phục vụ mục đích dịch ngược các đoạn code C# và phân tích các hàm được sử dụng trong game.
Đầu tiên, chúng ta tải công cụ dnSpy theo liên kết này. Vào trong thư mục dnSpy, chạy file dnSpy.exe. Chúng ta sẽ thấy giao diện công cụ giống với IDE Visual Studio Community của Microsoft. Ở thanh menu bar, chọn File và nhấn vào Open và tìm kiếm file Hammerwatch.exe để phân tích file dưới dạng cây thư mục.
Chúng ta có thể kiểm tra các hàm mà file game thực hiện như các hàm Attack, Damaged, OnDamaged, ...v.v. Chúng ta thử tìm kiếm hàm Damaged của class Ranger dưới dạng ARPGGame.Behaviors.Player.Ranger và sẽ thấy đoạn code như hình dưới.
Lớp Ranger được kế thừa bởi một lớp cha - PlayerRangerActorBehavior, chứa các thuộc tính và hành vi của nhân vật Ranger trong game. Lớp con này chứa một hàm gọi là Damaged kiểm soát các tính toán và số liệu bị gây tổn thương cho người chơi.
Hầu hết các công việc được thực hiện trong lớp cơ sở, nhưng lớp Ranger có thể tránh các đòn đánh tùy thuộc vào một trình tạo số ngẫu nhiên. Tuy nhiên, một mánh gian lận khiến nhân vật có thể bất tử bằng cách dán đoạn code và khiến cho hàm trả về giá trị sai. Trên thanh menu bar, chọn Edit và nhấn vào phần Edit class thay thế thành đoạn code dưới đây.
Thú vị hơn khi chúng ta còn có thể thay đổi tầm đánh của lớp Ranger. Chức năng này hoạt động bằng cách bắt đầu một số hình ảnh động được gọi là ShootArrow theo hướng nhân vật đang đối mặt và game sẽ được cập nhật theo hành động này.
Bằng cách thay thế hàm gọi đến ShootArrow bằng một hàm tùy chỉnh, chúng ta có thể sửa đổi hàm Attack mũi tên bắn mặc định bằng một hàm Attack tùy chỉnh có phần bá đạo hơn. Đòn tấn công này bắn ra nhiều mũi tên trong một vòng tròn hoàn hảo xung quanh người chơi, được đặt tên thích hợp là Mưa tên (RanningArrow).
Qua những cách thức gian lận đã nêu trên, cơ chế hoạt động của game còn khá đơn giản và dễ bị sửa đổi bởi người chơi. Đối với những nhà làm game, tăng cường bảo mật cho các đoạn code cũng là một điều tốt để tránh việc các đoạn code bị sửa đổi một cách dễ dàng gây mất cân bằng trò chơi.
Giới thiệu
Hammerwatch là một tựa game dạng phiêu lưu hành động RPG có đồ họa Pixel với góc nhìn 2D và được sản xuất bởi studio Crackshell. Trong trò chơi, bạn sẽ hóa thân là một hiệp sĩ vào trong các hang động để đánh bại hàng tá quái vật xuất hiện và giành lấy nhiều kho báu có giá trị. Đây sẽ là một tựa game đòi hỏi người chơi có kỹ năng tốt để có thể tránh các đòn tấn công của quái vật và sống sót nhiều nhất có thể.
Hammerwatch được phát triển trên nền tảng Mono (là một framework của C# dạng cộng đồng, hỗ trợ rất mạnh đối với các thư viện game như Unity, Xamarin). Do đó, chúng ta sử dụng công cụ dnSpy phục vụ mục đích dịch ngược các đoạn code C# và phân tích các hàm được sử dụng trong game.
Thực hành
Bước 1: Mở file game Hammerwatch bằng dnSpy
Đầu tiên, chúng ta tải công cụ dnSpy theo liên kết này. Vào trong thư mục dnSpy, chạy file dnSpy.exe. Chúng ta sẽ thấy giao diện công cụ giống với IDE Visual Studio Community của Microsoft. Ở thanh menu bar, chọn File và nhấn vào Open và tìm kiếm file Hammerwatch.exe để phân tích file dưới dạng cây thư mục.
Hình 01: Giao diện dnSpy |
Bước 2: Kiểm tra các hàm trong file game
Chúng ta có thể kiểm tra các hàm mà file game thực hiện như các hàm Attack, Damaged, OnDamaged, ...v.v. Chúng ta thử tìm kiếm hàm Damaged của class Ranger dưới dạng ARPGGame.Behaviors.Player.Ranger và sẽ thấy đoạn code như hình dưới.
Hình 02: Hàm Damaged của lớp Ranger |
Lớp Ranger được kế thừa bởi một lớp cha - PlayerRangerActorBehavior, chứa các thuộc tính và hành vi của nhân vật Ranger trong game. Lớp con này chứa một hàm gọi là Damaged kiểm soát các tính toán và số liệu bị gây tổn thương cho người chơi.
Bước 3: Thay đổi hàm Damaged của lớp Ranger
Hầu hết các công việc được thực hiện trong lớp cơ sở, nhưng lớp Ranger có thể tránh các đòn đánh tùy thuộc vào một trình tạo số ngẫu nhiên. Tuy nhiên, một mánh gian lận khiến nhân vật có thể bất tử bằng cách dán đoạn code và khiến cho hàm trả về giá trị sai. Trên thanh menu bar, chọn Edit và nhấn vào phần Edit class thay thế thành đoạn code dưới đây.
public override bool Damaged(WorldObject attacker, int dmg, IBuff buff, bool canKill)
{
this.dodgeEffectColor = 1f;
this.dodgeSnd.Play3D(this.actor.Position, false, -1f);
Network.SendToAll("RangerDodged", new object[0]);
return false;
}
Hình 03: Nhân vật Ranger không hề nhận bất kỳ sát thương nào khi bị quái vật tấn công |
Bước 4: Thay đổi hàm Attack của lớp Ranger
Thú vị hơn khi chúng ta còn có thể thay đổi tầm đánh của lớp Ranger. Chức năng này hoạt động bằng cách bắt đầu một số hình ảnh động được gọi là ShootArrow theo hướng nhân vật đang đối mặt và game sẽ được cập nhật theo hành động này.
Hình 04: Hàm Attack của lớp Ranger |
Bằng cách thay thế hàm gọi đến ShootArrow bằng một hàm tùy chỉnh, chúng ta có thể sửa đổi hàm Attack mũi tên bắn mặc định bằng một hàm Attack tùy chỉnh có phần bá đạo hơn. Đòn tấn công này bắn ra nhiều mũi tên trong một vòng tròn hoàn hảo xung quanh người chơi, được đặt tên thích hợp là Mưa tên (RanningArrow).
public void RainingArrow(int numOfArrows)
{
for (int arrow = 0; arrow < numOfArrows; arrow++)
{
float angle = 6.28318548f / (float)numOfArrows * (float)arrow;
Vector2 newDirection = new Vector2((float)Math.Cos((double)angle), (float)Math.Sin((double)angle));
ShootArrow(newDirection);
}
}
Tóm tắt
Qua những cách thức gian lận đã nêu trên, cơ chế hoạt động của game còn khá đơn giản và dễ bị sửa đổi bởi người chơi. Đối với những nhà làm game, tăng cường bảo mật cho các đoạn code cũng là một điều tốt để tránh việc các đoạn code bị sửa đổi một cách dễ dàng gây mất cân bằng trò chơi.