原创 通过PEB获得进程路径 (附完整工程)

完整工程:http://files.cnblogs.com/files/Gotogoo/%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86%E5%99%A8%28x86%26%26x64%29.zip

 

PEB(Process Environment Block,进程环境块)存放进程信息,每个进程都有自己的PEB信息。位于用户地址空间。

PEB地址可以通过函数PsGetProcessPeb(EPROCESS)来获得,也可以通过EPROCESS基地址加偏移0x1b0(x86)来获得。

 

PEB结构

 typedef struct _PEB { // Size: 0x1D8/*000*/ UCHAR InheritedAddressSpace;/*001*/ UCHAR ReadImageFileExecOptions;/*002*/ UCHAR BeingDebugged;/*003*/ UCHAR SpareBool;/*004*/ HANDLE Mutant;/*008*/ HINSTANCE ImageBaseAddress; /*00C*/ VOID *DllList;/*010*/ PPROCESS_PARAMETERS *ProcessParameters;    //进程参数块
/*014*/ ULONG SubSystemData;/*018*/ HANDLE DefaultHeap;/*01C*/ KSPIN_LOCK FastPebLock;/*020*/ ULONG FastPebLockRoutine;/*024*/ ULONG FastPebUnlockRoutine;/*028*/ ULONG EnvironmentUpdateCount;/*02C*/ ULONG KernelCallbackTable;/*030*/ LARGE_INTEGER SystemReserved;/*038*/ ULONG FreeList;/*03C*/ ULONG TlsExpansionCounter;/*040*/ ULONG TlsBitmap;/*044*/ LARGE_INTEGER TlsBitmapBits;/*04C*/ ULONG ReadOnlySharedMemoryBase;/*050*/ ULONG ReadOnlySharedMemoryHeap;/*054*/ ULONG ReadOnlyStaticServerData;/*058*/ ULONG AnsiCodePageData;/*05C*/ ULONG OemCodePageData;/*060*/ ULONG UnicodeCaseTableData;/*064*/ ULONG NumberOfProcessors;/*068*/ LARGE_INTEGER NtGlobalFlag; /*070*/ LARGE_INTEGER CriticalSectionTimeout;/*078*/ ULONG HeapSegmentReserve;/*07C*/ ULONG HeapSegmentCommit;/*080*/ ULONG HeapDeCommitTotalFreeThreshold;/*084*/ ULONG HeapDeCommitFreeBlockThreshold;/*088*/ ULONG NumberOfHeaps;/*08C*/ ULONG MaximumNumberOfHeaps;/*090*/ ULONG ProcessHeaps;/*094*/ ULONG GdiSharedHandleTable;/*098*/ ULONG ProcessStarterHelper;/*09C*/ ULONG GdiDCAttributeList;/*0A0*/ KSPIN_LOCK LoaderLock;/*0A4*/ ULONG OSMajorVersion;/*0A8*/ ULONG OSMinorVersion;/*0AC*/ USHORT OSBuildNumber;/*0AE*/ USHORT OSCSDVersion;/*0B0*/ ULONG OSPlatformId;/*0B4*/ ULONG ImageSubsystem;/*0B8*/ ULONG ImageSubsystemMajorVersion;/*0BC*/ ULONG ImageSubsystemMinorVersion;/*0C0*/ ULONG ImageProcessAffinityMask;/*0C4*/ ULONG GdiHandleBuffer[0x22];/*14C*/ ULONG PostProcessInitRoutine;/*150*/ ULONG TlsExpansionBitmap;/*154*/ UCHAR TlsExpansionBitmapBits[0x80];/*1D4*/ ULONG SessionId;} PEB, *PPEB;

 

PEB偏移0x10处还有个指针ProcessParameters,指向一个进程参数块PPB、即RTL_USER_PROCESS_PARAMETERS数据结构。

这PPB也是在用户空间的,虽然是个独立存在的数据结构,逻辑上却可以看作是PEB的一部分。

 

进程参数块RTL_USER_PROCESS_PARAMETERS结构

typedef struct _RTL_USER_PROCESS_PARAMETERS
{ULONG MaximumLength;ULONG Length;ULONG Flags;ULONG DebugFlags;PVOID ConsoleHandle;ULONG ConsoleFlags;PVOID StandardInput;PVOID StandardOutput;PVOID StandardError;CURDIR CurrentDirectory;UNICODE_STRING DllPath;UNICODE_STRING ImagePathName;     //进程完整路径UNICODE_STRING CommandLine;PVOID Environment;ULONG StartingX;ULONG StartingY;ULONG CountX;ULONG CountY;ULONG CountCharsX;ULONG CountCharsY;ULONG FillAttribute;ULONG WindowFlags;ULONG ShowWindowFlags;UNICODE_STRING WindowTitle;UNICODE_STRING DesktopInfo;UNICODE_STRING ShellInfo;UNICODE_STRING RuntimeData;RTL_DRIVE_LETTER_CURDIR CurrentDirectores[32];ULONG EnvironmentSize;
} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;

 

