【旧文章搬运】获取并修改PEB中的映像路径,命令行和当前目录
原文发表于百度空间,2008-7-24
当时对UNICODE_STRING的使用还有点问题,导致最终效果图中字符串被截断了
==========================================================================
先从分析PEB开始吧.
感觉分析这个东西,首先要把类型定义搞清楚,这个在Windbg里dt _PEB就可以了
搞清楚定义主要是为了定位相关变量的偏移.
PEB中的ProcessParameters部分就是进程的参数了,里面就有我们感兴趣的映像路径等信息
之所以对这个感兴趣,是因为以前看到过修改PEB中的映像路径过防火墙的
获取PEB很简单,也早有人说过这个问题.
在用户模式下,fs寄存器指向TEB结构,在TEB开头部分是这么定义的:
lkd> dt _TEB
nt!_TEB
+0x000 NtTib : _NT_TIB
+0x01c EnvironmentPointer : Ptr32 Void
+0x020 ClientId : _CLIENT_ID
+0x028 ActiveRpcHandle : Ptr32 Void
+0x02c ThreadLocalStoragePointer : Ptr32 Void
+0x030 ProcessEnvironmentBlock : Ptr32 _PEB //这个就指向PEB
再看PEB的开头部分:
lkd> dt _PEB
nt!_PEB
+0x000 InheritedAddressSpace : UChar
+0x001 ReadImageFileExecOptions : UChar
+0x002 BeingDebugged : UChar
+0x003 SpareBool : UChar
+0x004 Mutant : Ptr32 Void
+0x008 ImageBaseAddress : Ptr32 Void
+0x00c Ldr : Ptr32 _PEB_LDR_DATA
+0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS //指向进程的参数
再来看_RTL_USER_PROCESS_PARAMETERS 的结构:
lkd> dt _RTL_USER_PROCESS_PARAMETERS
nt!_RTL_USER_PROCESS_PARAMETERS
+0x000 MaximumLength : Uint4B
+0x004 Length : Uint4B
+0x008 Flags : Uint4B
+0x00c DebugFlags : Uint4B
+0x010 ConsoleHandle : Ptr32 Void
+0x014 ConsoleFlags : Uint4B
+0x018 StandardInput : Ptr32 Void
+0x01c StandardOutput : Ptr32 Void
+0x020 StandardError : Ptr32 Void
+0x024 CurrentDirectory : _CURDIR //当前目录
+0x030 DllPath : _UNICODE_STRING
+0x038 ImagePathName : _UNICODE_STRING //映像路径
+0x040 CommandLine : _UNICODE_STRING //命令行
+0x048 Environment : Ptr32 Void
+0x04c StartingX : Uint4B
+0x050 StartingY : Uint4B
+0x054 CountX : Uint4B
+0x058 CountY : Uint4B
+0x05c CountCharsX : Uint4B
+0x060 CountCharsY : Uint4B
+0x064 FillAttribute : Uint4B
+0x068 WindowFlags : Uint4B
+0x06c ShowWindowFlags : Uint4B
+0x070 WindowTitle : _UNICODE_STRING
+0x078 DesktopInfo : _UNICODE_STRING
+0x080 ShellInfo : _UNICODE_STRING
+0x088 RuntimeData : _UNICODE_STRING
+0x090 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR
到这儿,应该就比较清楚了,反正这些东西都是在用户空间的,可以看也可以改.
关键代码如下:
- typedef struct _RTL_USER_PROCESS_PARAMETERS
- {
- DWORD MaximumLength;
- DWORD Length;
- DWORD Flags;
- DWORD DebugFlags;
- HANDLE ConsoleHandle;
- DWORD ConsoleFlags;
- HANDLE StandardInput;
- HANDLE StandardOutput;
- HANDLE StandardError;
- CURDIR CurrentDirectory;
- UNICODE_STRING DllPath;
- UNICODE_STRING ImagePathName;
- UNICODE_STRING CommandLine;
- void* Environment; //指向MULTI的宽字符串
- DWORD StartingX;
- DWORD StartingY;
- DWORD CountX;
- DWORD CountY;
- DWORD CountCharsX;
- DWORD CountCharsY;
- DWORD FillAttribute;
- DWORD WindowFlags;
- DWORD ShowWindowFlags;
- UNICODE_STRING WindowTitle;
- UNICODE_STRING DesktopInfo;
- UNICODE_STRING ShellInfo;
- UNICODE_STRING RuntimeData;
- RTL_DRIVE_LETTER_CURDIR CurrentDirectores;
- }RTL_USER_PROCESS_PARAMETERS;
- void* PEB;
- PWSTR p;
- PWSTR fakeImagePath=L"I am achillis,this is fake image path";
- PWSTR fakeCommandLine=L"I am achillis,this is fake commandline";
- PWSTR fakeCurrentDirectory=L"I am achillis,this is fake CurrentDirectory";
- RTL_USER_PROCESS_PARAMETERS *pUserParam;
- _asm
- {
- mov eax,fs:[0x30] //TEB->PEB
- mov eax,[eax+0x10] //PEB->ProcessParameters
- mov pUserParam,eax
- }
- printf("RTL_USER_PROCESS_PARAMETERS:0x%08x\n",pUserParam);
- //输出映像路径等信息
- //wprintf(L"DllPath:%s\n",pUserParam->DllPath.Buffer);
- wprintf(L"[ImagePath]:%s\n",pUserParam->ImagePathName.Buffer);
- wprintf(L"[CommandLine]:%s\n",pUserParam->CommandLine.Buffer);
- wprintf(L"[CurrentDirectory]:%s\n",pUserParam->CurrentDirectory.DosPath.Buffer);
- //修改其中的内容
- lstrcpyW(pUserParam->ImagePathName.Buffer,fakeImagePath);
- lstrcpyW(pUserParam->CommandLine.Buffer,fakeCommandLine);
- lstrcpyW(pUserParam->CurrentDirectory.DosPath.Buffer,fakeCurrentDirectory);
效果还行,但是路径那块儿还是有问题,被截断了.
丢个图吧,高手飘过~
【旧文章搬运】获取并修改PEB中的映像路径,命令行和当前目录的更多相关文章
- 【旧文章搬运】改PEB中的映像路径可以这样~
原文发表于百度空间,2008-7-26========================================================================== 用常用的几个 ...
- 【旧文章搬运】《从PEB获取内存中模块列表》的补充
原文发表于百度空间,2008-7-26========================================================================== 继续研究PE ...
- 【旧文章搬运】暴搜内存查找PE镜像
原文发表于百度空间,2008-7-28========================================================================== 前面介绍了修 ...
- 【旧文章搬运】从PEB获取内存中模块列表
原文发表于百度空间,2008-7-25========================================================================== PEB中的L ...
- 【旧文章搬运】KeUserModeCallback用法详解
原文发表于百度空间及看雪论坛,2010-01-10 看雪论坛地址:https://bbs.pediy.com/thread-104918.htm 代码及附件可到这里下载=============== ...
- 【旧文章搬运】Win7可变对象头结构之InfoMask解析
原文发表于百度空间,2010-08-11========================================================================== 对Wind ...
- 【旧文章搬运】Windows内核常见数据结构(进程相关)
原文发表于百度空间,2008-7-24========================================================================== 进程的相关结 ...
- 【旧文章搬运】关于windbg搜索符号文件的一点说明
原文发表于百度空间,2010-09-07========================================================================== 本来只是打 ...
- 【旧文章搬运】修改PEB,断链隐藏模块成功
原文发表于百度空间,2008-7-26========================================================================== 继续实践之前 ...
随机推荐
- java通过反射获取bean字段注解@Column中的信息
直接上代码吧: Field field; Field[] fields=clas.getDeclaredFields(); for (int i = 0; i <fields.length ; ...
- Android ZXing 二维码、条形码扫描介绍
本帖最后由 Shims 于 2013-11-9 12:39 编辑 最近公司的Android项目需要用到摄像头做条码或二维码的扫描,Google一下,发现一个开源的 ZXing项目.它提供二维码和条形码 ...
- Dubbo和Spring集成Demo
Zookeeper安装和启动 http://mirrors.hust.edu.cn/apache/zookeeper/下载,我的版本是 3.4.5. 解压到 D:\zookeeper-3.4.5 配置 ...
- iOS开发之创建颜色渐变视图View
在iOS开发中有时需要自己自定义一个视图view的背景,而网上有人提出的在循环中不断alloc的方法设置其背景色渐变,会耗费很多内存和资源,极其不明智,而在CALayer中早就提供有图层渐变的类和相应 ...
- iOS开发之计算两个日期的时间间隔
//首先创建格式化对象 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDate ...
- VBA 把电信的电话费用表转换成部门电话费用明细表(图文)
今天同事要做一个这种工作.就是把电信发来的费用表,转换成按部门划分的电话费用表,100多部电话,假设一个个去核对,真还是须要些时间的.问题来了,有更好的方法么,我们来看一下. 电信公司给的费用明细是这 ...
- 手写 redux 和 react-redux
1.手写 redux redux.js /** * 手写 redux */ export function createStore(reducer) { // 当前状态 let currentStat ...
- vue2.0 自定义过滤器(filter)实例
一.过滤器简介 (1)过滤器创建 过滤器的本质 是一个有参数 有返回值的方法 new Vue({ filters:{ myCurrency:function(myInput){ return 处理后的 ...
- 机房收费系统(VB.NET)个人版总结
重构版个人机房收费系统大概从暑假开学開始进行.花了不到一个半月的时间才完毕.以下对我在重构过程中的一写理解. 1.系统设计一个非常重要的目的就是重用.而要做到重用,低耦合是最有效的手段回想一下我们C/ ...
- SQL server 子查询 链接查询
数据库 if while else 的使用 数据库运算符优先级