Cheat Engine Tutorial (v3.4) - Step 9


PW=31337157
    Đây là một phần cuối của tutorial, cũng là phần rất là hay ho, nên ngoài việc dịch có tâm hơn 1 tí thì mình sẽ phân tích qua code để cho mọi thứ trở nên đơn giản và dễ hiểu nhất.

Step 9: Shared code: (PW=31337157)
This step will explain how to deal with code that is used for other object of the same type

Often when you've found health of a unit or your own player, you will find that if you remove the code, it affects enemies as well.
In these cases you must find out how to distinguish between your and the enemies objects.
Sometimes this is as easy as checking the first 4 bytes (Function pointer table) which often point to a unique location for the player, and sometimes it's a team number, or a pointer to a pointer to a pointer to a pointer to a pointer to a playername. It all depends on the complexity of the game, and your luck

The easiest method is finding what addresses the code you found writes to and then use the dissect data feature to compare against two structures. (Your unit(s)/player and the enemies) And then see if you can find out a way to distinguish between them.
When you have found out how to distinguish between you and the computer you can inject an assembler script that checks for the condition and then either do not execute the code or do something else. (One hit kills for example)
Alternatively, you can also use this to build a so called "Array of byte" string which you can use to search which will result in a list of all your or the enemies players
In this tutorial I have implemented the most amazing game you will ever play.
It has 4 players. 2 Players belong to your team, and 2 Players belong to the computer.
Your task is to find the code that writes the health and make it so you win the game WITHOUT freezing your health
To continue, press "Restart game and autoplay" to test that your code is correct


Tip: Health is a float
Tip2: There are multiple solutions
    Bản dịch tiếng Việt:


Bước 9: Shared code: (PW = 31337157)
Bước này sẽ giải thích cách xử lý mã được sử dụng cho các đối tượng cùng loại

Thông thường khi bạn tìm thấy Health của một đơn vị hoặc người chơi của riêng bạn, bạn sẽ thấy rằng nếu bạn loại bỏ mã, nó cũng ảnh hưởng đến kẻ thù.
Trong những trường hợp này, bạn phải tìm ra cách phân biệt giữa các đối tượng của bạn và kẻ thù.
Đôi khi, việc này dễ như kiểm tra 4 byte đầu tiên (Bảng con trỏ hàm) thường trỏ đến một vị trí duy nhất cho người chơi và đôi khi đó là số nhóm hoặc con trỏ tới con trỏ tới con trỏ tới con trỏ tới con trỏ tới một tên người chơi. Tất cả phụ thuộc vào độ phức tạp của trò chơi và vận may của bạn

Phương pháp đơn giản nhất là tìm địa chỉ mà mã bạn tìm thấy ghi vào và sau đó sử dụng tính năng phân tích dữ liệu để so sánh với hai cấu trúc. (Đơn vị / người chơi của bạn và kẻ thù) Và sau đó xem liệu bạn có thể tìm ra cách phân biệt giữa chúng không.
Khi bạn đã tìm ra cách phân biệt giữa bạn và máy tính, bạn có thể chèn mã assembly kiểm tra điều kiện và sau đó không thực thi mã hoặc làm gì khác. (Chẳng hạn như một cú đánh chết)
Ngoài ra, bạn cũng có thể sử dụng điều này để xây dựng chuỗi gọi là "Mảng byte" mà bạn có thể sử dụng để tìm kiếm, điều này sẽ dẫn đến một danh sách tất cả người chơi của bạn hoặc kẻ thù
Trong hướng dẫn này, tôi đã thực hiện trò chơi tuyệt vời nhất mà bạn sẽ chơi.
Nó có 4 người chơi. 2 Người chơi thuộc về đội của bạn và 2 Người chơi thuộc về máy tính.
Nhiệm vụ của bạn là tìm mã viết ra Health và làm cho nó để bạn chiến thắng trò chơi mà không đóng băng Health của bạn
Để tiếp tục, nhấn "Restart game and autoplay" để kiểm tra xem mã của bạn có đúng không


Mẹo: Health là kiểu float
Mẹo2: Có nhiều giải pháp để thực hiện
    Phân tích sơ sơ qua về game như này:


    Team của mình khá là xấu số khi máu ít hơn team địch mà lại còn bị trừ máu nhiều hơn nữa chứ, mỗi lần ấn attack vào team mình thì máu sẽ bị trừ random từ 2 - 6 máu, còn team địch chỉ bị trừ 1 bọ, dù có trừ đều như nhau thì team mình vẫn chết trước thôi vì máu ít hơn mà.
    Nhìn chung thì cả 4 player đều là cùng một kiểu đối tượng gồm name, health, team, Còn gì khác không thì mình không rõ, tạm thời mình chỉ liệt kê ra những cái thứ trước mắt, mình sẽ biểu diễn lại bằng code C# như sau, chỉ mang tính tượng trưng thôi nhé, chứ chả biết họ viết sao đâu
