Mình thấy hiện giờ có khá nhiều auto game, vậy câu trả lời cua minh là làm sao để những phần mềm này lấy được những dữ liệu vd như máu, vị trí của người chơi để inject vào trong trò chơi
Thắc mắc về Auto game: làm sao để lấy được những dữ liệu vd như máu, vị trí của người chơi để inject vào trong trò chơi
Công nghệ hiện thời thì mình cũng ko rõ lắm. Nhưng hồi xưa nhớ có ArtMoney j đấy thì nó đại loại như sau :
- Các chỉ số hp, exp hay các chỉ số các thì thực chất cũng là một biến int, double … được lưu trên RAM.
- Đầu tiên chươn trình sẽ filter ra dải bộ nhớ của chương trình game, khi một chương trình start nó sẽ được HĐH cấp phát một vùng nhớ riêng.(Làm sao ArtMoney có thể truy cập được của chương trình khác thì mình không biết ).
- Giả sử HP của bạn đang là 200 => Input giá trị 200 vào filter, nó sẽ filter tất cả các vùng nhớ trong dải lấy được ở step 2, xem cái nào có giá trị là 200 thì liệt kê ra. giả sử chúng ta có 3 vùng nhớ là X1, X2, X3 có giá trị 200 ( thực tế thì nhiều lắm ).
- Bạn vào game đánh đánh vài con quái, làm cho hp giảm xuống 183 chẳng hạn. Sau đó ra ngoài chương trình ArtMoney => filter các vùng nhớ X1,X2,X3 xem cái nào có gái trị 183. => Chúng ta sẽ xác định được chính xác địa chỉ nào là nơi chưa giá trị của HP.
- Sau đó thì can thiệp trực tiếp vào vùng nhớ này và thay đổi giá trị 183 thành bao nhiêu là tùy ý bạn.
Lưu ý là cách làm này vẫn có thể có xác xuất filter mãi ở step 4 mà vẫn ra nhiều giá trị, bạn phải quay lại step3 đến khi nào xác định được thì thôi.
Còn hiện nay thì nó thường đồng bộ với server or được mã hóa theo acchs nào đó, nên cách làm này khả năng là ko hữu dụng nữa, chỉ tham khảo thôi
Câu trả lời của @leHoai gần đủ rồi đấy. Đạt bổ sung thêm
Chính xác
ArtMoney hay một chương trình khác là CheatEngine sẽ lấy process ID của game để lấy được vùng nhớ. Lúc mình chạy ArtMoney lên nó sẽ bắt mình chọn cái process (Game) để “hack”
Đúng Làm nhiều sẽ hiểu.
Vùng nhớ mà mình lấy được gọi là offset, tức là khoảng cách từ điểm bắt đầu của stack của chương trình cho tới điểm lưu trữ biến này. Các biến này là biến static hoặc là global thì ta mới có thể có được offset chính xác. Vì các biến này là biến toàn cục/static nên nó sẽ được cấp vùng nhớ static và tồn tại từ khi bắt đầu cho đến khi kết thúc chương trình, có như vậy nó mới không thay đổi và có thể đọc được giá trị.
Ví dụ nhé, ta có biến double m_hp
nằm trong class Character
. Giả sử Class Character này là biến static để có thể truy cập từ nhiều nơi trong game.
class Character {
double m_hp;
double m_mp;
}
Giả sử ta tìm được vị trí của m_hp
là 0x78905050
thì địa chỉ của m_mp
sẽ là 0x78905058
với double là 8 bytes. Vị trí của các biến này là cố định từ lúc khởi động cho tới lúc tắt và kể cả cho lần chạy game tiếp theo. Giá trị này chỉ thay đổi nếu class Character thay đổi cấu trúc hoặc vị trí khởi tạo của Character khác với lần trước. Ví dụ ta thêm biến double m_gold
class Character {
double m_gold;
double m_hp;
double m_mp;
}
Hoặc lúc đầu ta khai báo:
static Character c;
Nay ta sửa lại
bool is_premium = false;
static Character c;
Chỗ này chưa đúng, các thông tin này mình đọc ở client, nên việc đọc không bị ảnh hưởng bởi server. Còn việc ghi thì ăn thua hên xui Hên hên thì vẫn hack được speed
Một số thằng như kiểu linked list ấy, phải dò theo từng con trỏ mới biết giá trị cuối cùng nằm ở đâu, mà hình như CheatEngine có phần demo như vậy
đọc được giá trị trong game là một chuyện, điều khiển nv lại là một chuyện khác. cái này phải dùng một disassembler để đọc code của game xem nó chạy thế nào, xong vận dụng tùm lum kỹ thuật như inject code, hook code mới xong (ít nhất theo kiến thức của minh), những người làm được là có năng khiếu kiến trúc máy tính rồi
Em thấy có nhiều bot nó chẳng cần scan mà nó vẫn lấy đc giá tri
Sao em “thấy” được ?
@ltd để mai em chụp ảnh lên cho, em cũng không chắc nhưng giờ bố em đang ở nhà, bố em không cho chơi điện tử
Làm sao chụp ảnh mà em biết được là nó có scan hay không? Việc scan là việc trước khi viết ứng dụng cơ mà?
Người ta sẽ scan, tìm ra địa chỉ của các biến hp, mp, etc. sau đó viết ứng dụng để đọc các giá trị đấy.
không anh ạ, theo em nhớ thì CE đầu tien mình pahir scan giá trị ấy rồi thay đổi giá trị ấy rồi lại scan lai, cứ như thế đén khi tìm đc giá trị cuối cùng. còn cái L# này thì nó cho phép người dùng xây dựng lên các chương trình thông qua bộ thư viện của nó, nhung mà phải thông qua cái loader của nó thì mới inject được vào game, không thì sẽ bị ngoại lệ. Em đã thử viết 1 cái chương trình đơn giản cho phép lúc vào đầu game nó hiên số máu, … Vào game, nó hiện lên chỉ số máu ngay, mà không phải thay đổi giá trị đó như CE, mà CE quét lần 1 ra 1 đống, phải lọc từ từ r mới tìm đc ra giá trị cuối. Ma theo em biết thì địa chỉ của vùng nhớ sẽ bị thay đổi theo mỗi lần chạy chương trình thì phải.
Đó là bởi vì em chưa lấy được static address
nên cứ phải scan đi scan lại, khi em lấy được static address
rồi thì không cần phải scan nữa, vị mọi lần mở ứng dụng lên thì ta sẽ lấy được các giá trị đấy chính xác mà không cần phải scan nữa theo địa chỉ ta scan được.
thì ra là thế, em cảm ơn anh. Mà em lên mạng tìm hiểu về mấy cái đấy thì nó chỉ ra là"How to find pointer with CE", vậy thì stactic address và pointer có phải là giống nhau không anh ?