Chap 2: hack điểm
Khi chơi game, ta thấy điểm hiện lên trên màn hình, vậy thì chắc chắn nó sẽ được lưu trữ ở đâu đó trong bộ nhớ và sẽ có địa chỉ VA cụ thể. Dân lập trình chúng ta gọi chúng là biến, và có địa chỉ cụ thể, hj hj
Muốn biết VA là gì xem ở đây :
Portable Executable File Format
Để thay đổi điểm từ phía app của mình, đầu tiên chúng ta phải tìm được địa chỉ VA của biến điểm này đã nhỉ.
Để tìm được địa chỉ của biến này ko quá khó với 1 tool cơ bản như artmoney (Chưa có download ở đây, active code là dot68) :
Bước 1
Đầu tiên bật pikachu lên chơi lấy 20 điểm và bật artmoney lên,
đầu tiên là chọn tiến trình, pikachu ở đây có cái tên là D4S
rồi click vào Search lên 1 hộp thoại
Bước 2
click vào ... để chọn kiểu dữ liệu, mình hack nhiều lần rồi nên biết nó là kiểu float 4byte, nếu chưa hack bao giờ, các bạn có thể để ALL để tìm với mọi loại dữ liệu
Bước 3
chúng ta sẽ thu được 1 loạt địa chỉ đang chứa giá trị 20, bây giờ chúng ta vào trong game để chơi cho điểm trở thành 40 rồi vào artmoney, click vào nút Filter gõ giá trị mới là 40 rồi ok
Bước 4
Vậy là ta đã biết địa chỉ của biến điểm là 004B6088
Vậy ta sẽ làm 1 demo để hack điểm nhé :
Vào Visual Studio (Chưa có thì download tại đây) vào File -> New -> Project -> Win32 Project (đặt tên, đường dẫn) -> Next (chọn empty project) -> finish
chuột phải vào thư mục source code tạo 1 file cpp mới rồi gõ code
Để biết được tên lớp và tên cửa sổ của tiến trình pikachu ta chỉ việc mở spy++ (tool đính kèm khi cài VS rồi làm như hình sau)
demo chức năng đầu tiên như sau :
Demo1 : Set game point to 99999
PHP Code:
#include
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
HWND hwnd =FindWindow(L"ThunderRT6FormDC", L"³s³s¬Ý2"); // tìm cửa sổ pikachu
if (!hwnd) // Nếu ko tìm thấy
{
MessageBox(HWND_DESKTOP,L"Bạn phải bật pikachu lên chơi trước đã",L"Thông báo",MB_OK); //Hiện thông báo
}
else
{
DWORD pid;
float temp=99998;
GetWindowThreadProcessId(hwnd,&pid); // lấy định danh của process
HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,pid); // mở process để láy handle
int *address=(int*)0x4B6088; // địa chỉ của biến điểm
WriteProcessMemory(handle,address,&temp,sizeof(temp),0); // ghi lên vùng nhớ đó
MessageBox(HWND_DESKTOP,L"Đã thiết lập xong",L"Thông báo",MB_OK); // thông báo kết quả
}
return EXIT_SUCCESS;
}
Demo 2 :
Tăng điểm của người chơi (add 1000 to game point)
PHP Code:
#include
void Add1000ToPoint()
{
HWND hwnd =FindWindow(L"ThunderRT6FormDC", L"³s³s¬Ý2");
if (!hwnd)
{
MessageBox(HWND_DESKTOP,L"Bạn phải bật pikachu lên chơi trước đã",L"Thông báo",MB_OK);
}
else
{
DWORD pid;
float temp=0;
GetWindowThreadProcessId(hwnd,&pid);
HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ,FALSE,pid);
int *address=(int*)0x4B6088;
ReadProcessMemory(handle,address,&temp,sizeof(temp),0);
temp+=1000.f;
WriteProcessMemory(handle,address,&temp,sizeof(temp),0);
MessageBox(HWND_DESKTOP,L"Đã add thành công",L"Thông báo",MB_OK);
}
}
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
Add1000ToPoint();
return EXIT_SUCCESS;
}
Đặc biệt
1. Code demo sau chạy ngon trên Dev-C :
PHP Code:
#include
void Add1000ToPoint()
{
HWND hwnd =FindWindow("ThunderRT6FormDC", "³s³s¬Ý2");
if (!hwnd)
{
MessageBox(HWND_DESKTOP,"Ban phai bat pikachu len choi truoc da","Thong bao",MB_OK);
}
else
{
DWORD pid;
float temp=0;
GetWindowThreadProcessId(hwnd,&pid);
HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ,FALSE,pid);
int *address=(int*)0x4B6088;
ReadProcessMemory(handle,address,&temp,sizeof(temp),0);
temp+=1000.f;
WriteProcessMemory(handle,address,&temp,sizeof(temp),0);
MessageBox(HWND_DESKTOP,"Da add thanh cong","Thong bao",MB_OK);
}
}
int main()
{
Add1000ToPoint();
return 1;
}
PHP Code:
HWND hwnd =FindWindow("ThunderRT6FormDC", "³s³s¬Ý2");
PHP Code:
if (!hwnd)
{
MessageBox(HWND_DESKTOP,"Ban phai bat pikachu len choi truoc da","Thong bao",MB_OK);
}
PHP Code:
else
{
DWORD pid;
float temp=0;
GetWindowThreadProcessId(hwnd,&pid); // lẫy mã của tiến trình đang chạy
HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ,FALSE,pid); // mở tiến trình đó để đọc ghi dữ liệu, dạng dạng như mở file ấy
int *address=(int*)0x4B6088; // gán cho biến này địa chỉ của biến điểm mà ta đã tìm ra
ReadProcessMemory(handle,address,&temp,sizeof(temp),0); // đọc giá trị của biến điểm lưu vào temp
temp+=1000; // tăng temp lên 1000
WriteProcessMemory(handle,address,&temp,sizeof(temp),0); // ghi lại giá trị mới của temp vào trong ô nhớ của biến điểm
MessageBox(HWND_DESKTOP,"Da add thanh cong","Thong bao",MB_OK); //thông báo đã ghi thành công
}
xong cháp 2, nghỉ ngơi , học bài mai viết tiếp chap 3