如何枚举进程以及如何枚举进程所包含的模块
2009-03-09 16:51
411 查看
最近需要做毕设,对我而言,也是一个不小的挑战,这半年就没写过一个程序。。。。。废话少说,言归正传,我这次的毕设和系统有比较大的关系,程序的其中一个模块就是扫描内存。大体思路如下:先得到进程列表,然后枚举每个进程所调用的模块,并得到每个模块的基地址,然后,读取内存中进程的数据,并扫描。说是简单,就光得到模块的基地址就令我想了2天,最后还是解决了,哈哈哈哈。。1)关于进程的结构体PROCESSENTRY32 {
DWORD dwSize; //结构的大小,以字节为单位 DWORD cntUsage; //无用,通常为0 DWORD th32ProcessID; //进程ID号 ULONG_PTR th32DefaultHeapID; //无用,通常为0 DWORD th32ModuleID; //无用,通常为0 DWORD cntThreads; //拥有的线程数 DWORD th32ParentProcessID; //父进程ID LONG pcPriClassBase; //。。。。。。 DWORD dwFlags; //无用,通常为0 TCHAR szExeFile[MAX_PATH]; //可执行文件的名称 } PROCESSENTRY32, * PROCESSENTRY32 ; 2)关于模块的结构体 MODULEENTRY32 ( DWORD dwSize; // 结构的大小,以字节为单位 DWORD th32ModuleID; // 不再使用,设为1 DWORD th32ProcessID; // 所属进程的ID DWORD GlblcntUsage; // 计数器,通常为0xFFFF DWORD ProccntUsage; // 计数器,通常为0xFFFF BYTE * modBaseAddr; // 该模块的基地址 DWORD modBaseSize; // 模块的大小 HMODULE hModule; // 。。。。。。。 TCHAR szModule[MAX_MODULE_NAME32 + 1]; // 模块名称 TCHAR szExePath[MAX_PATH]; // 模块路径 } MODULEENTRY32, * MODULEENTRY32;3)到这就开始枚举进程了HANDLE hProcessSnap;HANDLE hProcess;PROCESSENTRY32 pe32;DWORD dwPriorityClass;// Take a snapshot of all processes in the system.hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );if( hProcessSnap == INVALID_HANDLE_VALUE ){printError( "CreateToolhelp32Snapshot (of processes)" );return( FALSE );}// Set the size of the structure before using it.pe32.dwSize = sizeof( PROCESSENTRY32 );// Retrieve information about the first process,// and exit if unsuccessfulif( !Process32First( hProcessSnap, &pe32 ) ){printError( "Process32First" ); // Show cause of failureCloseHandle( hProcessSnap ); // Must clean up the snapshot object!return( FALSE );}// Now walk the snapshot of processes, and// display information about each process in turndo{printf( "/n/n=====================================================" );printf( "/nPROCESS NAME: %s", pe32.szExeFile );printf( "/n-----------------------------------------------------" );// Retrieve the priority class.dwPriorityClass = 0;hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );if( hProcess == NULL )printError( "OpenProcess" );else{dwPriorityClass = GetPriorityClass( hProcess );if( !dwPriorityClass )printError( "GetPriorityClass" );CloseHandle( hProcess );}printf( "/n process ID = 0x%08X", pe32.th32ProcessID );printf( "/n thread count = %d", pe32.cntThreads );printf( "/n parent process ID = 0x%08X", pe32.th32ParentProcessID );printf( "/n Priority Base = %d", pe32.pcPriClassBase );if( dwPriorityClass )printf( "/n Priority Class = %d", dwPriorityClass );} while( Process32Next( hProcessSnap, &pe32 ) );CloseHandle( hProcessSnap );4)枚举模块了,但是我用的是Module32First,Module32NextHANDLE hModuleSnap = INVALID_HANDLE_VALUE;MODULEENTRY32 me32;// Take a snapshot of all modules in the specified process.hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID );if( hModuleSnap == INVALID_HANDLE_VALUE ){printError( "CreateToolhelp32Snapshot (of modules)" );return( FALSE );}// Set the size of the structure before using it.me32.dwSize = sizeof( MODULEENTRY32 );// Retrieve information about the first module,// and exit if unsuccessfulif( !Module32First( hModuleSnap, &me32 ) ){printError( "Module32First" ); // Show cause of failureCloseHandle( hModuleSnap ); // Must clean up the snapshot object!return( FALSE );}// Now walk the module list of the process,// and display information about each moduledo{printf( "/n/n MODULE NAME: %s", me32.szModule );printf( "/n executable = %s", me32.szExePath );printf( "/n process ID = 0x%08X", me32.th32ProcessID );printf( "/n ref count (g) = 0x%04X", me32.GlblcntUsage );printf( "/n ref count (p) = 0x%04X", me32.ProccntUsage );printf( "/n base address = 0x%08X", (DWORD) me32.modBaseAddr ); //我要的就是这个printf( "/n base size = %d", me32.modBaseSize );} while( Module32Next( hModuleSnap, &me32 ) );CloseHandle( hModuleSnap );5)开始读取内存吧HANDLE hProcess;char buf[1024];DWORD dwNumberOfBytesRead;hProcess=(OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION |PROCESS_VM_READ, false, pid));//pid为目标进程的idif(hProcess !=NULL){if(ReadProcessMemory(hProcess,(void*)me32.modBaseAddr,&buf,1024,&dwNumberOfBytesRead)){//特征码匹配吧}}
相关文章推荐
- 如何枚举出所有进程和线程以及进程信息
- iOS并发编程笔记,包含GCD,Operation Queues,Run Loops,如何在后台绘制UI,后台I/O处理,最佳安全实践避免互斥锁死锁优先级反转等,以及如何使用GCD监视进程文件文件夹,并发测试的方案等
- Delphi 枚举系统进程以及模块文件名
- (转)iOS并发编程笔记,包含GCD,Operation Queues,Run Loops,如何在后台绘制UI,后台I/O处理,最佳安全实践避免互斥锁死锁优先级反转等,以及如何使用GCD监视进程文件文件夹,并发测试的方案等
- 枚举当前系统进程以及进程加载模块
- 基于visual c++之windows核心编程代码分析(19)枚举进程以及进程加载模块信息
- 枚举PEB获取进程模块列表
- 如何结束插入系统、应用程序进程进程中的病毒模块的问题
- 如何查看Oracle Apps的版本信息以及模块信息
- Spring学习之使用标签来标记资源(@Component、@Repository、 @Service和@Controller)以及使用方式(包含如何在jsp中使用)
- 关闭系统进程,以及如何调用CMD并执行命令
- 如何枚举系统当前进程
- 通过TEB/PEB枚举当前进程空间中用户模块列表
- 如何用Java调用R(包含在服务器安装的过程)以及用R生成的图片如何用<img>标签访问
- 关于gcc、glibc和binutils模块之间的关系,以及在现有系统上如何升级的总结
- 关于TSVNCache.exe进程的作用以及如何停止
- 关于gcc、glibc和binutils模块之间的关系,以及在现有系统上如何升级的总结
- 如何获得当前运行模块在进程地址空间的位置
- linux僵尸进程产生的原因以及如何避免产生僵尸进程
- [收藏]什么是守护进程,以及如何编写。