首页
社区
课程
招聘
[分享]由寻找进程路径到进程数据结构
发表于: 2013-4-20 23:06 6427

[分享]由寻找进程路径到进程数据结构

2013-4-20 23:06
6427
刚深入内核,分享自己学习笔记,高手飘过……有错误的地方尽管指正!谢谢!
最近正在学习遍历进程的东东,现在做做总结,资料为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这是曾经在论坛看的比较详细的介绍驱动与用户层通信的。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
2
很基础。。mark~
2013-4-21 11:42
0
雪    币: 103
活跃值: (126)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
继续努力中
2013-4-21 11:59
0
游客
登录 | 注册 方可回帖
返回
//