Trao đổi với tôi

http://www.buidao.com

10/13/10

[Reverse] Hướng dẫn viết hack game (game trainer) - Part 2

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;
}
Bây giờ bạn bật pikachu lên , vô game chơi rồi chạy thử cái tool bạn vừa làm xong xem thế nào, hj hj hj hj

Đặ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;
}
2. Và giải thích
PHP Code:
HWND hwnd =FindWindow("ThunderRT6FormDC", "³s³s¬Ý2");
Câu lệnh này giúp tìm ra mã số của cửa sổ và lưu vào biến hwnd . Trong windows thì mỗi cửa số có 1 mã số là 1 số nguyên 32 bit,


PHP Code:
if (!hwnd)
{
MessageBox(HWND_DESKTOP,"Ban phai bat pikachu len choi truoc da","Thong bao",MB_OK);
}
nếu không tìm thấy thì hiển thị lên 1 hộp thông báo với nội dung như các bạn nhìn thấy

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