刚深入内核,分享自己学习笔记,高手飘过……有错误的地方尽管指正!谢谢!
最近正在学习遍历进程的东东,现在做做总结,资料为windows循序渐进,遍历进程用来三种方法PSAPI,ToolHelp,NativeAPI。都能实现,我主要想查找进程的映像路径,如图1 为PSAPI实现的,用EnumProcesses 枚举进程,然后根据PID ,用 OpenProcess打开进程
图1
但问题是为什么关于系统进程的路径都读不出来,调试发现进程ID为0,4都用OpenProcess打不开,其他的系统进程能打开,但是用GetModuleFileName返回路径失败,就出现上图情况。
然后准备用ToolHelp方式试试,用CreateToolhelp32Snapshot给进程拍照,然后 用Process32First,Process32Next遍历进程,在每次循环中再用
::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe32.th32ProcessID);//给进程的模块拍照
用Module32First遍历模块 第一个模块就可以找到映像路径
下面列出MODULEENTRY32和PROCESSENTRY32的结构体
情况还是如此,只要是系统进程就无法读出映像路径,用户程序也尝试过提权,但还是不行,也许随着时间的推移,以后能力提升了就会了,除了Idle和System不能打开 其他系统进程能打开也无法读取路径,于是就想探探进程的内部机理和数据结构。
每个Windows进程都是有一个执行体进程(EPROCESS)块来表示,线程块ETHREAD 进程环境块PEB 线程环境快TEB。内核进程(KPROCESS)块是EPROCESS的一个组成部分,而PEB则是EPROCESS指向的一个结构。
KPROCESS也称PCB,即进程控制块,它包含了windows内核在调度线程所需要的基本信息,如:分发器头,内核时间,用户时间,KTHREAD,进程自旋锁,进程亲和性,进程的基本优先级……
PEB位于用户空间,它包含了映像加载器,堆管理器和其他的windows系统DLL所需要的信息,如:映像基地址,模块列表,进程堆,影响版本信息……
其中BeingDebugged就是有一个反跟踪API IsDebuggerPresent判断自己是否处于调试状态的标志,用!process得到PEB的地址,但用!PEB+Address会显示error 1 InitTypeRead( nt!_PEB at 7ffde000),是由于用户空间会随时切换,因此用windbg调试用户程序,再输入命令行!peb后
继续讨论 EPROCESS ,由于EPROCESS比较长,截取关键部分
这里随便选个系统进程,为csrss.exe,dt _eprocess 0x864e6da0,再输入dt _SE_AUDIT_PROCESS_CREATION_INFO 0x864e6da0+0x1f4
地址0x86271be0为映像地址
根据windbg对EPROCESS的分析,用驱动实现,IoGetCurrentProcess()得到第一个EPROCESS地址,根据ActiveProcessLinks遍历其他EPROCESS的地址,即可找到映像基址,最后通过DeviceIoControl进行驱动与用户层通信,http://bbs.pediy.com/showthread.php?t=57666这是曾经在论坛看的比较详细的介绍驱动与用户层通信的。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)