鱼C论坛

 找回密码
 立即注册
查看: 6607|回复: 13

[技术交流] 游戏内存修改器

[复制链接]
发表于 2011-11-16 15:12:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <Windows.h>
  2. #include <TlHelp32.h> //声明快照函数的头文件
  3. #include <stdio.h>
  4. BOOL FindFirst(DWORD dwValue); //在目标进程空间中进行第一次搜索
  5. BOOL FindNext(DWORD dwValue); //在目标进程空间进行第二三四次搜索
  6. DWORD g_arList[1024]; //地址列表
  7. int g_nListCnt; //有效地址的个数
  8. HANDLE g_hProcess; //目标进程句柄
  9. BOOL CompareAPage(DWORD dwBaseAddr,DWORD dwValue) //比较目标进程内存中一页大小的内存
  10. {
  11. //读取一页内存
  12. BYTE arBytes[4096];
  13. if(!ReadProcessMemory(g_hProcess,(LPVOID)dwBaseAddr,arBytes,4096,NULL));
  14. return FALSE;//此页不可读
  15. //在这一页内存中查找
  16. DWORD* pdw;
  17. for (int i=0;i<(int)4*1024-3;i++)
  18. {
  19. pdw=(DWORD*)&arBytes[i];
  20. if (pdw[0]==dwValue)//等于要查找的值?
  21. {
  22. if(g_nListCnt>=1024)
  23. return false;
  24. g_arList[g_nListCnt++]=dwBaseAddr+i;//添加到全局变量中
  25. }
  26. }
  27. return true;
  28. }
  29. BOOL FindFirst(DWORD dwValue)
  30. {
  31. const DWORD dwOneGB=1024*1024*1024;//1GB
  32. const DWORD dwOnePage=4*1024;//4KB
  33. if(g_hProcess==NULL)
  34. return false;
  35. //查看操作系统类型,以决定开始地址
  36. DWORD dwBase;
  37. OSVERSIONINFO vi={sizeof(vi)};
  38. GetVersionEx(&vi);
  39. if (vi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
  40. {
  41. dwBase=4*1024*1024;//windows98系列,4MB
  42. }
  43. else
  44. dwBase=640*1024;//windows NT系列,64KB
  45. //在开始地址到2GB的地址空间进行查找
  46. for (;dwBase<2*dwOneGB;dwBase+=dwOnePage)
  47. {
  48. //比较一页大小的内存
  49. CompareAPage(dwBase,dwValue);
  50. }
  51. return TRUE;
  52. }
  53. void ShowList()
  54. {
  55. for (int i=0;i<g_nListCnt;i++)
  56. {
  57. printf("%081x\n",g_arList[i]);
  58. }
  59. }
  60. BOOL FindNext(DWORD dwValue)
  61. {
  62. //保存m_arList数组中有效地址的个数,初始化新的m_nListCnt值
  63. int nOrgCnt=g_nListCnt;
  64. g_nListCnt=0;
  65. //在m_arList数组记录的地址处查找
  66. BOOL bRet=FALSE;//假设失败
  67. DWORD dwReadValue;
  68. for (int i=0;i<nOrgCnt;i++)
  69. {
  70. if (ReadProcessMemory(g_hProcess,(LPVOID)g_arList[i],&dwReadValue,sizeof(DWORD),NULL))
  71. {
  72. if (dwReadValue==dwValue)
  73. {
  74. g_arList[g_nListCnt++]=g_arList[i];
  75. bRet=TRUE;
  76. }
  77. }
  78. }
  79. return bRet;
  80. }
  81. BOOL WriteMemory(DWORD dwAddr,DWORD dwValue)
  82. {
  83. return WriteProcessMemory(g_hProcess,(LPVOID)dwAddr,&dwValue,sizeof(DWORD),NULL);
  84. }
  85. int main(int argc,char* argv[])
  86. {
  87. char szFileName[]="";//这里是修改内存的程序的名字
  88. STARTUPINFO si={sizeof(si)};
  89. PROCESS_INFORMATION pi;
  90. ::CreateProcess(NULL,szFileName,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
  91. //关闭线程句柄,既然我们不需要它
  92. ::CloseHandle(pi.hThread);
  93. g_hProcess=pi.hProcess;
  94. int iVal;//输入要修改的值
  95. printf("Input val=");
  96. scanf("%d",&iVal);
  97. FindFirst(iVal);//进行第一次查找
  98. ShowList();//打印出搜索的结果
  99. while (g_nListCnt>1)
  100. {
  101. printf("Input val=");
  102. scanf("%d",&iVal);//进行下次搜索
  103. FindNext(iVal);
  104. ShowList();//显示搜索结果
  105. }
  106. printf("New value=");//取得新值
  107. scanf("%d",&iVal);
  108. if(WriteMemory(g_arList[0],iVal))//写入新值
  109. printf("Write data sucess\n");
  110. CloseHandle(g_hProcess);
  111. return 0;
  112. }
复制代码

主要代码已注释,在VC++6.0下编译通过,在Visual studio2005下编译有错,主要是Unicode和Ascii的关系转换问题。

评分

参与人数 1荣誉 +6 鱼币 +5 收起 理由
小甲鱼 + 6 + 5 GOOD, 刚想发。。。

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-11-16 16:20:17 | 显示全部楼层
在Visual studio2005下编译有错

可以关闭Unicode的选项
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-11-16 16:49:15 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-11-18 09:03:06 | 显示全部楼层
这个很不错啊~
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-11-18 10:11:18 | 显示全部楼层
CreateProcess(NULL,szFileName,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);  CreatProcess()里竟然有这么多参数啊
小甲鱼最新课程 -> https://ilovefishc.com
头像被屏蔽
发表于 2011-11-20 15:12:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-11-21 15:17:40 | 显示全部楼层
:$ 好啊 我留下了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-11-22 16:49:06 | 显示全部楼层
我发现这个win 32编程, 编程的字母 有的是全是大小,而有的是首个字母大小,看起来不舒服。 而不像C++编程字母基本是小写的,除了宏定义是大写。这样看起来很舒服的。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-11-22 17:11:50 | 显示全部楼层
seuer126 发表于 2011-11-22 16:49
我发现这个win 32编程, 编程的字母 有的是全是大小,而有的是首个字母大小,看起来不舒服。 而不像C++编程 ...

哪个大写,哪个小写其实是很有讲究的,你接触多了就会习惯了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-11-23 09:01:19 | 显示全部楼层
憔悴心只为你 发表于 2011-11-22 17:11
哪个大写,哪个小写其实是很有讲究的,你接触多了就会习惯了

恩,小弟明白了!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-12-18 11:39:28 | 显示全部楼层
赞一个。。好东西
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-18 12:06:01 | 显示全部楼层
不错啊,好东西。、。。。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-12 14:28:21 | 显示全部楼层
不地道,竟然还让改错,%081X是什么鬼
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-12 14:52:22 | 显示全部楼层
支持大神
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-13 20:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表