下面以x86为例,在Windbg中可以具体实验感受一下:

1.先随便找个进程

 

 

2.注意PEB是在用户空间,从他的地址也可以看出来,因为7ffdf000<80000000,

所以在查看PEB时要先使用命令 .process 899ac958 切入我们我们所找的SogouExe.exe进程的地址空间中,这个很重要

然后我们查看进程SogouExe.exe的PEB

 

 

 

 

3.在偏移0x10处看到了结构体RTL_USER_PROCESS_PARAMETERS,从图中可以看出,它位于地址0x20000处

继续查看它

 

 

 

 

4,在偏移0x38处就存放着进程完整路径。OK,成功找到,这样就可以进入具体的代码实现了

 

 1 BOOLEAN GetProcessPathByEProcess(PEPROCESS EProcess,WCHAR* wzProcessPath)
 2 {
 3     PPEB  Peb = NULL;
 4     KAPC_STATE ApcState;
 5     ULONG_PTR  ProcessParameters = NULL;
 6      
 7 
 8     if (EProcess==NULL||!MmIsAddressValid(EProcess))
 9     {
10         return FALSE;
11     }
12     Peb = PsGetProcessPeb(EProcess);
13     if (Peb==NULL)
14     {
15         return FALSE;
16     }
17     
18     KeStackAttachProcess(EProcess, &ApcState);   //切入进程地址空间,很重要
19 
20 
21     ProcessParameters = *(ULONG_PTR*)((ULONG_PTR)Peb+ProcessParametersOfPeb);
22 
23     memcpy(wzProcessPath,((PUNICODE_STRING)((ULONG_PTR)ProcessParameters+ImagePathNameOfProcessParameters))->Buffer,
24         ((PUNICODE_STRING)((ULONG_PTR)ProcessParameters+ImagePathNameOfProcessParameters))->Length);
25 
26 
27 
28     KeUnstackDetachProcess(&ApcState);      //切出进程,很重要
29 
30 
31 
32     return TRUE;
33 }

 

转载于:https://www.cnblogs.com/Gotogoo/p/5259047.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

土豚mysql_树莓派LNMP配置

修改软件源1.首先备份源列表&#xff1a;sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup2.而后打开sources.list文件修改&#xff1a;sudo vim /etc/apt/sources.list软件源可已在网上查查&#xff0c;有ubuntu官方的、阿里云的、清华的等需要注意首先查看自己的…

Windbg SOS and CLR版本不一致的解决方案

由于测试服务环境与Windbg运行环境的差异&#xff0c;这就可能出现Windbg在分析dump文件时.net sos.dll和mscordacwks.dll版本不一致问题&#xff0c;从而导致windbg调试器的扩展命令无法正常使用&#xff0c;具体的解决方法如下&#xff1a;1.首先定义Windgb symbols路径&…

mysql镜像远程连接_docker 创建mysql镜像,并成功进行远程连接

1.安装1.1 拉取镜像docker pull mysql拉取成功可以验证一下docker images1.2 创建并启动一个mysql容器docker run --name ly-mysql -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 -d mysql–name&#xff1a;给新创建的容器命名&#xff0c;此处命名为ly-mysql-e&#xff1a;配置…

[DIV/CSS] 【译】60个有用CSS代码片段

2019独角兽企业重金招聘Python工程师标准>>> 1、垂直对齐 如果你用CSS&#xff0c;则你会有困惑&#xff1a;我该怎么垂直对齐容器中的元素&#xff1f;现在&#xff0c;利用CSS3的Transform&#xff0c;可以很优雅的解决这个困惑&#xff1a; .verticalcenter{posi…

java 类数组_Java常用类-字符串、日期类、算法及数组工具类等

大家好&#xff0c;乐字节的小乐又和大家见面了。这次要给大家讲述的是Java常用类。主要有以下知识点&#xff1a; 字符串相关类&#xff08;String 、StringBuffer、StringBuilder&#xff09; 算法及数组工具类(Arrays) 日期类 基本数据类型包装类 Math类 File类 枚举类一、 …

IOS之Foundation之探究学习Swift实用基础整理一

2019独角兽企业重金招聘Python工程师标准>>> 1 import Foundation2 3 //加载网络数据&#xff0c;查找数据的字符串4 let dataurl "http://api.k780.com:88/?appweather.city&&appkey10003&signb59bc3ef6191eb9f747dd4e83c99f2a4&formatjson…

sql 时间 没有日期_SQL-补充:日期和时间戳互转

补充&#xff1a;日期和时间戳互转1. 日期转时间戳-- 转十位select UNIX_TIMESTAMP(2018-12-25 12:25:00);结果&#xff1a;1545711900-- 转十三位SELECT REPLACE(unix_timestamp(current_timestamp(3)),.,);结果&#xff1a;15457119000212. 时间戳转日期 FROM_UNIXTIME(unix_…

CentOS 安装 Tomcat

