Ở 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!
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á.