飞道的博客

C语言水果忍者修改器(入门版)

328人阅读  评论(0)

2020年11月4日,大学开学一个月了吧

这所大学 学的c语言(说实话已经好几年没用了忘得差不多了,这几天都在重现学起)

总代码在最下边

 

 

准备详细介绍下昨天(c++)做的水果忍者修改器(新手完全听得懂)

一.首先用CE进行简单的  准确搜索  对应的能直接搜到水果的基址

毕竟是讲C的  多余的CE就不说了


 

 

二.既然找到准确地址,那就直接上C语言

用C++写修改器主要方式是去读内存和写内存(这和修改大型游戏差不多的),C语言读写内存需要用到下边这两个函数


  
  1. ReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead);
  2. WriteProcessMemory(HANDLE hProcess,LPVOID lpBaseAddress,LPVOID lpBuffer,DWORD nSize,LPDWORD lpNumberOfBytesWritten);

而这两个函数都需要传入一个共同的参数 HANDLE 类型的一个数据(你可以把他当做一个许可证,只有这个许可证才能进行读写函数)

而要获取这个游戏(水果忍者)许可证 需要计算机找到 这个游戏的PID,而PID可以通过句柄来获得,因此我们的思路

句柄-->PID-->许可-->然后修改游戏

 

1.获取句柄

在C语言中获取句柄的函数为

FindWindow( LPCSTR lpClassName, LPCSTR lpWindowName );

具体写法为


  
  1. HWND hWnd;
  2. hWnd= FindWindow(NULL,“这里填游戏名”);

定义一个HWND类型的 hWnd来接收句柄

"这里填游戏名" 在c++填为 "Fruit Ninja"(水果忍者的进程名),然后获取的句柄就被存储到hWnd变量中了

 

 

2.获取进程PID

获取PID的函数为

GetWindowThreadProcessId();

在这里具体写成


  
  1. DWORD PID;
  2. GetWindowThreadProcessId(hWnd,&PID);

定义一个DWORD类型的变量存放PID,GetWindowThreadProcessId()的第一个参数将第一步获取的句柄传入,然后返回本进程的PID,咱们在参数二处<&PID>接收。

 

 

3.获取许可

获取许可的写法为


  
  1. HANDLE lsProcess= 0;
  2. lsProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);

PROCESS_ALL_ACCESS的意思是获取全部许可,参数二填上一步获取到的PID

同样lsProcess存放许可


 

 

三.修改游戏

修改游戏对应的就是这两个函数


  
  1. ReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead);
  2. WriteProcessMemory(HANDLE hProcess,LPVOID lpBaseAddress,LPVOID lpBuffer,DWORD nSize,LPDWORD lpNumberOfBytesWritten);

  
  1. #include <iostream>
  2. #include <windows.h>//需要引用这个头文件
  3. DWORD s; //这个用来存放读取当前的分数
  4. DWORD dizhi= 0x0BF308C; //这个写游戏对应的分数地址
  5. //FruitNinja.exe+1B308C
  6. do{
  7. ReadProcessMemory(lsProcess, (LPVOID)dizhi, &s, 4, NULL);
  8. //参数一 填许可 参数二填地址 参数三存放的位置
  9. printf( "当前水果数量:");
  10. cout<<s<< endl;
  11. Sleep( 300); //程序延迟300ms
  12. system( "cls"); //清空控制台
  13. } while(TRUE);

我想一直让他达到一个动态的读取效果,所以做了个死循环一直来读取分数然后打印到控制台

认真查看上方函数的注释,相信你能看得懂

 

运行效果为下图

 

 


上边展示的为读取分数,当然我们要做的是修改分数,直接上代码


  
  1. DWORD ss= 999; //这里填你要改的分数
  2. WriteProcessMemory(lsProcess,(LPVOID)dizhi,&ss, 4, NULL);
  3. //参数一填许可 参数二填地址 参数三填要修改的值

 

因为上了大学嘛,时间变得很充裕,后续会更新更多

望新手多多关注,互相学习

如果有关上边切水果的案例有疑问直接在本平台私信我即可


  
  1. #include <iostream>
  2. #include <windows.h>
  3. using namespace std;
  4. HWND hq_HWND(char ming[]){ //获取句柄 传入进程名(不加exe)传出HWND (失败返回0)
  5. //cout<<ming<<endl;
  6. HWND hWnd=FindWindow( NULL,ming);
  7. return hWnd;
  8. }
  9. DWORD hq_PID(HWND hWnd){ //传入句柄 传出pid(失败传出0)
  10. DWORD PID;
  11. GetWindowThreadProcessId(hWnd,&PID);
  12. return PID;
  13. }
  14. HANDLE hq_Process(DWORD PID){ //获取一个许可 返回许可 传入 PID
  15. HANDLE lsProcess= 0;
  16. lsProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
  17. return lsProcess;
  18. }
  19. int main(int argc, char** argv) {
  20. //cout<<hq_HWND("Tutorial-i386")<<endl; //用于获取句柄
  21. //cout<<hq_PID(hq_HWND("Tutorial-i386"))<<endl;//用于获取PID
  22. HANDLE lsProcess;
  23. lsProcess=hq_Process(hq_PID(hq_HWND( "Fruit Ninja")));
  24. DWORD ss= 999;
  25. DWORD dizhi= 0x0BF308C;
  26. //FruitNinja.exe+1B308C
  27. DWORD s;
  28. do{
  29. ReadProcessMemory(lsProcess, (LPVOID)dizhi, &s, 4, NULL);
  30. printf( "当前水果数量:");
  31. cout<<s<< endl;
  32. Sleep( 300);
  33. system( "cls");
  34. } while(TRUE);
  35. //WriteProcessMemory(lsProcess,(LPVOID)dizhi,&ss,4,NULL);
  36. return 0;
  37. }

 

 

 


转载:https://blog.csdn.net/O8088/article/details/109499360
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场