1、Tomcat官网获&#xff08;http://tomcat.apache.org/&#xff09;取tar.gz文件的下载地址2、下载&#xff1a;# wget http://apache.fayea.com/tomcat/tomcat-8/v8.0.24/bin/apache-tomcat-8.0.24.tar.gz3、解压&#xff1a;# tar -zxvf apache-tomcat-8.0.24.tar.gz 4、复制…

mysql sqlite 性能优化_MySQL和Sqlite3性能测试

测试条件&#xff1a;i5-44603.2G&#xff0c;普通机械硬盘。MySql: 5.0.45-community-nt,32bit, innodb引擎,innodb_flush_log_at_trx_commit0Sqlite3: SynchronousOff,LockingMode ExclusiveTableScript:MySql:CREATE TABLE test (id int(10) unsigned NOT NULL auto_increm…

win7-64bit 下oracle11g plsql 的正确安装

本人在PC机上安装了Oracle 11g 版本号的数据库服务&#xff0c;通过PL/SQL连接数据库时总是无法连接&#xff0c;由于PLSQL没有64位版。通过32bit的PLSQL连接64位的Oracle时就会报错&#xff0c;第一种须要安装一个32位的oracle客户端工具instantclient进行转换&#xff0c;另外…

3.9 第二次作业

一、信息系统集成有哪些特点&#xff1f;信息系统集成要以满足客户需求为根本出发点。信息系统集成不只是设备选择和供应&#xff0c;更重要的&#xff0c;它是具有高技术含量的工程过程&#xff0c;要面向用户需求提供全面的解决方案&#xff0c;其核心是软件。系统集成的最终…

vue那个生命周期函数操作dom_vue生命周期实例小结

本文实例分析了vue生命周期。分享给大家供大家参考&#xff0c;具体如下&#xff1a;每个Vue实例都存在完整的生命周期&#xff0c;经历从创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、销毁等一系列过程。如下图所示vue的完整生命周期可分为三个阶段&#xff1a;初…

python 字符串函数 center_Python字符串处理

Python字符串处理Python处理字符串是一个基本操作&#xff0c;需要熟记于心&#xff0c; 这篇python字符串处理文章总结了大多数常用的字符串处理函数、策略&#xff0c;供大家以及自己参考使用。Part I 常见处理函数1. String.find(sub, start0, endlen(string))检测sub是否包…

关于apache的虚拟主机配置

增加用户账号的验证touch /data/.htpasswd[rootuser10data]# htpasswd -c /data/.htpasswd user1 #新增第一个账号[rootuser10data]# htpasswd /data/.htpasswd user2 #新增第二个账号编辑/usr/local/apache2/conf/extra/httpd-vhosts.conf<VirtualHost *:80&g…

python字符串垂直输出加循环_将漂亮的soup嵌套循环垂直输出到datafram中

我如何将这个web抓取(数据)的输出放入pandas数据帧&#xff1f;下面的代码只显示一行数据&#xff0c;并且是垂直排列的。如何使数据帧看起来完全像打印(数据)-即水平&#xff1f;另外&#xff0c;我是个新手&#xff0c;这可不是Python。请建议如何使其成为函数(&#xff1f;)…

不求很多,够用就好

Hi&#xff0c;我是一名在校学生&#xff0c;目前大三&#xff0c;希望在前端方向上发展&#xff0c;最好以后是一个真全栈 曾经也会搜索一堆的工具&#xff0c;后面发现 只有正确的使用合理数量的工具&#xff0c;才能加快开发步伐 下面简单推荐几个实用工具&#xff0c;强大并…

Android控件第6类——杂项控件

1、Toast Toast用于显示提示信息。 Toast不会获得焦点&#xff0c;没法关闭&#xff0c;过段时间会自动消失。 使用方法&#xff1a;Toast.makeText获得Toast&#xff0c;并设置相关属性。调用Toast对象的show方法显示。 默认情况&#xff0c;Toast只弹出一段话&#xff0c;如果…

数据结构与算法面试题80道(32)

32. 有两个序列a,b&#xff0c;大小都为n,序列元素的值任意整数&#xff0c;无序; 要求:通过交换a,b中的元素&#xff0c;使[序列a元素的和]与[序列b元素的和]之间的差最小。 当前数组a和数组b的和之差为 A sum(a) - sum(b) a的第i个元素和b的第j个元素交换后&#xff0c;a和…

微信昵称乱码 mysql_微信登录昵称中文乱码 Emoji表情乱码问题总结

APP中使用微信登录&#xff0c;流程一般是APP通过微信SDK请求code&#xff0c;然后APP使用code请求自己的服务器&#xff0c;服务器根据code获取access token&#xff0c;然后根据token和openid获取用户信息。在最后一步获取用户信息时经常出现中文乱码问题&#xff0c;这里记录…

HTML5——section,article,aside

section section元素描绘的是一个文档或者程序里的普通的section节&#xff0c;一般来说一个section包含一个head和一个content内容 块。section可以表示成一个小节&#xff0c;或者tab页面里的一个tab下的box块。一个页面里可以拆分成多个section&#xff0c;分别代表 introdu…