class Players
{
    private string name;
    private int team;
    private float health;
        
    public Players(string name, int team, float health)
    {
        this.name = name;
        this.team = team;
        this.health = health;
    }

    public void Attack(float dmg)
    {
        this.health -= dmg;
    }
}
    Khi bắt đầu sẽ tạo ra 4 người chơi ví dụ như sau
Players player1 = new Players("Dave", 1, 100);
Players player2 = new Players("Eric", 1, 100);
Players player3 = new Players("HAL", 2, 500);
Players player4 = new Players("KIT", 2, 500);
    Nút Restart game and autoplay chắc được viết như sau.
static void RestartGameAndAutoPlay()
{
    while(listPlayer[0].Health != 0 && listPlayer[1].Health != 0)
    {
        foreach(Players player in listPlayer)
        {
            if(player.Team == 1)
            {
                Random random = new Random();
                int dmg = random.Next(2, 6);
                player.Attack(dmg);
            }
            else
            {
                player.Attack(1);
            }
        }
    }
}
    Và sau khi dùng CE và tìm thấy lệnh assembly làm trừ máu của team mình đi, nếu nhanh trí ấn replace code thành nop như này


    Điều đó cũng có nghĩa là code trong chương trình có thể bị trờ thành như sau.
public void Attack(float dmg)
{
    //dòng code trừ máu ở đây bị loại bỏ
}
    Cho nên khi ấn attack vào bất kì player nào cũng sẽ không còn ai bị mất máu nữa, đó là điều mà mình không muốn nó xảy ra, vì sẽ không thể hoàn thành được tutorial này.
    Theo như trong tutorial có nói thì mình phải tìm được điểm khác biệt giữa 2 team, ở ví dụ của mình có nói thì là mỗi nhân vật được đánh dấu bằng mã đội đó, phải sử dụng tính năng phân tích dữ liệu thì mới tìm ra được sự khác nhau, từ đó viết lệnh kiểm tra và thực hiện mã như mình mong muốn.
    
    Quay trở lại với tutorial, giả sử là các bạn tìm đến chỗ lệnh asm trừ máu của cả 4 player rồi nhé, vì cách làm mình trình bày suốt rồi nên mình sẽ bỏ qua. Chọn 'Find out what addresses this instruction accesses', mục đích là tìm nhanh địa chỉ Health của cả 4 player thôi.
   

    Quay lại tutorial ấn attack vào cả 4 player rồi quay lại cửa sổ mới sẽ hiện ra cả địa chỉ Health của cả 4.


    Chọn cả 4 cái rồi chuột phải chọn 'Open dissect data with selected addresses', xong cứ yes với ok thôi.


    Có thể chuyển hai địa chỉ phía sau sang group khác để trông nó phân biệt ra 1 tí chứ thực ra không làm cũng chả sao.
    Để ý thấy offset 4 là kiểu float cũng chính là Health luôn, offset 15 là tên của các player,,, cái hay ho hơn nữa là mình có khoanh là ở offset 10, cái đó để phân biệt 2 team. Vậy là rõ rồi, khi đã tìm ra được sự khác biệt thì quay lại cửa sổ Memory Viewer của CE chọn Tools -> Auto assemble tại lệnh trừ máu tìm được ấy nhé.
    Phân tích rõ hơn một tí ý tí tư tưởng định làm là mình muốn sửa lại code trừ máu của player như sau
public void Attack(float dmg)
{
    if(this.team == 2)
    {
        this.health -= dmg; // chỉ trừ máu của team địch, team mình sẽ không bị trừ
    }
            
}
    Đoạn code Assembly như sau   


    Sau khi ấn Execute thì trở lại tutorial ấn thử attack xem, chỉ còn team địch bị mất máu thôi, giờ thì 'Restart game and autoplay' và kết thúc series tại đây. Sang phần tới mình sẽ làm về series Cheat Engine Tutorial Games, toàn đồ cây nhà lá vườn trong CE thôi nhưng cứ làm qua hết đi, tutorial mà :v khóe còn khó hơn game thật ý chứ

    


Đăng nhận xét

0 Nhận xét