RSS

Hướng dẫn lập trình auto game bằng Delphi 7 (phần 3 làm việc với memory)

22 Th11

Ở phần này tôi sẽ tiếp tục giới thiệu với các bạn cách sử dụng các hàm Read và writeprocessmemory để thực hiện việc lấy giá trị trong bộ nhớ game thay cho phương pháp sử dụng Getpixel cũ.

Chú ý quan trọng khi làm việc với memory là bạn phải nắm vững các kiểu dữ liệu của Delphi để khai báo cho đúng các biến thì việc đọc ghi memory mới thành công và không bị lỗi. Ví dụ để đọc 2byte kiểu interger thì bạn phải khai báo biến dữ liệu là Word. Chi tiết về kiểu biến bạn có thể dọc ngay trong Help của Delphi IDE hoặc tham khảo tài liệu hướng dẫn lập trình Delphi, ở đây tôi chỉ đưa các ví dụ cụ thể giúp bạn có thể hiểu được việc sử dụng thực tế các hàm này chứ không giải thích sâu về lý thuyết.

Chú ý quan trọng Hàm API Readprocessmemory dung để đọc dữa liệu thì bạn có thể sử dụng tùy ý. Nhưng hàm Writeprocessmemory thì không như vậy. Có một số game chống hack cấm thi hành phương thức này để thay đổi giá trị game. Hoặc rất dễ gây xung đột với chính việc cập nhật giá trị game nên bạn phải sử dụng nó thật cẩn thận để tránh xung đột. Hạn chế tối đa việc ghi đè bằng cách trước khi ghi thì đọc kiểm tra giá trị hiện tại, Nếu không thỏa mãn mới thực hiện việc ghi đè. Nếu không thể thực hiện thành công việc ghi đè do game chông hack hoặc bị xung đột, bạn sẽ phải sử dụng kỹ thuật inject Dll để làm việc này. Trong phạm vi bài viết này tôi không giới thiệu kỹ thuật phức tạp đó. Nhưng có một bí quyết là có thể sử dụng các file Dll inject đã được viết sẵn cho các auto game khác để làm việc này một cách đơn giản. Tận dụng các hàm Inject và Unmap đã được thiết kế sẵn cho nhanh. Trừ các trương hợp đặc biệt cần thiết mới phải tự thực hiện

Sau đây là các ví dụ :

Khai báo :

CONST

ME_Name:pointer = ptr($030C1660); //text 50

ME_Clan:pointer = ptr($033FEB14); //text 25

ME_HP:pointer = ptr($0307A664); // Float

ME_HPmax:pointer = ptr($030C1786); // 2 byte

ME_MANA:pointer = ptr($0307A668); // Float

Open process để thực hiện việc đọc ghi dữ liệu

var

// Khai bao bien toan cuc

HandleWindowS, len : cardinal;

ThreadIdS, ProcessIdS ,WindowNameS : integer;

WindowNameS := FindWindow(nil,WindowsEXPTName);

If WindowNameS > 0 then

begin

ThreadIdS := GetWindowThreadProcessId(WindowNameS,@ProcessIdS);

HandleWindowS := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessIdS);

end;

Đọc dữ liệu:

Var

HPhientai:Single; HPmax:Word; len: cardinal;

begin

ReadProcessMemory(HandleWindowS,ME_HPmax,@HPMax,2, len); //Word 2 byte HPmax

ReadProcessMemory(HandleWindowS,ME_HP,@HPhientai,4, len); // single 4 byte HP

End;

Ghi dữ liệu

Procedure XoayCamera();

Var

         Camera1:Byte;

begin

                 Camera1:=1;

                 writeProcessMemory(HandleWindowS,ME_XoayCamera,@Camera1,1, len); // byte

end;

Tới đây kết thúc phần giới thiệu về cách đọc và ghi dữ liệu vào memory game. Trong bài kế tiếp tôi sẽ cung cấp các hàm cụ thể để các bạn có thể hiểu rõ hơn cách sử dụng cacs hàm này. Chúc thành công!

 

1 responses to “Hướng dẫn lập trình auto game bằng Delphi 7 (phần 3 làm việc với memory)

  1. Cuong Vuhoang

    16/03/2017 at 8:28 sáng

    thực ra muốn nhắn làm cái này lâu rồi nhưng mà lười quá. kiểu như muốn chỉ cần mỗi ngày bật máy tính lên rồi mọi thứ còn lại tự chạy. từ đăng nhập làm nhiệm vụ, đi các phó bản. rồi tham gia đủ các hoạt động của nó. nhưng mà lười quá.