Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <Windows.h>
- using namespace std;
- int main()
- {
- // ok e nhìn rõ chứ?
- // đầu tiên em muốn thay đổi giá trị tại địa chỉ A, em phải có địa chỉ A, có A rồi
- // a = 0x153A65A0 // đặt 0x ở đầu tức là ở hệ hexa nhé
- // tiếp theo thì a nói r, 1 địa chỉ 153A65A0 nhưu thế này, trong process nào cũng có thể trùng
- // nên mình phải get process của thằng Plants vs Zombies thì mới ko bị trùng với process khác
- // muốn có đc process thì mình phải get đc HANDLE (HANDLE nghĩa là tay nắm, đại khái ý của nó là\
- cái tay nắm này dùng để điều khiển, thay đổi cái mà nó gắn vào , thì cái tay nắm gắn vào process thì thay đổi đc process đó, code luôn nhé)
- // HWND chia ra là HANDLE WINDOW, nghĩa là tay nắm đến 1 cửa sổ, em dùng nó để lấy của sổ game
- // hàm này tham số là Class của cửa sổ và Title
- HWND hWnd = FindWindowA(NULL, "Plants vs. Zombies"); // trong winapi nó chia hàm ra A và W, ví dụ có cả FindWindowW ấy
- if (hWnd) // Check xem có get đc, ko, vì nếu ko get đc nó trả về 0 mà 0 là false nên ko chạy vào code trong nữa
- {
- // DWORD là Double Word tức là biến 4BYTEs ko phân dấu, tức là ko âm ấy
- DWORD pid;
- GetWindowThreadProcessId(hWnd, &pid); // em phải truyền vào cho nó là địa chỉ của pid, thì hàm nó mới thay đổi đc giá trị của pid, cái này giống ref và out của C# ấy
- // lấy đc PID rồi thì OpenProcess thôi
- HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
- if (hProcess) // lại check có mở đc process ko thôi
- {
- // giờ anh sẽ thay đổi giá trị tại địa chỉ 153A65A0, chỉ thay đổi 4 bytes thôi nhé\
- anh sẽ tạo 1 biến giả, gọi là buffer đi
- int buffer = 100000;
- // khi em khai báo biến này thì trong bộ nhớ sẽ cấp phát 4 bytes
- // ?? ?? ?? ?? 4 bytes này lưu số 100000 kia kìa, giờ anh đổi nó ra mã hex rồi đổi về little endian nhé
- // 00 01 86 A0 nó khớp với 4 bytes trên rồi nhé, nhưng đây là big endian, nó xuôi, nên phải đảo ngược
- // A0 86 01 00 đây mới là vùng nhớ mà sau khi anh hack nè
- // mục đích của anh là copy 4 bytes này vào process khi và thay thế 4 bytes lưu SUN
- // con trỏ void * là con trỏ trỏ đc tất cả các biến
- // nó đc dùng làm trỏ địa chỉ LPVOID = void * nhờ vào cái typedef nên nó mới bằng nhau
- //WriteProcessMemory(hProcess,
- // /*đây là nơi em muốn copy vào*/(LPVOID)0x153A65A0,
- // /*đây là nơi em muốn lấy để copy sang*/ &buffer, // cái em muốn copy sang là 4 bytes của thằng buffer này nên phải làm như thế
- // /*tham số này là số byte em muốn copy*/ sizeof(buffer), // lấy hết 4 bytes của buffer nên cái sizeof(buffer) == 4
- // /*cái này là con trỏ muốn lưu xem em copy thành công bao nhiêu bytes, nhưng chắc chắn là 100% thành công nên chỗ này để null cũng đc, đây chỉ là lấy kết quả thôi*/
- // NULL
- // );
- // anh run đây, ok vậy là xong
- // nhưng ta xong đc vấn đề này rồi, còn 1 vấn đề quan trọng nữa là
- // mỗi khi em thoát game ra vào lại
- // địa chỉ biến sun lại đổi sang cái khác
- // "PlantsVsZombies.exe"+0010D8C4 -> C -> FC -> 4 -> 5578
- // em doc gia tri cua "PlantsVsZombies.exe"+0010D8C4 rồi đc a
- // lấy a + C rồi lấy giá trị tại a + 0xc thì đc b
- // lấy b + 0xFC đc giá trị tại b + 0xFC là c
- // lấy c + 4 đc giá trị tại đó là d
- // cuối cùng d + 5578 sẽ ra địa chỉ biến SUN
- // với những chương trình cơ bản thì base luôn là 0x400000, chuẩn chưa
- // 32 bit thi nên dùng DWORD lưu địa chỉ
- DWORD Base, base1, base2, base3;
- // Read "PlantsVsZombies.exe"+0010D8C4 vào base
- // Copy 4 bytes từ (LPVOID)(0x400000 + 0x0010D8C4) sang &Base
- ReadProcessMemory(hProcess, (LPVOID)(0x400000 + 0x0010D8C4), &Base, sizeof(DWORD), NULL);
- // Copy 4 bytes từ (LPVOID)(Base + 0xC) sang &Base1
- ReadProcessMemory(hProcess, (LPVOID)(Base + 0xC), &base1, sizeof(DWORD), NULL); // thay luôn type cũng đc
- ReadProcessMemory(hProcess, (LPVOID)(base1 + 0xFC), &base2, sizeof(DWORD), NULL); // thay luôn type cũng đc
- ReadProcessMemory(hProcess, (LPVOID)(base2 + 0x4), &base3, sizeof(DWORD), NULL); // thay luôn type cũng đc
- // vậy là lấy đc base3 tức là EDX này này
- WriteProcessMemory(hProcess,
- /*đây là nơi em muốn copy vào*/(LPVOID)(base3 + 0x5578),
- /*đây là nơi em muốn lấy để copy sang*/ &buffer, // cái em muốn copy sang là 4 bytes của thằng buffer này nên phải làm như thế
- /*tham số này là số byte em muốn copy*/ sizeof(buffer), // lấy hết 4 bytes của buffer nên cái sizeof(buffer) == 4
- /*cái này là con trỏ muốn lưu xem em copy thành công bao nhiêu bytes, nhưng chắc chắn là 100% thành công nên chỗ này để null cũng đc, đây chỉ là lấy kết quả thôi*/
- NULL
- );
- }
- }
- // W là dành cho UNICODE
- // A à mã ASCII
- return 0; // thoast ra vào lại test nhé
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement