tlhelp32.h,IMAGE_ODS_HEADER,IMAGE_NT_HEADER

tlhelp32.h主要是用于枚举系统中某个时刻的进程,线程,模块,堆。

  • 快照

系统中本身维护着进程链表,线程链表,模块链表和堆链表。而快照是这个模型的某个时候的复制品。

通过CreateToolhelp32Snapshot可以创建快照。通过快照,再利用Process32First和Process32Next。我们能够方便走访进程链表。同理可以走访其他链表。注意走访堆链表,使用HEAPLIST32,Heap32ListFirst(),Heap32ListNext()而非用HEAPENTRY32;

 

提供简洁的通用的遍历模型:

for(BOOL fOK=Process32First(..,..);fOK;fOK=Process32Next(..,..))
{...}

 

另外一个比较有趣的函数是:

Toolhelp32ReadProcessMemory

BOOL WINAPI Toolhelp32ReadProcessMemory(
  __in   DWORD th32ProcessID,
  __in   LPCVOID lpBaseAddress,
  __out  LPVOID lpBuffer,
  __in   SIZE_T cbRead,
  __out  SIZE_T lpNumberOfBytesRead
);

此函数可以将进程中某个起始地址开始的内存复制到一块缓冲区中。通过这种方式,我们可以获得某个进程的一些头信息,例如PE文件的DOS头,文件头。

 

《windows核心编程》中通过读取PE的DOS头,得到文件头的偏移位置,然后通过读取文件头可以得到模块的首选基地址。详细请参考《Windows核心编程》相应代码。

 

The first bytes of a PE file begin with the traditional MS-DOS header, called an IMAGE_DOS_HEADER<%2 

Toolhelp32ReadProcessMemory(dwProcessId, (PBYTE) pvModuleRemote + idh.e_lfanew, &inth, sizeof(inth), NULL);
// Verify the NT image header
if (inth.Signature == IMAGE_NT_SIGNATURE)
{
     // This is valid NT header, get the image's preferred base address
    pvModulePreferredBaseAddr = (PVOID) inth.OptionalHeader.ImageBase;
 } 

 return(pvModulePreferredBaseAddr);

 

其中有关IAMGE_DOS_HEADER中重要信息如下:

 

The first bytes of a PE file begin with the traditional MS-DOS header, called anIMAGE_DOS_HEADER. The only two values of any importance are e_magic and e_lfanew. The e_lfanew field
contains the file offset of the PE header. The e_magic field (a WORD) needs to be set to the value 0x5A4D. There's a #define for this value, named IMAGE_DOS_SIGNATURE. In ASCII representation, 0x5A4D is MZ, the initials of Mark Zbikowski, one of the original
architects of MS-DOS.

时间: 2024-09-12 12:16:05

tlhelp32.h,IMAGE_ODS_HEADER,IMAGE_NT_HEADER的相关文章

Windows编程:开启/关闭/遍历程序的类 代码(C++)

类包含4个函数, 启动程序, 遍历所有进程, 关闭程序, 遍历进程依赖的动态链接库. 示例: Image.exe是预先生成的可执行程序(exe), 启动程序, 间隔5秒, 关闭程序. 使用方法参加测试程序. 代码: /* * process.h * * Created on: 2014.06.08 * Author: Spike */ /*vs 2012*/ #ifndef TRAVERSEPROCESSMODEL_H #define TRAVERSEPROCESSMODEL_H #includ

Windows编程:遍历程序使用的动态链接库(dll) 代码(C++)

遍历程序使用的动态链接库(dll), 首先需要遍历所有进程, 匹配进程名称与进程ID, 然后根据进程名称, 输出所有使用的库(dll). 示例中Image.exe是预先启动的程序. 代码包含遍历进程的代码, 和输出动态链接库(dll)的代码. 代码: /* * main.cpp * * Created on: 2014.06.08 * Author: Spike */ /*vs 2012*/ #include <iostream> #include <iomanip> #inclu

Windows编程:终止可执行(exe)程序 代码(C++)

终止可执行(exe)程序, 首先遍历进程, 找到进程名称对于的进程ID号, 然后根据进程ID, 终止进程. 示例代码: 包括遍历进程代码, 和关闭代码. 代码: /* * main.cpp * * Created on: 2014.06.08 * Author: Spike */ /*vs 2012*/ #include <iostream> #include <string> #include <map> #include <windows.h> #inc

Windows编程:遍历所有进程(exe) 代码(C++)

遍历所有进程, 即任务管理器中所有的进程目录, 包含名称和进程ID. 返回字典: Key: 进程名字, Value: 进程ID. 代码: /* * main.cpp * * Created on: 2014.06.08 * Author: Spike */ /*vs 2012*/ #include <iostream> #include <string> #include <map> #include <windows.h> #include <TlH

调用WinApi查询内存信息

Pnig0s1992: 列出当前系统信息,当前系统内存状况. 枚举进程,列出每个进程所有内存块的页面类型,页面属性,保护属性等信息 //Code by Pnig0s1992 //Date:2012,3,15 #include <stdio.h> #include <Windows.h> #include <TlHelp32.h> VOID getMemoryInfo(SYSTEM_INFO si,HANDLE hProcess); int main(void) { SY

自制进程管理器

系统中运行的进程实际上比我们在任务管理器("Ctrl+Alt+Del"对话框)中看到的要多,有些恶意的程序是无法在任务栏和任务管理器中看到的.本文介绍如何显示系统当前运行的所有进程,及如何终止运行的进程. 运行程序,点按钮"获取进程",则系统当前运行的所有进程名称以及进程对应的ID.涉及的线程数.优先级便显示在列表视图里面了.图一是程序运行效果图. 图一 运行效果图 1.基本原理 系统中有个进程链表,用来保存当前运行的所有进程的信息,程序首先调用函数CreateTo

用快照枚举当前系统中所有进程

如何用快照枚举当前系统中所有进程,近来问这个问题的朋友比较多,所以干脆贴上来算了.呵呵.:D 在窗体上添加一个ListView,设置其ViewStyle为vsReport,在ListView上添加三个Column,再添加一个Button. #include <tlhelp32.h>#include "stdio.h"void __fastcall TMainForm::Button1Click(TObject *Sender){ // Find each process a

如何关闭除自己程序外的所有其他应用程序

获得当前激活的进程: 1:包含头文件tlhelp32.h 2:.cpp如下: ListView2->Items->Clear(); TListItem *mItem; AnsiString ExeFile; Pointer pt,pt2; unsigned int s; DWORD size,size2; HANDLE snapshot; PROCESSENTRY32 processinfo; processinfo.dwSize = sizeof(processinfo); snapshot

利用窗口子类化隐藏系统图标

窗口子类化是一种非常有用的技术,通常它用在Windows GUI编程方面,我们用这种技术来创建新的控件,比如让SubClassing一个Edit控件添加一些消息处理让它变成MaskEdit控件等等.反过来想想如果我们SubClassing一个有ES_PASSWORD风格的窗口控件,得到它的密码是难是吗?很简单,不过是一句CallWindowProc调用,只不过在NT等系统上需要Inject一个DLL到目标进程来SubClassing一个进程中的窗口或是子窗口. 用Spy++看了一下,资源管理器里