鱼C论坛

 找回密码
 立即注册
查看: 2418|回复: 11

关于内存搜索的疑问

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

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

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

x
#include <Windows.h>
#include <TlHelp32.h> //声明快照函数的头文件
#include <stdio.h>
BOOL FindFirst(DWORD dwValue); //在目标进程空间中进行第一次搜索
BOOL FindNext(DWORD dwValue); //在目标进程空间进行第二三四次搜索
DWORD g_arList[1024]; //地址列表
int g_nListCnt; //有效地址的个数
HANDLE g_hProcess; //目标进程句柄
BOOL CompareAPage(DWORD dwBaseAddr,DWORD dwValue) //比较目标进程内存中一页大小的内存
{
//读取一页内存
BYTE arBytes[4096];
if(!ReadProcessMemory(g_hProcess,(LPVOID)dwBaseAddr,arBytes,4096,NULL));
return FALSE;//此页不可读
//在这一页内存中查找
DWORD* pdw;
for (int i=0;i<(int)4*1024-3;i++)
{
pdw=(DWORD*)&arBytes[i];
if (pdw[0]==dwValue)//等于要查找的值?
{
if(g_nListCnt>=1024)
return false;
g_arList[g_nListCnt++]=dwBaseAddr+i;//添加到全局变量中
}
}
return true;
}
BOOL FindFirst(DWORD dwValue)
{
const DWORD dwOneGB=1024*1024*1024;//1GB
const DWORD dwOnePage=4*1024;//4KB
if(g_hProcess==NULL)
return false;
//查看操作系统类型,以决定开始地址
DWORD dwBase;
OSVERSIONINFO vi={sizeof(vi)};
GetVersionEx(&vi);
if (vi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
{
dwBase=4*1024*1024;//windows98系列,4MB
}
else
dwBase=640*1024;//windows NT系列,64KB
//在开始地址到2GB的地址空间进行查找
for (;dwBase<2*dwOneGB;dwBase+=dwOnePage)
{
//比较一页大小的内存
CompareAPage(dwBase,dwValue);
}
return TRUE;
}
void ShowList()
{
for (int i=0;i<g_nListCnt;i++)
{
printf("%081x\n",g_arList[i]);
}
}
BOOL FindNext(DWORD dwValue)
{
//保存m_arList数组中有效地址的个数,初始化新的m_nListCnt值
int nOrgCnt=g_nListCnt;
g_nListCnt=0;
//在m_arList数组记录的地址处查找
BOOL bRet=FALSE;//假设失败
DWORD dwReadValue;
for (int i=0;i<nOrgCnt;i++)
{
if (ReadProcessMemory(g_hProcess,(LPVOID)g_arList[i],&dwReadValue,sizeof(DWORD),NULL))
{
if (dwReadValue==dwValue)
{
g_arList[g_nListCnt++]=g_arList[i];
bRet=TRUE;
}
}
}
return bRet;
}
BOOL WriteMemory(DWORD dwAddr,DWORD dwValue)
{
return WriteProcessMemory(g_hProcess,(LPVOID)dwAddr,&dwValue,sizeof(DWORD),NULL);
}
int main(int argc,char* argv[])
{
char szFileName[]="";//这里是修改内存的程序的名字
STARTUPINFO si={sizeof(si)};
PROCESS_INFORMATION pi;
::CreateProcess(NULL,szFileName,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
//关闭线程句柄,既然我们不需要它
::CloseHandle(pi.hThread);
g_hProcess=pi.hProcess;
int iVal;//输入要修改的值
printf("Input val=");
scanf("%d",&iVal);
FindFirst(iVal);//进行第一次查找
ShowList();//打印出搜索的结果
while (g_nListCnt>1)
{
printf("Input val=");
scanf("%d",&iVal);//进行下次搜索
FindNext(iVal);
ShowList();//显示搜索结果
}
printf("New value=");//取得新值
scanf("%d",&iVal);
if(WriteMemory(g_arList[0],iVal))//写入新值
printf("Write data sucess\n");
CloseHandle(g_hProcess);
return 0;
}
首先printf("%081x\n",g_arList[i]);%081X不是输出81位吗,地址应该是8位输出吧,我感觉应该是%08x\n
还有谁能讲一下关于系统平台和dwBase的值的选择的关系呢
@小甲鱼
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-12 16:18:35 | 显示全部楼层
顶起来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-12 16:42:38 | 显示全部楼层
单机吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-12 16:43:16 | 显示全部楼层
@ 小甲鱼
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-12 16:45:31 | 显示全部楼层
@小甲鱼
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-12 19:26:02 | 显示全部楼层
听说这样可以改格式,哥们你这样的程序没人愿意看的
  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. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-12 19:29:40 | 显示全部楼层
好吧没有用  
你要把格式写好


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-12 21:50:11 | 显示全部楼层
代码写得太挫了。起码得有空格对齐 。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-13 00:02:03 | 显示全部楼层
vcvycy 发表于 2016-8-12 21:50
代码写得太挫了。起码得有空格对齐 。

我已经知道了结果了,下面贴上我的代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-13 00:03:47 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <TlHelp32.h>//快照函数的头文件
  4. #include <vector>
  5. using namespace std;
  6. struct addrinfo
  7. {
  8. LPVOID addr;//存放地址
  9. bool falg;//一个标记,如果为true,则需进行删除
  10. };
  11. vector<PROCESSENTRY32> SysProcess;//存储系统进程的变量
  12. vector<struct addrinfo> addrlist;//地址列表
  13. vector<struct addrinfo> templist;//临时地址列表
  14. int cnt=0;//进程数量
  15. int g_nlist=0;//存放有效地址数量
  16. HANDLE g_hProcess;//全局进程句柄
  17. void PrintProcess();//列举所有的系统进程
  18. void SelectExc();//选择一个进程进行内存修改
  19. bool FindFirst(DWORD value);//第一次进行搜索
  20. bool CompareAPage(DWORD dwBase,DWORD ivalue);//前一个参数代表搜索基址,后一个参数代表要搜索的值
  21. bool FindNext(DWORD value);//第二,三,四,五次进行搜索
  22. void ShowList();//显示地址列表
  23. DWORD GetProcessidFromName(LPCTSTR proname);//从名字得到进程ID 成功返回非0,失败返回0
  24. void main()
  25. {
  26. DWORD ival;
  27. PrintProcess();
  28. SelectExc();
  29. printf("Input val=");
  30. scanf("%d",&ival);//进行初值的输入
  31. FindFirst(ival);
  32. ShowList();
  33.         while(g_nlist>1)
  34.         {
  35.         printf("new Input val=");
  36.         scanf("%d",&ival);//进行初值的输入
  37.         FindNext(ival);
  38.         ShowList();
  39.         }
  40.         if(g_nlist==1)
  41.                 {
  42.                 printf("now we can correct the value,new value=");
  43.                 scanf("%d",&ival);//进行初值的输入
  44.                 vector<struct addrinfo>::iterator it=addrlist.begin();
  45.                 DWORD written;
  46.                 WriteProcessMemory(g_hProcess,(DWORD*)(it->addr),&ival,sizeof(DWORD),&written);
  47.                 }
  48.         else
  49.                 {
  50.                 printf("sorry,we can't find the address");
  51.                 }
  52. CloseHandle(g_hProcess);
  53. }

  54. void PrintProcess()
  55. {
  56. HANDLE handle;
  57. PROCESSENTRY32 pi;
  58. handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  59.         if(handle==INVALID_HANDLE_VALUE)
  60.         {
  61.         printf("调用列举函数失败\n");
  62.         return;
  63.         }
  64. pi.dwSize=sizeof(pi);
  65.         if(Process32First(handle,&pi))
  66.         {
  67.         SysProcess.push_back(pi);//打印进程名称,进程ID,线程数量,父进程ID
  68.         printf("%d\t %s\t %d\t %d\t %d\t\n",cnt++,pi.szExeFile,pi.th32ProcessID,pi.cntThreads,pi.th32ParentProcessID);
  69.         }
  70.         while(Process32Next(handle,&pi))
  71.         {
  72.         SysProcess.push_back(pi);//打印进程名称,进程ID,线程数量,父进程ID
  73.         printf("%d\t %s\t %d\t %d\t %d\t\n",cnt++,pi.szExeFile,pi.th32ProcessID,pi.cntThreads,pi.th32ParentProcessID);
  74.         }
  75. CloseHandle(handle);
  76. }

  77. void SelectExc()
  78. {
  79. int index;
  80. //int err;
  81. DWORD id;
  82. //STARTUPINFO si={sizeof(si)};
  83. //PROCESS_INFORMATION pi;
  84. printf("please select a process:");
  85. scanf("%d",&index);
  86. id=GetProcessidFromName(SysProcess[index].szExeFile);
  87.         if(id==0)
  88.         {
  89.         printf("this process not exist!");
  90.         return;
  91.         }
  92. HANDLE phand=OpenProcess(PROCESS_ALL_ACCESS,false,id);
  93. //err=CreateProcess(NULL,SysProcess[index].szExeFile,NULL,NULL,false
  94.         /*                                                ,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
  95.         if(err==0)
  96.         {
  97.         printf("创建进程出错!\n");
  98.         return;
  99.         }
  100.         */
  101. //CloseHandle(pi.hThread);
  102. g_hProcess=phand;
  103. }

  104. bool FindFirst(DWORD value)
  105. {
  106. const DWORD dwOneGB=1024*1024*1024;
  107. const DWORD dwOnePage=4*1024;
  108. if(g_hProcess==NULL)
  109.         return false;
  110. DWORD dwBase;//搜索基地址
  111. OSVERSIONINFO osi;
  112. GetVersionEx(&osi);
  113.         if(osi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
  114.         {
  115.         dwBase=4*1024*1024;//4M
  116.         }
  117.         else
  118.         {
  119.         dwBase=640*1024;//64KB
  120.         }
  121.         for(;dwBase<2*dwOneGB;dwBase+=dwOnePage)
  122.         {
  123.         CompareAPage(dwBase,value);
  124.         }
  125. return true;
  126. }

  127. bool CompareAPage(DWORD dwBase,DWORD ivalue)//前一个参数代表搜索基址,后一个参数代表要搜索的值
  128. {
  129. DWORD bytesread;
  130. DWORD pdw;
  131. BYTE buffer[4096];
  132. struct addrinfo temp;//临时存放地址和标记的变量
  133. bool success=ReadProcessMemory(g_hProcess,(void*)dwBase,buffer,4096,&bytesread);
  134.         if(!success)
  135.         {
  136.         return false;
  137.         }
  138.         //for(;(void*)dwBase<(void*)(dwBase+4096-3);dwBase++)
  139.         for(int i=0;i<(4096-3);i++)
  140.         {
  141.                 pdw=*(DWORD*)&buffer[i];
  142.                 if(pdw==ivalue)
  143.                 {
  144.                         if(g_nlist>=1024*1024*1024)
  145.                         return false;
  146.                 temp.addr=(void*)(dwBase+i);
  147.                 temp.falg=true;
  148.                 g_nlist++;
  149.                 addrlist.push_back(temp);
  150.                 }
  151.         }
  152. return true;
  153. }

  154. bool FindNext(DWORD value)
  155. {
  156. DWORD bytesread;
  157. DWORD newvalue;
  158. vector<struct addrinfo>::iterator it;
  159. if(g_hProcess==NULL)
  160.         return false;
  161.         for(it=addrlist.begin();it!=addrlist.end();it++)
  162.         {
  163.                 if(ReadProcessMemory(g_hProcess,it->addr,&newvalue,sizeof(DWORD),&bytesread))
  164.                 {
  165.                         if(newvalue!=value)
  166.                         {
  167.                         it->falg=false;
  168.                         g_nlist--;
  169.                         }
  170.                         else
  171.                         {
  172.                         templist.push_back(*it);
  173.                         }
  174.                 }
  175.         }
  176.         addrlist.erase(addrlist.begin(),addrlist.end());
  177.         printf("%d\n",addrlist.size());
  178.         for(it=templist.begin();it!=templist.end();it++)
  179.         {
  180.         addrlist.push_back(*it);
  181.         }
  182.         templist.erase(templist.begin(),templist.end());
  183. return true;
  184. }

  185. void ShowList()
  186. {
  187.         vector<struct addrinfo>::const_iterator it;
  188.         for(it=addrlist.begin();it!=addrlist.end();it++)
  189.         {
  190.         printf("%08X\n",it->addr);
  191.         }
  192.         printf("%d\n",g_nlist);
  193. }

  194. DWORD GetProcessidFromName(LPCTSTR proname)//成功返回非0,失败返回0
  195. {
  196. DWORD id=0;
  197. bool flag=false;
  198. HANDLE handle;
  199. PROCESSENTRY32 pi;
  200. handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  201.         if(handle==INVALID_HANDLE_VALUE)
  202.         {
  203.         printf("调用列举函数失败\n");
  204.         return id;
  205.         }
  206. pi.dwSize=sizeof(pi);
  207.         if(!Process32First(handle,&pi))
  208.                 return id;
  209.         while(Process32Next(handle,&pi))
  210.         {
  211.                 if(!strcmp(pi.szExeFile,proname))
  212.                 {
  213.                 id=pi.th32ProcessID;
  214.                 break;
  215.                 }
  216.         }
  217. CloseHandle(handle);
  218. return id;
  219. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-13 00:07:37 | 显示全部楼层
其实一楼的代码是我在鱼c论坛上看到的,并不是我写的,只不过,我认为其中有些东西有些错误,又没有人说它是错的,我产生了疑惑,所以才问问大家,不过,我已经有结果了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-13 09:07:51 | 显示全部楼层
支持
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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