怎样读取一个进程的内存数据。
两个关键函数 ReadProcessMemory和VirtualQueryEx 理解得不透彻,所以可能有点小问题,但大体流程应该是这样,希望对你有帮助。另外,好多地方没有作错误检查,不保证在你的环境下一定能用。
请各路大神指正。
*/
#include<iostream>
#include <fstream>
#include<windows.h>
#include<tlhelp32.h>
using namespace std;
int main()
{
char app[1024];
cout<<"请输入映像名(含.exe)\n如: ctfmon.exe\n:";
cin>>app;
fstream fp("dump.txt",ios::binary|ios::out);
BOOL flag=0;
HANDLE htoken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&htoken);
LookupPrivilegeValue(NULL, SE_DEBUG_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(htoken,0,&tkp,NULL,NULL,0);
CloseHandle(htoken);
PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(pe32);
HANDLE hprosnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hprosnap==INVALID_HANDLE_VALUE)
{
cout<<"Snapshot failed!"<<endl;
}
if(Process32First(hprosnap,&pe32))
{
do
{
if(!strcasecmp(app,pe32.szExeFile))
{
cout<<"Program is dumping..."<<endl;
flag=true;
break;
}
}
while(::Process32Next(hprosnap,&pe32));
}
CloseHandle(hprosnap);
if(!flag)
{
cout<<"Process not found!\n";
system("pause");
return 1;
}
SYSTEM_INFO si;
GetSystemInfo(&si);
HANDLE htarget=OpenProcess(PROCESS_ALL_ACCESS,0,pe32.th32ProcessID);
if(htarget==NULL)
{
cout<<"Open Process Error!\n";
return 2;
}
MEMORY_BASIC_INFORMATION mbi;
char *onepagebuf=new char [si.dwPageSize];
for(DWORD start=(DWORD)si.lpMinimumApplicationAddress; start<(DWORD)si.lpMaximumApplicationAddress-si.dwPageSize; start+=si.dwPageSize)
{
if(!VirtualQueryEx(htarget,(void *)start,&mbi,sizeof(mbi))==sizeof(mbi))
break;
if(mbi.State==MEM_COMMIT)
{
ReadProcessMemory(htarget,(void *)start,onepagebuf,si.dwPageSize,NULL);
fp.write(onepagebuf,si.dwPageSize);
}
}
cout<<"done\n";
CloseHandle(htarget);
fp.close();
delete []onepagebuf;
system("pause");
return 0;
}
很实用的程序 期待您的评价!
相关推荐
匿名管道的实现 管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。
管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。 在调用CreatePipe()函数时,如果管道服务器将lpPipeAttributes 指向的SECURITY_ATTRIBUTES数据结构的数据成员bInheritHandle设置为TRUE,那么CreatePipe()创建的管道读、写句柄将会被继承。管道服务器可调用DuplicateHandle()函数改变管道句柄的继承。管道服务器可以为一个可继承的管道句柄创建一个不可继承的副本或是为一个不可继承的管道句柄创建一个可继承的副本。CreateProcess()函数还可以使管道服务器有能力决定子进程对其可继承句柄是全部继承还是不继承。
MFC实现进程间通信,并创建一个共享内存,从内存中读取数据
MFC实现进程间通信,并创建一个共享内存,从内存中读取数据
Qt实现进程间通信,并创建一个共享内存,从内存中读取数据
Qt实现进程间通信,并创建一个共享内存,从内存中读取数据
这是一个专门针对Windows操作系统上微信客户端设计的开源工具项目_它通过读取和分析微信进程在内存中的特定数据结构_利用预配置的版本偏移量来定位并提取出加密的聊天记录数据库Cha.zip
这是一个专门针对Windows操作系统上微信客户端设计的开源工具项目_它通过读取和分析微信进程在内存中的特定数据结构_利用预配置的版本偏移量来定位并提取出加密的聊天记录数据库Cha.zip
跨进程读取内存源码.rar
跨进程读取内存源码.rar 跨进程读取内存源码.rar 跨进程读取内存源码.rar 跨进程读取内存源码.rar


