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.




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.


hinh01-giao-dien-dnSpy
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.


hinh02-ham-damaged-cua-lop-ranger
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;
}


hinh03-nhan-vat-ranger-khong-he-nhan-bat-ky-sat-thuong-nao-khi-bi-quai-vat-tan-cong
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.


hinh04-ham-attack-cua-lop-ranger
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.
Next Post Previous Post
No Comment
Add Comment
comment url