Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.40 KB | None | 0 0
  1. #include <iostream>
  2. #include <Windows.h>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.  
  9.     // ok e nhìn rõ chứ?
  10.  
  11.     // đầ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
  12.     // a = 0x153A65A0 // đặt 0x ở đầu tức là ở hệ hexa nhé
  13.  
  14.     // 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
  15.     // 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
  16.     // 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à\
  17.     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é)
  18.  
  19.  
  20.     // 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
  21.     // hàm này tham số là Class của cửa sổ và Title
  22.     HWND hWnd = FindWindowA(NULL, "Plants vs. Zombies"); // trong winapi nó chia hàm ra A và W, ví dụ có cả FindWindowW ấy
  23.  
  24.     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
  25.     {
  26.         // DWORD là Double Word tức là biến 4BYTEs ko phân dấu, tức là ko âm ấy
  27.         DWORD pid;
  28.         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
  29.  
  30.         // lấy đc PID rồi thì OpenProcess thôi
  31.  
  32.         HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
  33.  
  34.         if (hProcess) // lại check có mở đc process ko thôi
  35.         {
  36.  
  37.             // giờ anh sẽ thay đổi giá trị tại địa chỉ 153A65A0, chỉ thay đổi 4 bytes thôi nhé\
  38.             anh sẽ tạo 1 biến giả, gọi là buffer đi
  39.  
  40.             int buffer = 100000;
  41.             // khi em khai báo biến này thì trong bộ nhớ sẽ cấp phát 4 bytes
  42.             // ?? ?? ?? ?? 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é
  43.             // ‭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
  44.             // A0 86 01 00 đây mới là vùng nhớ mà sau khi anh hack nè
  45.  
  46.             // mục đích của anh là copy 4 bytes này vào process khi và thay thế 4 bytes lưu SUN
  47.             // con trỏ void * là con trỏ trỏ đc tất cả các biến
  48.             // 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
  49.  
  50.             //WriteProcessMemory(hProcess,
  51.             //  /*đây là nơi em muốn copy vào*/(LPVOID)0x153A65A0,
  52.             //  /*đâ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ế
  53.             //  /*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
  54.             //  /*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*/
  55.             //  NULL
  56.             //  );
  57.             // anh run đây, ok vậy là xong
  58.             // nhưng ta xong đc vấn đề này rồi, còn 1 vấn đề quan trọng nữa là
  59.             // mỗi khi em thoát game ra vào lại
  60.             // địa chỉ biến sun lại đổi sang cái khác
  61.  
  62.             // "PlantsVsZombies.exe"+0010D8C4 -> C -> FC -> 4 -> 5578
  63.  
  64.             // em doc gia tri cua "PlantsVsZombies.exe"+0010D8C4 rồi đc a
  65.             // lấy a + C rồi lấy giá trị tại a + 0xc thì đc b
  66.             // lấy b + 0xFC đc giá trị tại b + 0xFC là c
  67.             // lấy c + 4 đc giá trị tại đó là d
  68.             // cuối cùng d + 5578 sẽ ra địa chỉ biến SUN
  69.             // với những chương trình cơ bản thì base luôn là 0x400000, chuẩn chưa
  70.             // 32 bit thi nên dùng DWORD lưu địa chỉ
  71.             DWORD Base, base1, base2, base3;
  72.  
  73.             // Read "PlantsVsZombies.exe"+0010D8C4 vào base
  74.  
  75.             // Copy 4 bytes từ (LPVOID)(0x400000 + 0x0010D8C4) sang &Base
  76.             ReadProcessMemory(hProcess, (LPVOID)(0x400000 + 0x0010D8C4), &Base, sizeof(DWORD), NULL);
  77.  
  78.             // Copy 4 bytes từ (LPVOID)(Base + 0xC) sang &Base1
  79.             ReadProcessMemory(hProcess, (LPVOID)(Base + 0xC), &base1, sizeof(DWORD), NULL); // thay luôn type cũng đc
  80.             ReadProcessMemory(hProcess, (LPVOID)(base1 + 0xFC), &base2, sizeof(DWORD), NULL); // thay luôn type cũng đc
  81.             ReadProcessMemory(hProcess, (LPVOID)(base2 + 0x4), &base3, sizeof(DWORD), NULL); // thay luôn type cũng đc
  82.  
  83.             // vậy là lấy đc base3 tức là EDX này này
  84.  
  85.             WriteProcessMemory(hProcess,
  86.                 /*đây là nơi em muốn copy vào*/(LPVOID)(base3 + 0x5578),
  87.                 /*đâ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ế
  88.                 /*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
  89.                 /*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*/
  90.                 NULL
  91.                 );
  92.         }
  93.     }
  94.  
  95.     // W là dành cho UNICODE
  96.     // A à mã ASCII
  97.  
  98.     return 0; // thoast ra vào lại test nhé
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement