【旧文章搬运】获取并修改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);

效果还行,但是路径那块儿还是有问题,被截断了.
丢个图吧,高手飘过~

原文地址:https://www.cnblogs.com/achillis/p/10178381.html

时间: 2024-11-09 04:20:16

【旧文章搬运】获取并修改PEB中的映像路径,命令行和当前目录的相关文章

【旧文章搬运】遍历EPROCESS中的ActiveProcessLinks枚举进程

原文发表于百度空间,2008-7-25========================================================================== 前面对PEB的相关结构和其中的重要成员进行了分析和学习,现在开始真正进入内核,学习内核中的一些结构.这个EPROCESS结构在ntddk.h中有定义,但是并未给出具体的结构,因此要得到EPROCESS中一些重要的成员变量,只能通过偏移的方法,比如PID,ImageName等.这些偏移可以在Windbg中dt _

【旧文章搬运】Windows中全局钩子DLL的加载过程

原文发表于百度空间,2011-03-24========================================================================== 看雪上别人问的一个问题,顺便在此记录下吧~~ kd> kvn # ChildEBP RetAddr Args to Child 00 0012f7b8 77d2dbfb 0012f81c 00000000 00000008 kernel32!LoadLibraryExW+0x2 (FPO: [Non-Fpo]

【旧文章搬运】ZwQuerySystemInformation枚举内核模块及简单应用

原文发表于百度空间,2008-10-24========================================================================== 简单说,即调用第11号功能,枚举一下内核中已加载的模块.部分代码如下://功能号为11,先获取所需的缓冲区大小ZwQuerySystemInformation(SystemModuleInformation,NULL,0,&needlen);//申请内存ZwAllocateVirtualMemory(NtCu

【旧文章搬运】炉子给的SYSTEM_HANDLE_TYPE有点错误

原文发表于百度空间,2008-12-03========================================================================== 今天写程序,用ZwQuerySystemInformation枚举系统中的文件句柄时出了问题,死活一个都找不到,可是这明显不可能啊?于是用Process Explorer随便找了个文件句柄对象,然后看了它的OBJECT_TYPE,才发现文件句柄的类型索引应为28,而我用的是炉子给的那个SYSTEM_HANDL

【旧文章搬运】Idle进程相关的一些东西

原文发表于百度空间,2009-05-13========================================================================== Idle进程和System进程一样,也是系统中的一个特殊进程,严格讲它不算是一个进程,但是它有自己的EPROCESS,并有一个IdleThread.若说它算一个进程,它的进程空间.句柄表.Token等却又和System进程一样,即共享了System的内核数据,所以不能以常理对待之.关于Idle进程的两个问题:

【旧文章搬运】ZwQuerySystemInformation枚举进线程信息

原文发表于百度空间,2008-10-15========================================================================== 很古老的东西了,写一写,权当练手吧.本来以为没什么难度,很科普很傻瓜的东西,但是写的时候还是遇到一些问题,进程信息正确,得到的线程信息总是不正确,后来分析了一下,发现这个ntdll sdk中定义的进程信息结构和线程信息结构都有点问题,可能它是来自<Win2000 Native API>一书,不适用于Wind

【旧文章搬运】分析了一下360安全卫士的HOOK

原文发表于百度空间及看雪论坛,2009-10-08 看雪论坛地址:https://bbs.pediy.com/thread-99128.htm 看时间,09年的国庆节基本上就搞这玩意儿了...========================================================================== 分析了一下360的HOOK,通过直接hook KiFastCallEntry实现对所有系统调用的过滤. 我分析的版本如下:主程序版本: 6.0.1.1003H

在Powershell中使用start-process和-wait命令

脚本之家收集整理的这篇文章主要介绍了在Powershell中使用start-process和-wait命令,脚本之家小编觉得挺不错的,现在分享给大家,也给大家做个参考. 我是Power shell的新手,并没有太多的编程背景,只是试图将它用于软件包装.无论如何,我发现了带-Wait参数的start-process命令,它适用于大多数事情.我注意到的是,它不仅等待你指定的进程,它等待任何子进程,即使在主进程不再运行之后.通常这很好,但我有一个奇怪的情况.我正在使用start-process运行复杂

黄聪:WordPress 多站点建站教程(六):使用WP_Query、switch_to_blog函数实现获取子站点分类中的文章

首先在你使用主题的funtions.php里面添加下代码: //根据时间显示最新的分类文章内容,每个站点显示一篇内容 //$blog_id 子站点ID //$catid 分类ID wp_reset_query(); switch_to_blog($blog_id); global $post;?> $my_query2 = new WP_Query('showposts=1&order=desc&orderby=date&cat='.$catid); while ($my_q