1. Trang chủ
  2. » Công Nghệ Thông Tin

Hướng dẫn hack game ( game pikachu )

69 1,8K 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 69
Dung lượng 532,54 KB

Nội dung

Dẫn nhập Đối với các game thủ thì game trainer ko còn là 1 từ lạ lẫm nữa. Vậy làm thế nào để viết 1 game trainer ? Đây là 1 vấn đề mà ko ít bạn sinh viên quan tâm nhưng lại chưa tìm được điểm bắt đầu, vậy hôm nay langman cùng với chút kinh nghiệm nhỏ xíu học được từ cộng đồng c việt quyết định chia sẻ với các bạn 1 tut nhằm dẫn nhập các bạn đến với con đường tà đạo : hack game hj hj hj hja Bài viết có nguồn từ langman Cộng Đồng C Việt Các file nén có pass là langman.congdongcviet Ngày xưa cái này gọi là game trainer, bây giờ các gamer toàn gọi nhầm với hack tool, nên thôi langman cũng cứ gọi bừa là hack, mong các hacker đừng vì thế mà ghét langman Yêu cầu theo đuổi tut này Đây là 1 tut cực kì đơn giản, với các hình minh họa cụ thể, nên ko khó để các bạn làm quen . Nhưng yêu cầu là các bạn phải chịu khó mày mò, phải thích thật sự và 1 yêu cầu cũng ko kém phần quan trọng đó là : Nếu các bạn thấy tut này thật sự có ý nghĩa với bạn thì hãy để lại 1 vài câu reply có ý nghĩa Chap 1 : Pikachu Đây là 1 game có từ rất lâu rồi, cũng ko lạ lẫm gì với dân Việt Nam chúng ta nữa, con gái cũng biết chơi, vì thế langman sẽ cùng các bạn viết 1 cái trainer cho game này nhé Đầu tiên, nếu bạn chưa có pikachu thì download tại đây : Pokemon Do có nhiều sự khác nhau về OS: 7,XP,Vista nên chúng ta thống nhất download file này copy vào thư mục C:windowssystem32 nhé (Trong windows 7 thì phải có file này mới chạy được pikachu, ở trong XP thì các bạn cũng cứ copy đè lên file cũ nhé, ko sao đâu, như thế thì chúng ta mới làm được theo cái tút này) : msvbvm5 OK, chúng ta sẽ bắt đầu có 1 cái nhìn sơ bộ về pikachu : Game và cách chơi : chắc các bạn đã biết cả rồi Chúng ta sẽ tiến hành nghiên cứu 2 vấn về + Mod game, sửa đổi các thành phần trong game đi , lấy resource của game, thay resource,....... + Viết trainer với các option _ Tăng điểm của người chơi (add 1000 to game point) _ Tăng thêm thời gian ( set time bar to max time) _ Đóng băng thời gian ( unlimited time và infinite time) _ Vô hạn lượt đổi (unlimited continue) Chap 2 : Mod Load bằng Peid (chưa có load tại đây full plugin và chạy được trên windows7) ta có kết quả như sau : Vậy là cái này được pack bằng ASPack 2.11 (vậy để hand mod thì chúng ta phải upack nó trước đã) Các bạn làm theo bước 1,2,3 như trong ảnh để lấy được OEP của app này là : 00401628 Mình gà lắm, ko biết upack thế nào nên tạm dùng cái Qunpack (Chưa có download tại đây)này để unpack nó : chạy qunpack.exe với quyền admin (win7:chuột phải, vào dòng run as admin, XP:cứ bật lên là được), mở file pokemon ra (click vào nút Open File rồi trỏ đến file pokemon.exe), điền giá trị OEP vào rồi click vào nut Full Unpack Muốn biết thêm OEP là gì thì xem ở đây : Portable Executable File Format Vậy là ta đã có được 1 file exe với ở dạng nguyên thể (tạm coi là thế) của game này. Ở đây tôi đặt tên file mới là Upokemon.exe Vậy đấy, sau khi unpack (và sau khi ăn 1 suất cơm ở ngoài tiệm) chúng ta thấy đã có sự khác nhiều rồi, ít nhất chúng ta đã thấy rõ ràng rằng cái pikachu này được viết bằng Microsoft Visual Basic , thấy link info là 4.20 hóa ra là Microsoft Visual Basic 5.0 Sau khi đã unpack ta hoàn toàn có thể dùng Reshack (Chưa có download tại đây) để lấy, thay đổi, các tài nguyên về icon, âm thanh wave, âm thanh midi trong file này 1 cách cực kì đơn giản Ôi trời là VB à, nản quá cơ tớ ko thích VB lắm. Nhưng bình tĩnh nào, chúng ta đã lấy được âm thanh, icon rồi, còn các bitmap thì lại ko lấy được bằng Reshack, làm sao đây ???? Vậy ta đành phải Decompile nó ra xem như thế nào, ồ, sau 1 hồi tìm tìm, kiếm kiếm, trọc trọc. ngoáy ngoáy, tôi đã tìm ra mấy cái ảnh bitmap của nó bằng tool sau PHP Code: http:www.mediafire.com?h97gb8q9rb3eka1 Hướng dẫn Decompile : cũng run cái vbdecompile với quyền admin, mở file upokemon.exe ra, nó hỏi có unpack ko chọn no vì ta đã unpack rồi, nó rồi click vào nút decompile, để lấy được mấy cái ảnh bitmap của nó thì bạn vào trong menu vào ... (không nhớ rõ lắm, các bạn tự mày mò đi 2 là thấy ngay ấy mà hờ hờ hờ hờ hờ) Decompile là gì ? đây là quá trình biên dịch: vậy Decompile là quá trình dịch ngược từ file .exe,.dll,.ocx.... lại thành mã nguồn, hờ hờ hờ Tôi nhận thấy 1 điều lí thú rằng : Upokemon.exe chơi ít bị out, dis, lỗi hơn pokemon.exe Attached Thumbnails 1. 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 Để 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 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 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(LThunderRT6FormDC, L³s³s¬Ý2); tìm cửa sổ pikachu if (hwnd) Nếu ko tìm thấy { MessageBox(HWND_DESKTOP,LBạn phải bật pikachu lên chơi trước đã,LThô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,LThô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(LThunderRT6FormDC, L³s³s¬Ý2); if (hwnd) { MessageBox(HWND_DESKTOP,LBạn phải bật pikachu lên chơi trước đã,LThô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,LThô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 DevC : 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 } Chap 3 : Vô hạn lượt đổi (unlimited continue) Cũng như lần trước nhưng có 1 vài thay đổi, đó là tôi biết địa chỉ của biến điểm là 004B6088 vậy tôi sẽ khoanh vùng lại tìm kiếm cho nhanh (theo kinh nghiệm thì 1 biến ở đó thì biến còn lại cũng chỉ ở gần gần đó thôi, ko đi xa đâu) nên tôi tìm như sau (lần này tôi tìm cả integer 4byte nữa) như trong hình sau Thật tuyệt vời, chỉ tìm 1 lần là ra luôn, nó là 1 số nguyên 4byte và có địa chỉ là 004B60AA vậy tôi demo luôn, cách thức cũng ko khác lần trước là mấy PHP Code: include void SetContinueTo999() { HWND hwnd =FindWindow(LThunderRT6FormDC, L³s³s¬Ý2); if (hwnd) { MessageBox(HWND_DESKTOP,LBạn phải bật pikachu lên chơi trước đã,LThông báo,MB_OK); } else { DWORD pid; int temp=0; GetWindowThreadProcessId(hwnd,pid); HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,pid); int address=(int)0x4B60AA; WriteProcessMemory(handle,address,temp,sizeof(temp),0); MessageBox(HWND_DESKTOP,LĐã add thành công,LThông báo,MB_OK); } } int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { SetContinueTo999(); return EXIT_SUCCESS; } và code chạy trên DEVC : PHP Code: include void SetContinueTo999() { HWND hwnd =FindWindow(ThunderRT6FormDC, ³s³s¬Ý2); if (hwnd) { MessageBox(HWND_DESKTOP,Ban phai bat pikachu len choi truoc da,Thông báo,MB_OK); } else { DWORD pid; int temp=0; GetWindowThreadProcessId(hwnd,pid); HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,pid); int address=(int)0x4B60AA; WriteProcessMemory(handle,address,temp,sizeof(temp),0); MessageBox(HWND_DESKTOP,Ðã add thành công,Thông báo,MB_OK); } } int main() { SetContinueTo999(); return 1; } Chap 4 : infinite time Đây là chap tương đổi khó, để infinite time chúng ta phải đảm bảo được 2 điều + Tìm ra điạ chỉ của biến time + Tư tưởng đóng băng nó I. Tìm ra địa chỉ của biến time : Cách 1 : Tôi dò dưới chế độ Unknown value : đầu tiên Bước 2 Nghỉ tầm 1s để thanh time bar tụt đi 1 tí rồi tôi làm như này sau đó cứ lặp lại bước 2 cho đến khi tìm thấy thì thôi (Tốn khá nhiều time để bạn tìm thấy nó đấy) Cách 2 : Cách 1 khá công phu và loằng ngoằng, nên theo kinh nghiệm, tôi ko làm như vậy, vào artmoney xem vùng nhớ ở gần cái biến điểm tôi thấy có 1 vùng cứ nhẩy giá trị liên tằng tằng theo thời gian, tôi đoán đó là biến time vô artmoney thử đóng băng cái giá trị đó tôi thấy thanh time bar nhúc nhíc quanh 1 điểm chứ ko tụt đi, vậy chính là nó là 1 số thực 4byte (float) có địa chỉ là 004B6084 (Vậy là nó đứng ngay cạnh, đằng trước biến điểm) II. Code đóng băng nó thật ra cái biến time này nó là 1 biến float nhưng khi memory map tớ còn phát hiện ra như sau : giả sử 4 byte của biến float đó là abcd bỏ qua 2 byte a,b quan tâm đến c d tớ thấy + c chạy từ 0 đến 1 giá trị max rồi lại trở về 0 chạy tiếp, theo nhịp của trò chơi, + d càng nhỏ thì c chạy càng nhanh, khi d bằng 69 thì bắt đầu chạy từ từ, khi d cao đến gần 80 thì c chạy chậm hẳn + d=0 thì c chạy cực nhanh, cỡ mini dây, vụt 1 phát, d thành 69 luôn và c bắt đầu chạy từ từ với tộc dộ chậm dần và vì vậy : + nếu set d thành số nhỏ hơn 69 thì ngay lập tức trở về bình thường + nếu set d thành 1 thì có nghĩa d chính là 255 (vì nó là 8bit mà) sẽ overflow ngay + nếu set cả biến float 4byte này thành 1 số âm thì theo cách tớ vừa mô tả ở trên d sẽ rất nhanh chóng phục hồi lại thành 69 và ko có tác dụng + nếu set cả biến float 4byte này thành 1 số lớn hơn mức cực đại thì sẽ kết thúc trận đấu luôn ==> thay đổi biến time này ko có hiệu quả nhưng suy ra 1 cách đó là ta làm đóng băng giống như các cheat engine đóng băng : cứ 100ms thì lại set d=0 một lần, như thế thanh time bar vẫn max, time vẫn vô cùng Tôi mất khá nhiều time để nghĩ và tìm ra cách đóng băng nó hay hơn + đầu tiên, đơn giản nhất, tôi nghĩ ra là sét giá trị cho nó 1 cách liên tục, demo PHP Code: while (..) { set max time() sleep(100) } nhưng như thế ko hay cho lắm, vậy cái hack tool và tôi viết ra lúc nào cũng phải chạy thì mới đóng băng được time, ko hay + tiếp theo : trong cái code decompile ra được, tôi thấy có 1 hàm sử lí TIMER, vậy tôi định kill timer của process này, nhưng còn loằng ngoằng hơn ..... và tôi chưa tìm được định danh của cái bộ timer này nên ..... lực bất tòng tâm + Cuối cùng, bực mình, sáng suốt tôi quyết định tìm ra nguyên nhân tay đổi nó. ví dụ trong process có 1 đoạn là time=10+time60 (ví dụ thế) . Tôi quyết định dùng các kinh nghiệm đã có để tìm ra đoạn mã gán giá trị cho biến time này, rồi tôi thay đổi luôn đoạn mã này đi, thế là ok ? Đúng ko bạn Bắt đầu nghĩ tôi thấy, time là 1 biến thực 4 byte, vậy với asm32 float processing thì đoạn mã tôi cần tìm sẽ có dạng như sau PHP Code: fld real4 ptr 004B6084 ..................... fstp real4 ptr 004B6084 fld viết tắt của float load fstp viết tắt của float store point tạm dịch sang ngôn ngữ nói nó là PHP Code: fload time .... xử lí linh tinh.... fsave time Đến đây tôi có 2 cách : Cách 1 đơn giản nhất mang tính tình huống, tôi mở VB Decompiler Pro với quyền admin, rồi decompile upikachu (xem chap1) , sau đó vào File vào Save all in one module file Được 1 file .bas . Mở file này bằng notepad rồi ấn Ctrl + F tìm kiếm chuỗi 004B6084, tìm đúng chỗ nào sử dụng toán tử fld với tham số là 004B6084 ta được PHP Code: 004B02C4: fld real4 ptr 004B6084h ; 004B02CA: fadd real8 ptr var_80 004B02CD: fild dword ptr var_14 004B02D0: mov var_14, ebx 004B02D3: fstp real8 ptr var_88 004B02D9: fsub real8 ptr var_88 004B02DF: fstp real4 ptr 004B6084h ; Cách 2 phức tạp hơn 1 tí : load Upokemon.exe bằng Ollydbg (Download tại đây) . Chú ý load file mà ta đã unpack rồi, sẽ dễ dàng hơn trong việc tìm kiếm > vào Ollybdb vào View vào Memory > Đúp chuột vào section .text > ra 1 cửa sổ dump, ta chuột phải, vào copy, vào select all > chuột phải lần nữa vào copy vào to file > được 1 file txt > tìm kiếm trên file này chú ý : theo luật littleendian by order 004B6084 thì trong máy nó được tổ chức là 84 60 4B 00, nên chuỗi tìm kiếm của ta trong cách này phaỉ là 84604B00 tìm và thu được kết quả như sau PHP Code: 004B02C4 D905 84604B00 FLD DWORD PTR > 004B02CA DC45 80 FADD QWORD PTR > 004B02CD DB45 EC FILD DWORD PTR > 004B02D0 895D EC MOV EBP14,EB> 004B02D3 DD9D 78FFFFFF FSTP QWORD PTR > 004B02D9 DCA5 78FFFFFF FSUB QWORD PTR > 004B02DF D91D 84604B00 FSTP DWORD PTR > III. Xử lý kết quả thu được như thế nào Ta đã có đoạn mã và địa chỉ của đoạn mã này trong bộ nhớ rồi, ta phải làm thế nào bây giờ ? Tôi nghĩ ra 1 cách , đó là tôi lái cái fld ra 1 chỗ khác, tôi cho nó fload sang ô điểm, hờ hờ hờ (như thế câu lệnh này sẽ trở thành) PHP Code: fload điểm .... xử lí linh tinh.... fsave time như thế này rõ ràng là chả có biến nào bị thay đổi cả rồi, hờ hờ hờ hờ (vì thằng điểm được load nhưng ko được save, thằng time được save nhưng bên trên đó lại chưa load, đâm ra chả có gì thay đổi cả) ở đây , tại ô nhớ 004B02C4 câu lệnh fld real4 ptr 004B6084h ; dài 6 byte 2 byte đầu chính là mã của toán tử fld(0x5D9) (Tôi biết là 6byte vì câu lệnh tiếp theo có địa chỉ 004B02CA), 4byte sau chính là tham số của toán tử này 004B6084h. ==> chung quy lại tôi sẽ viết 1 chương trình đổi giá trị tại địa chỉ 004B02C6 từ giá trị ban đầu là 004B6084 thành 004B6088 Code PHP Code: include void SetInfiniteTime() { HWND hwnd =FindWindow(LThunderRT6FormDC, L³s³s¬Ý2); if (hwnd) { MessageBox(HWND_DESKTOP,LBạn phải bật pikachu lên chơi trước đã,LThông báo,MB_OK); } else { DWORD pid; int temp=0x4B6088; GetWindowThreadProcessId(hwnd,pid); HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,pid); int address=(int)0x4B02C6; WriteProcessMemory(handle,address,temp,sizeof(temp),0); MessageBox(HWND_DESKTOP,LĐã set thành công,LThông báo,MB_OK); } } void UnSetInfiniteTime() { HWND hwnd =FindWindow(LThunderRT6FormDC, L³s³s¬Ý2); if (hwnd) { DWORD pid; int temp=0x4B6084; GetWindowThreadProcessId(hwnd,pid); HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,pid); int address=(int)0x4B02C6; WriteProcessMemory(handle,address,temp,sizeof(temp),0); MessageBox(HWND_DESKTOP,LĐã unset thành công,LThông báo,MB_OK); } } int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { SetInfiniteTime(); return EXIT_SUCCESS; } Code cho DevC PHP Code: include void SetInfiniteTime() { HWND hwnd =FindWindow(ThunderRT6FormDC, ³s³s¬Ý2); if (hwnd) { MessageBox(HWND_DESKTOP,Ban phai bat pikachu lon choi truoc do,Thung boo,MB_OK); } else { DWORD pid; int temp=0x4B6088; GetWindowThreadProcessId(hwnd,pid); HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,pid); int address=(int)0x4B02C6; WriteProcessMemory(handle,address,temp,sizeof(temp),0); MessageBox(HWND_DESKTOP,Do set thanh cong,Thong bao,MB_OK); } } void UnSetInfiniteTime() { HWND hwnd =FindWindow(ThunderRT6FormDC, ³s³s¬Ý2); if (hwnd) { DWORD pid; int temp=0x4B6084; GetWindowThreadProcessId(hwnd,pid); HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,pid); int address=(int)0x4B02C6; WriteProcessMemory(handle,address,temp,sizeof(temp),0); MessageBox(HWND_DESKTOP,Do unset thanh cong,Thong bao,MB_OK); } } int main() { SetInfiniteTime(); return 1; } Kết quả thành công hơn cả mong đợi, sau khi set 1 lần (Set lúc nào cũng được, kể cả chưa vào game)thanh time bar sẽ đứng im luôn, ko dịch chuyển nữa, luôn ở trạng thái max, cho dù new game nhiều lần vẫn ko ảnh hưởng. Kết luận : Với tất cả 4 chap trên, bạn hoàn toàn có thể viết 1 cái hack tool cho pikachu rồi đấy, nếu ko có kinh nghiệm tạo các ứng dụng trên windows, các bạn hoàn toàn có thể dùng DEVC để viết lên 1 chương trình có menu như bình thường, nhập 1 để add point, 2 để hack mạng .......... Chúc các bạn thành công và vui vẻ với loạt tut này. Chap 5 : Cheat mode hôm nay ko rảnh rảnh nhưng vẫn ngồi viết tiếp phần mở đầu cho chap 5 I. Fix lại lỗi bị dis khi chơi : khi chúng ta chơi pikachu, chúng ta thấy game bị dis mỗi khi bài hát hết, bực mình thật đó, ko biết làm sao cả, tôi lại phân tích thế này sau khi unpack và dùng reshack tôi phát hiện ra trong source dùng midi làm nhạc nền cho app, có 3 bài nhạc nền vậy là đầu tiên chúng chơi 1 bài, sau đó đổi bài chơi bài tiếp vậy là lỗi khi đổi bài, xem tiếp source decompile 1 lúc, chưa thấm gì, dùng vbdecompiler 7.9 thì thấy nó decompiler ra cả source vb chứ ko phải là asm nữa, tôi thì chưa từng học vb bao giờ cả nhưng xem source vb này, sơ sơ tôi đánh giá được như này nè ở trong vb5.0 nó có thể play midi mà ko cần đến việc quan tâm tạo ra 1 player như trong C++ mà chỉ việc bắt play music còn lại thì msvbvm quyết định, sound play được nhúng vào từ wmmlib chỉ là để play các .wav thôi chứ lại ko play midi...... tớ thấy là thế, các vb coder sai ở đâu thì giúp tớ chỉ bảo tớ nhé. cám ơn các bạn tớ bắt đầu tìm thêm code thấy là nó như này, nó dùng 1 sự kiện timer của form để bắt đầu đếm xem đã play được đến đâu rồi, nếu mà hết bài thì nó thực hiện đoạn mã đổi bài vụ này được nằm hết trong sự kiện timer của main form mở lại VB Decompiler Pro ta thấy được dòng như sau PHP Code: Private Sub Timer_PlayMidi_Timer() 4B30D0 rất gợi mở phải ko nào Load pikachu với olldbg chuột phải vào dòng go to > Expression nhập địa chỉ 4B30D0 để jump đển hàm đó chà, hàm này dài quá, loằng ngoằng nữa, tôi cũng hơi gà, ko biết đoạn lệnh nào là chuyển đổi bài hát cả, thôi mạo muội đổi đổi luôn cái hàm này thành hàm ko có gì chỉ vào dòng có địa chỉ 4B30D0, ấn space 1 cái, đổi mã của hàm này thành PHP Code: RET (lúc ấn space xong, nó hiện ra 1 cái ô input nhỏ, cứ thể gõ RET vào rồi enter phát là được) tức là câu lệnh return trong C ấy mà, có mã là C3 rồi ấn vào nút play ở trên menu (hoặc F9) để chạy thử cái, thấy ngon lành cành đào, đợi tiếp xem hết bài nhạc có dis ko, ko thấy dis, hì hì bây giờ ngon rồi, ==>> ta sẽ xóa bỏ tất cả các dòng còn còn lại trong hàm đó bằng các : bôi đen toàn bộ dòng code của hàm này, chuột phải vào edit binary chỉ vào ô hex ở trong cửa sổ edit, ấn ctrl + a rồi chuột phải tiếp vào set zero để toàn bộ vùng này có giá trị là 0 hết (0 là ko có gì ) ==> ngon rồi, ta đã loại bỏ đi cái hàm thừa thãi ko cần thiết làm thế nào nhỉ để lấy được cái chương trình đã debug này? chuột phải, vào dòng dump debugged process rồi ấn dump là được hi hi tôi thấy lạ là tôi dùng windows7 dump thì được file chạy luôn ở trong xp dump thì phải dùng ImportREC để rebuild lại mới chạy được bây giờ được rồi, chạy hoài ko dis nhưng mà thế này rõ ràng là thừa 2 file midi trong resource rồi lại dùng reshack để del 2 bài midi thứ 2 và thứ 3 đi thế là dung lượng nhỏ đi bao nhiêu C++ Code: Select All | ShowHide 1. HWND FindGameWindow() 2. { 3. HWND hwnd=FindWindow(LThunderRT6FormDC, L³s³s¬Ý2); 4. if (hwnd) hwnd=FindWindow(LThunderRT6FormDC, LPikachu); 5. if (hwnd) hwnd=FindWindow(LThunderRT5Form, L³s³s¬Ý2); 6. if (hwnd) hwnd=FindWindow(LThunderRT5Form, LPikachu); 7. return hwnd; 8. } 9. void FixGameBug() 10. { 11. HWND hwnd=FindGameWindow(); 12. if (hwnd) 13. { 14. DWORD pid; 15. char temp=0xC3; 16. GetWindowThreadProcessId(hwnd,pid); 17. HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,pid); 18. int address=(int)0x4B30D0; 19. WriteProcessMemory(handle,address,temp,sizeof(temp),0); 20. } 21. } II. Sửa đổi màu nền khi chơi trong quá trình tìm ra ma trận biểu diễn các con bài trên màn hình nền của form chính tôi phát hiện ra như sau : new game ở pikachu rồi , bật artmoney lên, tìm chế độ unknown value, interger 1 byte (để dò từng byte 1) trong khoảng dữ liệu tôi tính (lần trước thấy cả 3 biến cần thiết ở cái vùng đó, nên rõ ràng tôi vẫn khoanh vùng đó đề tìm kiếm rồi ) lose game ở pikachu, new game mới rồi tìm lại các giá trị was changed lại lose game ở pikachu, new game mới rồi tìm lại các giá trị was changed lại lose game ở pikachu, new game mới rồi tìm lại các giá trị was changed ..... ở lần thứ 3 tôi thấy cái ô này PHP Code: 004B6070 có giá trị thay đổi theo mỗi lượt chơi, thử thay đổi 1 phát thấy màu nền thay đổi luôn nghịch thêm tí thấy : ô này là ô màu nền, có giá trị từ 0 đến 5 tương ứng với 6 màu khác nhau ==> code hack, tương tự như các code đã share ở trên thôi, chưa có gì đặc biệt cả C++ Code: 22. HWND FindGameWindow() 23. { 24. HWND hwnd=FindWindow(LThunderRT6FormDC, L³s³s¬Ý2); 25. if (hwnd) hwnd=FindWindow(LThunderRT6FormDC, LPikachu); 26. if (hwnd) hwnd=FindWindow(LThunderRT5Form, L³s³s¬Ý2); 27. if (hwnd) hwnd=FindWindow(LThunderRT5Form, LPikachu); 28. return hwnd; 29. } 30. void SetGameBackground(int n) 31. { 32. HWND hwnd=FindGameWindow(); 33. if (hwnd) 34. { 35. DWORD pid; 36. int temp=n%6; 37. GetWindowThreadProcessId(hwnd,pid); 38. HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,pid); 39. int address=(int)0x4B6070; 40. WriteProcessMemory(handle,address,temp,sizeof(temp),0); 41. } 42. } 43. void ChangeGameBackground() 44. { 45. HWND hwnd=FindGameWindow(); 46. if (hwnd) 47. { 48. DWORD pid; 49. int temp=0; 50. GetWindowThreadProcessId(hwnd,pid); 51. HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,pid); 52. int address=(int)0x4B6070; 53. ReadProcessMemory(handle,address,temp,sizeof(temp),0); 54. temp+=1; 55. temp%=6; 56. WriteProcessMemory(handle,address,temp,sizeof(temp),0); 57. } 58. } Chap 6: Trainer Pikachu(Tổng hợp 5 chaplangman + Auto Pikachupuss) Những thứ chúng ta cần: 0. Đã đọc và hiểu kỹ 5 chap do langman viết. 1. Tạo 1 giao diện thuận tiện cho việc sử dụng. 2. Địa chỉ biến thời gian: pTime >Code đóng băng thời gian 3. Địa chỉ biến điểm: pPoint >Code tăng 100 điểm 1 lần ăn 4. Địa chỉ biến lượt đổi: pLife >Code Vô hạn lượt đổi 5. Địa chỉ số lượng con quái còn trên màn hình: pNumber > Code Ăn 1 con win luôn trong màn hiện tại 6. Địa chỉ số lượng quái vật khi vào màn chơi mới sẽ gán: pNumberConst >Code Ăn 1 con win luôn vẫn có tác dụng trong các cửa tiếp theo 7. Địa chỉ ma trận lưu các thông tin trạng thái về các con quái: pMap > Code Ăn 2 con khác nhau 8. Thuật toán tìm 2 con ăn được trên ma trận bản đồ > Code tìm 2 con ăn 9. Mở rộng thêm 1 chút phần 7 để viết 1 auto tự chơi pikachu theo lựa chọn SingleAll (auto 1 màn auto đến màn cuối). Những thứ chúng ta đã có (ai chưa hiểu đề nghị đọc lại kỹ 5 chap của langman): 2. Địa chỉ biến thời gian: pTime=0x004B6084; >Code đóng băng thời gian 3. Địa chỉ biến điểm: pPoint=0x004B6088; >Code tăng 100 điểm 1 lần ăn 4. Địa chỉ biến lượt đổi: pLife=0x004B60AA; >Code Vô hạn lượt đổi Ok, bắt đầu thôi Phần 0. Đã đọc và hiểu kỹ 5 chap Cái này bạn nào chưa hiểu kỹ thì đọc lại nhé, rất quan trọng đấy. Phần 1. Tạo giao diện: Nhìn chung giao diện sẽ thế này: Ghi chú: 4 chức năng đầu tiên khi bấm sẽ thêm dấu ở cuối tức là chức năng tương ứng đã được kích hoạt, bấm 1 lần nữa dấu sẽ biến mất và chức năng tương ứng sẽ bị tắt Code giao diện: Code: include include define BTN_FROZENTIME 1 define BTN_POINTEAT 2 define BTN_ULTIMATELIFE 3 define BTN_WIN 4 define BTN_SAME 5 define BTN_CHEAT 6 define BTN_AUTO 7 define RAD_STATUSAUTOSINGLE 8 define RAD_STATUSAUTOALL 9 Khai bao ham LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); Sau này sẽ viết thêm code khai báo hàm vào chỗ này Khai bao dia chi cac pointer Sau này sẽ viết thêm code khai báo pointer vào chỗ này Khai bao cac bien Sau này sẽ viết thêm code khai bao biến vào chỗ này Cac thong tin ve cua so Pikachu static HWND hwin; static HANDLE hProcess; static DWORD pid; Sau này sẽ viết thêm code khai báo thông tin cửa sổ pikachu vào chỗ này int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName=TEXT(Pikachu Trainer); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style=CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc=WndProc; wndclass.cbClsExtra=0; wndclass.cbWndExtra=0; wndclass.hInstance=hInstance; wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor=LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName=NULL; wndclass.lpszClassName=szAppName; if (RegisterClass(wndclass)) { MessageBox(NULL, TEXT(This program requires Windows NT), szAppName, MB_ICONERROR); return 0; } hwnd=CreateWindow(szAppName, TEXT(Pikachu Trainer), WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 198, 350, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(msg, NULL, 0, 0)) { TranslateMessage(msg); DispatchMessage(msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static int cxChar, cyChar; static HWND hwndBtnFrozenTime, hwndBtnPointEat, hwndBtnUltimateLife, hwndBtnWin, hwndBtnCheat, hwndBtnSame, hwndRadStatusAutoSingle, hwndRadStatusAutoAll, hwndBtnAuto; static char cPointEatStatus, cFrozenTimeStatus, cUltimateLifeStatus, cWinStatus, cAutoStatus; TCHAR t100; HWND h; switch(message) { case WM_CREATE: cxChar = LOWORD (GetDialogBaseUnits ()) ; cyChar = HIWORD (GetDialogBaseUnits ()) ; cFrozenTimeStatus=0; hwndBtnFrozenTime = CreateWindow (TEXT(button), TEXT(Dong bang thoi gian), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cxChar, cyChar1, 22 cxChar, 7 cyChar 4, hwnd, (HMENU) BTN_FROZENTIME, ((LPCREATESTRUCT) lParam)>hInstance, NULL); cPointEatStatus=0; hwndBtnPointEat = CreateWindow (TEXT(button), TEXT(100 diem1 lan an), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cxChar, cyChar3, 22 cxChar, 7 cyChar 4, hwnd, (HMENU) BTN_POINTEAT, ((LPCREATESTRUCT) lParam)>hInstance, NULL); cUltimateLifeStatus=0; hwndBtnUltimateLife = CreateWindow (TEXT(button), TEXT(Vo han luot doi), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cxChar, cyChar5, 22 cxChar, 7 cyChar 4, hwnd, (HMENU) BTN_ULTIMATELIFE, ((LPCREATESTRUCT) lParam)>hInstance, NULL); cWinStatus=0; hwndBtnWin = CreateWindow (TEXT(button), TEXT(An 1 con Win luon), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cxChar, cyChar7, 22 cxChar, 7 cyChar 4, hwnd, (HMENU) BTN_WIN, ((LPCREATESTRUCT) lParam)>hInstance, NULL); hwndBtnSame = CreateWindow (TEXT(button), TEXT(An lung tung), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cxChar, cyChar9, 22 cxChar, 7 cyChar 4, hwnd, (HMENU) BTN_SAME, ((LPCREATESTRUCT) lParam)>hInstance, NULL); hwndBtnCheat = CreateWindow (TEXT(button), TEXT(Tim 2 con an), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cxChar, cyChar11, 22 cxChar, 7 cyChar 4, hwnd, (HMENU) BTN_CHEAT, ((LPCREATESTRUCT) lParam)>hInstance, NULL); hwndBtnAuto = CreateWindow (TEXT(button), TEXT(Auto Pikachu), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cxChar, cyChar13, 22 cxChar, 7 cyChar 4, hwnd, (HMENU) BTN_AUTO, ((LPCREATESTRUCT) lParam)>hInstance, NULL); hwndRadStatusAutoSingle = CreateWindow (TEXT(button), TEXT(Single), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, cxChar, cyChar15, 10 cxChar, 7 cyChar 4, hwnd, (HMENU) RAD_STATUSAUTOSINGLE, ((LPCREATESTRUCT) lParam)>hInstance, NULL); SendMessage(hwndRadStatusAutoSingle, BM_SETCHECK, 1, 0); cAutoStatus=0; hwndRadStatusAutoAll = CreateWindow (TEXT(button), TEXT(All), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 12cxChar, cyChar15, 10 cxChar, 7 cyChar 4, hwnd, (HMENU) RAD_STATUSAUTOALL, ((LPCREATESTRUCT) lParam)>hInstance, NULL); Find Window Pikachu hwin=FindWindow(TEXT(ThunderRT5Form), TEXT(³s³s¬Ý2)); if (hwin==NULL){ MessageBox(NULL, TEXT(Ban phai bat pikachu len da.), TEXT(Error), 0); SendMessage(hwnd, WM_CLOSE, 16, 1); return 0; } Open Process Pikachu GetWindowThreadProcessId(hwin, pid); hProcess=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); Find Client Sau này sẽ viết thêm code vào chỗ này Init some value Sau này sẽ viết thêm code khởi tạo 1 số giá trị vào chỗ này return 0; case WM_PAINT: hdc=BeginPaint(hwnd, ps); wsprintf(t, TEXT(Made by langman, puss)); TextOut(hdc, cxChar, cyChar18, t, wcslen(t)); EndPaint(hwnd, ps); return 0; case WM_COMMAND: switch(LOWORD(wParam)){ case BTN_FROZENTIME: Sau này sẽ viết thêm code đóng băng vào chỗ này break; case BTN_POINTEAT: Sau này sẽ viết thêm code ăn 100 điểm 1 lần vào chỗ này break; case BTN_ULTIMATELIFE: Sau này sẽ viết thêm code vô hạn lượt đổi vào chỗ này break; case BTN_WIN: Sau này sẽ viết thêm code ăn 1 con win luôn vào chỗ này break; case BTN_SAME: Sau này sẽ viết thêm code ăn 2 con khác nhau vào chỗ này break; case BTN_CHEAT: Sau này sẽ viết thêm code tìm 2 con ăn vào chỗ này break; case BTN_AUTO: Sau này sẽ viết thêm code auto chơi pikachu vào chỗ này break; case RAD_STATUSAUTOSINGLE: cAutoStatus=0; break; case RAD_STATUSAUTOALL: cAutoStatus=1; break; } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } Ok, vậy là xong phần giao diện. Phần 2. Đóng băng thời gian: Trong chap đóng băng thời gian, bạn langman đã thay đổi như sau: Code: fld điểm xử lý linh tinh fsave time như thế này rõ ràng là chả có biến nào bị thay đổi cả rồi, hờ hờ hờ hờ (vì thằng điểm được load nhưng ko được save, thằng time được save nhưng bên trên đó lại chưa load, đâm ra chả có gì thay đổi cả) Mình xin đính chính lại 1 chút. Thật ra là biến time vẫn bị thay đổi. Nguyên nhân thay đổi biến thời gian có thể tưởng tượng như sau: time=MAX_TIMEtimex; Làm theo cách của bạn langman thì sau khi sửa biểu thức trên sẽ thành: time=MAX_TIMEđiểmx; tức là nó fld điểm thay vào chỗ của time vì biến time tính theo giây, kiểu float lên sau vài giây sẽ to rất nhanh. Lúc mới chơi điểm thấp nên bạn hầu như không có cảm giác vạch thời gian chạy, nếu khi bạn chơi điểm cao cao 1 chút thì để ý thấy vạch thời gian có tụt đi 1 tí, đó là vì time vẫn bị trừ. Giải quyết trọn vẹn vấn đề này thế nào? 1 cách rất đơn giản, ta sẽ sửa lại biểu thức thay đổi time thành: y=MAX_TIMEtimex; (y là 1 biến nào đấy) như vậy thì time chẳng bao giờ bị thay đổi cả, chỉ có biến y nào đó bị thay đổi thôi. Hơn nữa nếu làm theo cách này, code đóng băng sẽ đẹp hơn. Khi bạn đóng băng ở chỗ nào thì vạch thời gian sẽ dừng ngay tại chỗ đó. Và khi bạn tắt đóng băng thì thời gian sẽ chạy tiếp ở chỗ đã dừng. Vấn đề nan giải ở chỗ phải chọn ai là kẻ đóng thế cho time? Chọn lung tung có thể gay crash chương trình ấy chứ. Mở onllydbg ra nào, Ctrl+G tới địa chỉ mà langman đã tìm thấy là: 4B02C4 xem kiếm được gì không? Bạn sẽ thấy thế này: FLD DWORD PTR DS: 4B6084 FADD QWORD PTR SS: EBP80 FILD DWORD PTR SS:EBP14 MOV DWORD PTR SS:EBP14,EBX FSTP QWORD PTR SS:EBP88 FSUB QWORD PTR SS:EBP88 FSTP DWORD PTR DS:4B6084 Hô hô, bạn thấy diễn viên đóng thế chúng ta cần tìm rồi chứ? Bạn để ý chỗ này nhé: FSTP QWORD PTR SS:EBP88 FSUB QWORD PTR SS:EBP88 FSTP DWORD PTR DS:4B6084 lưu điểm bạn còn nhớ cái biểu thức làm thay đổi thời gian phía trên không? time=MAX_TIMEtimex địa chỉ EBP88 có thể coi chính là thằng x trong biểu thức trên. vậy thì ta chỉ cần sửa lại thế này: FSTP DWORD PTR DS:4B6084 thành FSTP DWORD PTR SS:EBP88 tức là biểu thức thay đổi thời gian sẽ thành: x=MAX_TIMEtimex; FSTP DWORD PTR DS:4B6084 có mã hex là: D91D 84604B00 FSTP DWORD PTR SS:EBP88 có mã hex là D99D 78FFFFFF Thời cơ tới rồi, mở code giao diện ra, tới phần Khai báo các pointer và khai báo địa chỉ chỗ đóng băng thời gian: Code: const int pFrozenTime=0x004B02DF; Tiếp theo ta khai báo ngay 2 mảng 6 byte ở chỗ khai báo biến: Code: static unsigned char arrUnFrozenTime6={0xd9, 0x1d, 0x84, 0x60, 0x4b, 0x00}; static unsigned char arrFrozenTime6={0xd9, 0x9d, 0x78, 0xff, 0xff, 0xff}; Tới chỗ Sau này sẽ viết thêm code đóng băng vào chỗ này và viết thôi Code: if (cFrozenTimeStatus==0){ WriteProcessMemory(hProcess, (int )pFrozenTime, arrFrozenTime, 6sizeof(char), NULL); SetWindowText(hwndBtnFrozenTime, TEXT(Dong bang thoi gian )); } else{ WriteProcessMemory(hProcess, (int )pFrozenTime, arrUnFrozenTime, 6sizeof(char), NULL); SetWindowText(hwndBtnFrozenTime, TEXT(Dong bang thoi gian)); } cFrozenTimeStatus=1cFrozenTimeStatus; Ok men, vậy là đã chạy ngon Phần 3. 100 điểm1 lần ăn: Theo chap hack điểm của langman, chúng ta đã có được địa chỉ của biến điểm là 1 số thức 4 byte Địa chỉ của biến điểm là: pPoint=0x004B6088; Làm thế nào để mỗi khi ăn ta được cộng thêm 100 điểm chứ không phải 20 điểm như bình thường? theo kinh nghiệm của bạn langman trong chương đóng băng thời gian, mình đoán đoạn code khi ăn điểm sẽ được tăng lên thế này: Code: FLD điểm cộng thêm vào điểm 20 FSTP điểm bắt tay vào tìm luôn, vào onllydbg, bấm nút home cho nó về đầu entry, bấm ctrl+b, chọn dòng HEX, gõ vào chuỗi 88604B00 chọn forward và Search Search khoảng 3~5 lần gì đó, bạn sẽ tới được chỗ này: Bạn có nhìn rõ cái gì kia không??? FLOAT 20.00000, 1 số thực có giá trị là 20.00000 Haha, hóa ra là mỗi lần ta ăn 2 con, nó sẽ trừ vào số điểm của ta 20 điểm, chứ không phải cộng thêm 20 điểm như ta vẫn nghĩ. Xem kỹ dòng lệnh tại đây nào: Code: 004b0829 d825 5c104000 FSUB DWORD PTR DS:40105C FLOAT 20.00000 vậy có nghĩa là địa chỉ 40105c chính là nơi lưu con số 20.00000 yêu quí của chúng ta. Làm luôn xem sao? Mở code, tới phần khai báo pointer và thêm đoạn sau: Code: const int pPointEat=0x0040105C; Tới phần khai báo biến và thêm đoạn này: Code: static float fPointEat; Tới phần Sau này sẽ viết thêm code ăn 100 điểm 1 lần vào chỗ này và viết Code: if (cPointEatStatus==0){ fPointEat=100; SetWindowText(hwndBtnPointEat, TEXT(100 diem1 lan an )); } else{ fPointEat=20; SetWindowText(hwndBtnPointEat, TEXT(100 diem1 lan an)); } cPointEatStatus=1cPointEatStatus; WriteProcessMemory(hProcess, (int )pPointEat, fPointEat, sizeof(float), NULL); Phần 4. Vô hạn lượt đổi: Theo chap vô hạn lượt đổi của langman, ta có địa chỉ của biến lượt đổi là: pLife=0x004B60AA; Bạn langman đã set lại giá trị của ô lượt đổi để chúng ta có nhiều lượt đổi hơn. Hi, giờ mình sẽ nghĩ ra 1 trò chơi mới với cái ô địa chỉ điểm này. Mình sẽ làm cho mỗi khi không còn con nào ăn trên bản đồ, chương trình sẽ đổi sang bàn mới, nhưng không bị trừ lượt đổi nào cả. Hehe, làm thế này thì dù bạn chỉ còn 1 lượt đổi thì cũng chẳng bao giờ bị hết cả. Bắt tay vào làm nên hạnh phúc nào Trước tiên tìm hiểu kỹ về kẻ địch một chút: địa chỉ ô lượt đổi là: pLife=0x004B60AA; giá trị tại ô lượt đổi là 1 số nguyên có dấu 2byte, vậy ta có thể set giá trị tối đa cho lượt đổi là 2(161) = 32.768; Mỗi lần hết con ăn, chương trình sẽ chuyển sang bàn mới và trừ vào lượt đổi 1 lần. Tình hình đoạn code sẽ có dạng thế này: Code: Hết con ăn, đổi sang bàn mới: Khởi tạo lại bản đồ mới Trừ 1 lần vào biến đổi ... Kết thúc Vào onnlydbg, bấm nút home về đầu, ctrl+b, vào ô hex và gõ: AA604B00, chọn forward, Search Lần này có vẻ vất vả quá, bấm Search tận 9 lần mình mới thấy chỗ này: Code: MOV AX,WORD PTR DS:4B60AA Nó sẽ chuyển giá trị của biến lượt đổi vào thanh ghi AX (vì lượt đổi chỉ có 2 byte) XOR ECX,ECX PUSH EBX DEC AX Trừ thanh ghi AX đi 1 ..... MOV WORD PTR DS:4B60AA,AX Lưu lại giá trị thanh ghi AX vào địa chỉ 4B60AA Hihi, các bạn biết chúng ta phải làm gì rồi chứ? Ở chỗ DEC AX, chúng ta sẽ sửa lại thành NOP, NOP hết (tức là chương trình sẽ chẳng làm gì hết). Vậy là chẳng có cái gì bị thay đổi cả hehe. Code: DEC AX có mã hex là 0x4866 NOP NOP có mã hex là 0x9090 Start Code: Tới phần khai báo các pointer và thêm dòng này: Code: const int pLifeSub=0x004B0FB8; Tới phần khai báo biến: Code: static unsigned short int vFirst=0x4866; static unsigned short int vChange=0x9090; Tới phần Sau này sẽ viết thêm code vô hạn lượt đổi vào chỗ này: Code: if (cUltimateLifeStatus==0){ WriteProcessMemory(hProcess, (int )pLifeSub, vChange, sizeof(vChange), NULL); SetWindowText(hwndBtnUltimateLife, TEXT(Vo han luot doi )); } else{ WriteProcessMemory(hProcess, (int )pLifeSub, vFirst, sizeof(vFirst), NULL); SetWindowText(hwndBtnFrozenTime, TEXT(Vo han luot doi)); } cUltimateLifeStatus=1cUltimateLifeStatus; Xong, phần tiếp theo... Phần 5. Ăn 1 con win luôn (chỉ có tác dụng trong 1 cửa): Mở pikachu lên, các bạn thấy ngay pikachu có một bản đồ gồm 9 hàng và 16 cột. Suy ra tổng cộng có tất cả 916=144 hình quái vật. Suy ra biến lưu số lượng quái vật có khả năng sẽ là byte. Mở artMoney lên, Search kiểu 1 byte giá trị 144. Vào pikachu ăn 2 con, rồi ra ArtMoney scan 142. Tiếp theo ăn 2 con nữa, rồi ra ArtMoney scan 140. .... Làm 2~3 lần các bạn sẽ có được địa chỉ số lượng con quái còn trên màn hình: pNumber=0x004B6078; Tới đây các bạn chỉ cần set giá trị tại ô nhớ pNumber thành 2, rồi ăn 1 con nữa là sẽ Win luôn. Nhưng làm như thế này, nó sẽ chỉ có tác dụng trong 1 màn đang chơi. Nếu đổi sang màn sau, lại phải chỉnh giá trị tại pNumber thành 2 thì mới có tác dụng. Mình muốn khi nào tắt đi thì nó mới hết cơ... Cần phải tìm ra gốc rễ của vấn đề thôi. Phần 6. Ăn 1 con win luôn (khi nào tắt thì mới hết): Khi vào 1 màn chơi mới hoặc khi bạn qua cửa, giá trị tại địa chỉ pNumber sẽ được gán bằng 144. Vậy ta cần phải tìm ra nơi chứa con số 144 đó, và sửa nó lại thành số 2. Vậy là bất cứ khi nào ta bắt đầu trò chơi mới, hoặc khi qua cửa thì giá trị tại địa chỉ pNumber sẽ tự được gán bằng 2, và ta chỉ cần ăn 1 con là Win luôn. Vào OnllyDbg, Home, Ctrl+B, gõ vào ô Hex: 78604B00, Search. Ối dời ơi, mới Search có 1 phát đã thấy luôn cái này: Code: MOV WORD PTR DS:4B6078,90 90 trọng hệ 16 đổi sang hệ 10 vừa bằng 144 quá đẹp, ta chỉ cẩn sửa con số 90 này thành số 2 là ok Bắt tay vào viết code Ăn 1 con win luôn Thêm cái này vào chỗ khai báo pointer: Code: const int pNumber=0x004B6078; const int pNumberConst=0x004A8866; Thêm cái này vào chỗ khai báo biến: Code: static unsigned char cNumber; static unsigned char cNumberConst; Tới chỗ: Sau này sẽ viết thêm code ăn 1 con win luôn vào chỗ này Code: if (cWinStatus==0){ cNumber=2; WriteProcessMemory(hProcess, (int )(pNumber), cNumber, 1, NULL); cNumberConst=2; WriteProcessMemory(hProcess, (int )(pNumberConst+7), cNumberConst, 1, NULL); SetWindowText(hwndBtnWin, TEXT(An 1 con Win luon )); } else{ cNumberConst=144; WriteProcessMemory(hProcess, (int )(pNumberConst+7), cNumberConst, 1, NULL); SetWindowText(hwndBtnWin, TEXT(An 1 con Win luon)); } cWinStatus=1cWinStatus; Vậy là hôm nay mình đã hướng dẫn các bạn làm 6 phần đầu tiên của Tut Trainer Pikachu. Còn 3 phần nữa khá dài và khó hơn 6 phần đầu 1 chút nên mấy hôm nữa rảnh mình sẽ post tiếp. Chúc các bạn vui vẻ Upload luôn file code, nhé. PHP Code: include include define BTN_FROZENTIME 1 define BTN_POINTEAT 2 define BTN_ULTIMATELIFE 3 define BTN_WIN 4 define BTN_SAME 5 define BTN_CHEAT 6 define BTN_AUTO 7 define RAD_STATUSAUTOSINGLE 8 define RAD_STATUSAUTOALL 9 Khai bao ham LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); Sau này s? vi?t thêm code khai báo hàm vào ch? này Khai bao dia chi cac pointer const int pFrozenTime=0x004B02DF; const int pPointEat=0x0040105C; const int pLifeSub=0x004B0FB8; Sau này s? vi?t thêm code khai báo pointer vào ch? này Gia tri tai cac pointer Sau này s? vi?t thêm code khai báo giá tr? pointer vào ch? này Khai bao cac bien static unsigned char arrUnFrozenTime6={0xd9, 0x1d, 0x84, 0x60, 0x4b, 0x00}; static unsigned char arrFrozenTime6={0xd9, 0x9d, 0x78, 0xff, 0xff, 0xff}; static float fPointEat; static unsigned short int vFirst=0x4866; static unsigned short int vChange=0x9090; Sau này s? vi?t thêm code khai bao bi?n vào ch? này Cac thong tin ve cua so Pikachu static HANDLE hwin, hProcess; static DWORD pid; Sau này s? vi?t thêm code khai báo thông tin c?a s? pikachu vào ch? này int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName=TEXT(Pikachu Trainer); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style=CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc=WndProc; wndclass.cbClsExtra=0; wndclass.cbWndExtra=0; wndclass.hInstance=hInstance; wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor=LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName=NULL; wndclass.lpszClassName=szAppName; if (RegisterClass(wndclass)) { MessageBox(NULL, TEXT(This program requires Windows NT), szAppName, MB_ICONERROR); return 0; } hwnd=CreateWindow(szAppName, TEXT(Pikachu Trainer), WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 198, 350, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(msg, NULL, 0, 0)) { TranslateMessage(msg); DispatchMessage(msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static int cxChar, cyChar; static HWND hwndBtnFrozenTime, hwndBtnPointEat, hwndBtnUltimateLife, hwndBtnWin, hwndBtnCheat, hwndBtnSame, hwndRadStatusAutoSingle, hwndRadStatusAutoAll, hwndBtnAuto; static char cPointEatStatus, cFrozenTimeStatus, cUltimateLifeStatus, cWinStatus, cAutoStatus; TCHAR t100; HWND h; switch(message) { case WM_CREATE: cxChar = LOWORD (GetDialogBaseUnits ()) ; cyChar = HIWORD (GetDialogBaseUnits ()) ; cFrozenTimeStatus=0; hwndBtnFrozenTime = CreateWindow (TEXT(button), TEXT(Dong bang thoi gian), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cxChar, cyChar1, 22 cxChar, 7 cyChar 4, hwnd, (HMENU) BTN_FROZENTIME, ((LPCREATESTRUCT) lParam)>hInstance, NULL); cPointEatStatus=0; hwndBtnPointEat = CreateWindow (TEXT(button), TEXT(100 diem1 lan an), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cxChar, cyChar3, 22 cxChar, 7 cyChar 4, hwnd, (HMENU) BTN_POINTEAT, ((LPCREATESTRUCT) lParam)>hInstance, NULL); cUltimateLifeStatus=0; hwndBtnUltimateLife = CreateWindow (TEXT(button), TEXT(Vo han luot doi), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cxChar, cyChar5, 22 cxChar, 7 cyChar 4, hwnd, (HMENU) BTN_ULTIMATELIFE, ((LPCREATESTRUCT) lParam)>hInstance, NULL); cWinStatus=0; hwndBtnWin = CreateWindow (TEXT(button), TEXT(An 1 con Win luon), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cxChar, cyChar7, 22 cxChar, 7 cyChar 4, hwnd, (HMENU) BTN_WIN, ((LPCREATESTRUCT) lParam)>hInstance, NULL); hwndBtnSame = CreateWindow (TEXT(button), TEXT(An lung tung), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cxChar, cyChar9, 22 cxChar, 7 cyChar 4, hwnd, (HMENU) BTN_SAME, ((LPCREATESTRUCT) lParam)>hInstance, NULL); hwndBtnCheat = CreateWindow (TEXT(button), TEXT(Tim 2 con an), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cxChar, cyChar11, 22 cxChar, 7 cyChar 4, hwnd, (HMENU) BTN_CHEAT, ((LPCREATESTRUCT) lParam)>hInstance, NULL); hwndBtnAuto = CreateWindow (TEXT(button), TEXT(Auto Pikachu), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, cxChar, cyChar13, 22 cxChar, 7 cyChar 4, hwnd, (HMENU) BTN_AUTO, ((LPCREATESTRUCT) lParam)>hInstance, NULL); hwndRadStatusAutoSingle = CreateWindow (TEXT(button), TEXT(Single), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, cxChar, cyChar15, 10 cxChar, 7 cyChar 4, hwnd, (HMENU) RAD_STATUSAUTOSINGLE, ((LPCREATESTRUCT) lParam)>hInstance, NULL); SendMessage(hwndRadStatusAutoSingle, BM_SETCHECK, 1, 0); cAutoStatus=0; hwndRadStatusAutoAll = CreateWindow (TEXT(button), TEXT(All), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 12cxChar, cyChar15, 10 cxChar, 7 cyChar 4, hwnd, (HMENU) RAD_STATUSAUTOALL, ((LPCREATESTRUCT) lParam)>hInstance, NULL); Find Window Pikachu hwin=FindWindow(TEXT(ThunderRT5Form), TEXT(³s³s¬Ý2)); if (hwin==NULL){ MessageBox(NULL, TEXT(Ban phai bat pikachu len da.), TEXT(Error), 0); SendMessage(hwnd, WM_CLOSE, 16, 1); return 0; } Open Process Pikachu GetWindowThreadProcessId(hwin, pid); hProcess=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); Find Client Sau này s? vi?t thêm code vào ch? này Init some value Sau này s? vi?t thêm code kh?i t?o 1 s? giá tr? vào ch? này return 0; case WM_PAINT: hdc=BeginPaint(hwnd, ps); wsprintf(t, TEXT(Made by langman, puss)); TextOut(hdc, cxChar, cyChar18, t, wcslen(t)); EndPaint(hwnd, ps); return 0; case WM_COMMAND: switch(LOWORD(wParam)){ case BTN_FROZENTIME: Sau này s? vi?t thêm code dóng bang vào ch? này if (cFrozenTimeStatus==0){ WriteProcessMemory(hProcess, (int )pFrozenTime, arrFrozenTime, 6sizeof(char), NULL); SetWindowText(hwndBtnFrozenTime, TEXT(Dong bang thoi gian )); } else{ WriteProcessMemory(hProcess, (int )pFrozenTime, arrUnFrozenTime, 6sizeof(char), NULL); SetWindowText(hwndBtnFrozenTime, TEXT(Dong bang thoi gian)); } cFrozenTimeStatus=1cFrozenTimeStatus; break; case BTN_POINTEAT: Sau này s? vi?t thêm code an 100 di?m 1 l?n vào ch? này if (cPointEatStatus==0){ fPointEat=100; SetWindowText(hwndBtnPointEat, TEXT(100 diem1 lan an )); } else{ fPointEat=20; SetWindowText(hwndBtnPointEat, TEXT(100 diem1 lan an)); } cPointEatStatus=1cPointEatStatus; WriteProcessMemory(hProcess, (int )pPointEat, fPointEat, sizeof(float), NULL); break; case BTN_ULTIMATELIFE: Sau này s? vi?t thêm code vô h?n lu?t d?i vào ch? này if (cUltimateLifeStatus==0){ WriteProcessMemory(hProcess, (int )pLifeSub, vChange, sizeof(vChange), NULL); SetWindowText(hwndBtnUltimateLife, TEXT(Vo han luot doi )); } else{ WriteProcessMemory(hProcess, (int )pLifeSub, vFirst, sizeof(vFirst), NULL); SetWindowText(hwndBtnFrozenTime, TEXT(Vo han luot doi)); } cUltimateLifeStatus=1cUltimateLifeStatus; break; case BTN_WIN: Sau này s? vi?t thêm code an 1 con win luôn vào ch? này break; case BTN_SAME: Sau này s? vi?t thêm code an 2 con khác nhau vào ch? này break; case BTN_CHEAT: Sau này s? vi?t thêm c

Dẫn nhập Đối với game thủ game trainer ko từ lạ lẫm Vậy làm để viết game trainer ? Đây vấn đề mà ko bạn sinh viên quan tâm lại chưa tìm điểm bắt đầu, hơm langman với chút kinh nghiệm nhỏ xíu học từ cộng đồng c việt định chia sẻ với bạn tut nhằm dẫn nhập bạn đến với đường tà đạo : hack game hj hj hj hja Bài viết có nguồn từ langman - Cộng Đồng C Việt Các file nén có pass langman.congdongcviet Ngày xưa gọi game trainer, gamer toàn gọi nhầm với hack tool, nên langman gọi bừa hack, mong hacker đừng mà ghét langman Yêu cầu theo đuổi tut Đây tut đơn giản, với hình minh họa cụ thể, nên ko khó để bạn làm quen Nhưng yêu cầu bạn phải chịu khó mày mò, phải thích thật yêu cầu ko phần quan trọng : Nếu bạn thấy tut thật có ý nghĩa với bạn để lại vài câu reply có ý nghĩa Chap : Pikachu Đây game có từ lâu rồi, ko lạ lẫm với dân Việt Nam nữa, gái biết chơi, langman bạn viết trainer cho game Đầu tiên, bạn chưa có pikachu download : Pokemon Do có nhiều khác OS: 7,XP,Vista nên thống download file copy vào thư mục C:\windows\system32\ (Trong windows phải có file chạy pikachu, XP bạn copy đè lên file cũ nhé, ko đâu, làm theo tút này) : msvbvm5 OK, bắt đầu có nhìn sơ pikachu : Game cách chơi : bạn biết Chúng ta tiến hành nghiên cứu vấn + Mod game, sửa đổi thành phần game , lấy resource game, thay resource, + Viết trainer với option _ Tăng điểm người chơi (add 1000 to game point) _ Tăng thêm thời gian ( set time bar to max time) _ Đóng băng thời gian ( unlimited time infinite time) _ Vô hạn lượt đổi (unlimited continue) Chap : Mod Load Peid (chưa có load - full plugin chạy windows7) ta có kết sau : Vậy pack ASPack 2.11 (vậy để hand mod phải upack trước đã) Các bạn làm theo bước 1,2,3 ảnh để lấy OEP app : 00401628 Mình gà lắm, ko biết upack nên tạm dùng Qunpack (Chưa có download đây)này để unpack : chạy qunpack.exe với quyền admin (win7:chuột phải, vào dòng run as admin, XP:cứ bật lên được), mở file pokemon (click vào nút Open File trỏ đến file pokemon.exe), điền giá trị OEP vào click vào nut Full Unpack Muốn biết thêm OEP xem : Portable Executable File Format Vậy ta có file exe với dạng nguyên thể (tạm coi thế) game Ở đặt tên file Upokemon.exe Vậy đấy, sau unpack (và sau ăn suất cơm tiệm) thấy có khác nhiều rồi, thấy rõ ràng pikachu viết Microsoft Visual Basic , thấy link info 4.20 hóa Microsoft Visual Basic 5.0 Sau unpack ta hồn tồn dùng Reshack (Chưa có download đây) để lấy, thay đổi, tài nguyên icon, âm wave, âm midi file cách đơn giản Ơi trời VB à, nản tớ ko thích VB Nhưng bình tĩnh nào, lấy âm thanh, icon rồi, bitmap lại ko lấy Reshack, ???? Vậy ta đành phải Decompile xem nào, ồ, sau hồi tìm tìm, kiếm kiếm, trọc trọc ngốy ngốy, tơi tìm ảnh bitmap tool sau PHP Code: http://www.mediafire.com/?h97gb8q9rb3eka1 Hướng dẫn Decompile : run vbdecompile với quyền admin, mở file upokemon.exe ra, hỏi có unpack ko chọn no ta unpack rồi, click vào nút decompile, để lấy ảnh bitmap bạn vào menu vào (không nhớ rõ lắm, bạn tự mày mò 2' thấy mà hờ hờ hờ hờ hờ) Decompile ? trình biên dịch: Decompile trình dịch ngược từ file exe,.dll,.ocx lại thành mã nguồn, hờ hờ hờ Tơi nhận thấy điều lí thú : Upokemon.exe chơi bị out, dis, lỗi pokemon.exe Attached Thumbnails Chap 2: hack điểm Khi chơi game, ta thấy điểm lên hình, chắn lưu trữ nhớ có địa VA cụ thể Dân lập trình gọi chúng biến, có địa cụ thể, hj hj Để thay đổi điểm từ phía app mình, phải tìm địa VA biến điểm Để tìm địa biến ko khó với tool artmoney Bước Đầu tiên bật pikachu lên chơi lấy 20 điểm bật artmoney lên, chọn tiến trình, pikachu có tên D4S click vào Search lên hộp thoại Bước click vào để chọn kiểu liệu, hack nhiều lần nên biết kiểu float 4byte, chưa hack bao giờ, bạn để ALL để tìm với loại liệu Bước thu loạt địa chứa giá trị 20, vào game để chơi cho điểm trở thành 40 vào artmoney, click vào nút Filter gõ giá trị 40 ok Bước Vậy ta biết địa biến điểm 004B6088 Vậy ta làm demo để hack điểm : Vào Visual Studio 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 file cpp gõ code Để biết tên lớp tên cửa sổ tiến trình pikachu ta việc mở spy++ (tool đính kèm cài VS làm hình sau) demo chức sau : Demo1 : Set game point to 99999 PHP Code: #include int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLi ne,int nShowCmd) { HWND hwnd =FindWindow(L"ThunderRT6FormDC", L"³s³s¬Ý2"); // tìm cửa sổ pik achu 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 process HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION| PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,pid); // mở process để láy handl e int *address=(int*)0x4B6088; // đị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); // t hông báo kết } return EXIT_SUCCESS; } Demo : Tăng điểm 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 lpCmdLi ne,int nShowCmd) { Add1000ToPoint(); return EXIT_SUCCESS; } Bây bạn bật pikachu lên , vô game chơi chạy thử tool bạn vừa làm xong xem nào, hj hj hj hj Đặc biệt Code demo sau chạy ngon 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","Thon g 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 cong","Thong bao",MB_OK); } } int main() { Add1000ToPoint(); return 1; } Và giải thích PHP Code: HWND hwnd =FindWindow("ThunderRT6FormDC", "³s³s¬Ý2"); Câu lệnh giúp tìm mã số cửa sổ lưu vào biến hwnd Trong windows cửa số có mã số số nguyên 32 bit, PHP Code: if (!hwnd) { MessageBox(HWND_DESKTOP,"Ban phai bat pikachu len choi truoc da","Thon g bao",MB_OK); } khơng tìm thấy hiển thị lên hộp thông báo với nội dung bạn nhìn thấy PHP Code: else { DWORD pid; float temp=0; GetWindowThreadProcessId(hwnd,&pid); // lẫy mã tiến trình ch ạy HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION| PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ,FALSE,pid); // mở tiến t rình để đọc ghi liệu, dạng dạng mở file int *address=(int*)0x4B6088; // gán cho biến địa biến điể m mà ta tìm ReadProcessMemory(handle,address,&temp,sizeof(temp),0); // đọc giá trị 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ị temp vào ô nhớ biến điểm MessageBox(HWND_DESKTOP,"Da add cong","Thong bao",MB_OK); //thôn g báo ghi thành công } Chap : Vô hạn lượt đổi (unlimited continue) Cũng lần trước có vài thay đổi, tơi biết địa biến điểm 004B6088 khoanh vùng lại tìm kiếm cho nhanh (theo kinh nghiệm biến biến lại gần gần thơi, ko xa đâu) nên tơi tìm sau (lần tơi tìm integer 4byte nữa) hình sau Thật tuyệt vời, tìm lần ln, số nguyên 4byte có địa 004B60AA demo luôn, cách thức ko khác lần trước PHP Code: #include void SetContinueTo999() { 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; int temp=0; GetWindowThreadProcessId(hwnd,&pid); HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION| PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,pid); int *address=(int*)0x4B60AA; 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 lpCmdLi ne,int nShowCmd) { SetContinueTo999(); return EXIT_SUCCESS; } code chạy DEV-C : PHP Code: #include void SetContinueTo999() { HWND hwnd =FindWindow("ThunderRT6FormDC", "³s³s¬Ý2"); if (!hwnd) { MessageBox(HWND_DESKTOP,"Ban phai bat pikachu len choi truoc da","Thôn g báo",MB_OK); } else { DWORD pid; int temp=0; GetWindowThreadProcessId(hwnd,&pid); HANDLE handle=OpenProcess(PROCESS_QUERY_INFORMATION| PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,pid); int *address=(int*)0x4B60AA; WriteProcessMemory(handle,address,&temp,sizeof(temp),0); MessageBox(HWND_DESKTOP,"Ðã add thành công","Thông báo",MB_OK); } } int main() { SetContinueTo999(); return 1; } Chap : infinite time Đây chap tương đổi khó, để infinite time phải đảm bảo điều + Tìm điạ biến time + Tư tưởng đóng băng I Tìm địa biến time : Cách : Tơi dò chế độ Unknown value : Bước Nghỉ tầm 1s để time bar tụt tí tơi làm sau lặp lại bước tìm thấy thơi (Tốn nhiều time để bạn tìm thấy đấy) Cách : Cách công phu loằng ngoằng, nên theo kinh nghiệm, ko làm vậy, vào artmoney xem vùng nhớ gần biến điểm thấy có vùng nhẩy giá trị liên tằng tằng theo thời gian, tơi đốn biến time vơ artmoney thử đóng băng giá trị tơi thấy time bar nhúc nhíc quanh điểm ko tụt đi, số thực 4byte (float) có địa 004B6084 (Vậy đứng cạnh, đằng trước biến điểm) II Code đóng băng for (j=i+1; jhInstance; o o break; o o case WM_SIZE: o cxClient = LOWORD(lParam); o cyClient = HIWORD(lParam); o break; o o o case WM_COMMAND: o o switch ( LOWORD(wParam) ){ o o case IDC_POINT: o sButton.bPoint ^= 1; o o if ( sButton.bPoint ) o _beginthread(ThreadPoint,0,0); o o break; o o case IDC_SETPOINT: o vGame.point = GetDlgItemInt(hwnd,IDC_VALUEPOINT,NULL,FALSE); o _beginthread(ThreadPoint,0,0); o o break; o o case IDC_TIME: o sButton.bTime ^= 1;//( sButton.bTime) ? FALSE : TRUE; o vGame.time = 0; o o o if ( sButton.bTime ) _beginthread(ThreadTime,0,0); o o break; o o o case IDC_TURN: sButton.bTurn ^= 1; o o o if ( sButton.bTurn ) _beginthread(ThreadTurn,0,0); o o o break; case IDC_SETTURN: o vGame.turn = GetDlgItemInt(hwnd,IDC_TURNVALUE,NULL,FALSE); o _beginthread(ThreadTurn,0,0); o break; o o case IDC_AUTO: o o o sButton.bAuto = TRUE; o hButton = GetDlgItem(hwnd,IDC_AUTO); o o SetWindowLong(hButton,GWL_ID,IDC_CANCEL); o SetWindowText(hButton,TEXT("Cancel")); o o _beginthread(ThreadAuto,0,0); o break; o o case IDC_CANCEL: o o o sButton.bAuto = FALSE; o hButton = GetDlgItem(hwnd,IDC_CANCEL); o o SetWindowLong(hButton,GWL_ID,IDC_AUTO); o SetWindowText(hButton,TEXT("Auto Play")); o break; o o o case IDOK: o DestroyWindow(hwnd); o break; o o o o o o } // -End Switch - o o break; o o o o o o o case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc (hwnd, message, wParam, lParam) ; o } // - End Switch - o o return 0; o o } o o o /////////////////////////////////////////////////////////////////////// /// o void ReadMap() o { o o for ( int i = 0;i= && y1 < COLUMN ) o return TRUE; o o return FALSE; o } o o /////////////////////////////////////////////////////////////////////// /// o int CheckPath(int x1,int y1,int x2,int y2){ o o int i,j; o BOOL CanGo[4] , Check[ROW][COLUMN] ; o int cx[4] = {0,0,1,-1}; o int cy[4] = {1,-1,0,0}; o int first , last; o o int Path[ROW][COLUMN]; o Point Queue[198]; o int varX[4] , varY[4]; o o // o trung o if ( x1 == x2 && y1 == y2 ) return FALSE; o // o khac gia tri o if ( monster[x1][y1].iValue != monster[x2] [y2].iValue ) return FALSE; o o // o khong ton tai if ( !monster[x1][y1].iStatus || !monster[x2] [y2].iStatus ) return FALSE; o o first = last = 0; o o Queue[last].x o Queue[last++].y = x1; = y1; o o o for ( int i1 = ; i1

Ngày đăng: 06/09/2019, 23:19

TỪ KHÓA LIÊN QUAN

w