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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果PebProcess Environment Block)的路径修改后不起效,可能有以下几个原因: 1. 没有正确修改Peb路径字段:Peb包含了进程的重要信息,包括程序的路径修改Peb路径字段需要确保将新路径正确写入该字段,否则路径修改不会生效。可能是在修改路径时出现了错误或者忘记将新的路径写入Peb。 2. 没有重启进程:Peb路径字段只有在进程启动时才会读取并应用,如果修改路径后没有重启该进程,新的路径不会生效。所以,需要确保在修改Peb路径后,重启该进程使得新路径生效。 3. 被其他因素覆盖:有些程序会通过保护机制或安全策略来防止路径被非法修改,这可能导致Peb路径字段被恢复到原始值,从而修改路径无效。如果程序具有类似的安全策略,可能需要进行额外的操作才能成功修改路径。 4. 编程错误或操作系统限制:在某些情况下,可能由于编程错误或操作系统限制导致修改Peb路径无效。例如,某些操作系统可能限制了修改系统关键信息的能力,从而阻止了路径修改。需要详细检查程序或操作系统文档,以确定是否存在这种限制。 综上所述,如果Peb修改路径后不起效,需要检查是否正确修改Peb路径字段、是否重启了进程、是否存在安全策略限制以及是否涉及编程错误或操作系统限制。根据具体的情况进行对应的调整和修复,以使路径修改生效。 ### 回答2: 当在PEB(进程环境块)修改路径后却不起效时,可能有以下几个可能的原因和解决方法。 第一个可能的原因是修改路径并不是PEB指定的路径PEB保存了进程的环境变量和路径信息,当我们通过修改PEB路径来改变程序的搜索路径时,需要确保修改路径PEB路径一致。可以通过读取PEB路径信息,确认是否正确修改了对应的路径。 第二个可能的原因是修改路径的时机不正确。PEB保存的是进程启动时的路径信息,所以如果在进程启动后再修改PEB路径修改是无效的。需要在进程启动之前或者重新启动进程来使修改路径生效。 第三个可能的原因是缺少对修改路径的权限。PEB路径信息是受保护的,只有进程管理员或者具有足够权限的用户才能修改。因此,检查当前用户的权限,确保具备修改PEB路径的权限。 最后,可能是程序内部对路径信息进行了缓存。有些程序在启动时会对路径信息进行缓存,以提高性能或者减少文件系统访问次数。在这种情况下,即使修改PEB路径,程序仍然会使用缓存的路径信息。解决方法是重新启动程序或者清除缓存,使修改路径生效。 综上所述,当在PEB修改路径后却不起效时,需要检查是否正确修改了对应的路径修改路径的时机是否正确,用户是否具备修改PEB路径的权限,并考虑是否对路径信息进行了缓存。根据具体情况来采取相应的解决方法。 ### 回答3: 当修改PEB(进程环境块)路径后,可能会遇到路径不起效的情况。原因可能有以下几点: 1. 系统保护机制:PEB路径可能被系统保护机制所限制,在某些情况下无法实际生效。例如,部分操作系统禁止用户修改系统关键目录的路径。 2. 程序重启前置:某些程序在启动时会读取并保存PEB路径信息,如果在程序启动后修改PEB路径,程序需要重启才能生效。 3. 函数缓存:某些函数在调用时会缓存PEB路径信息,以提高性能。因此,如果修改PEB路径,可能需要等到缓存被刷新后才能生效。 4. 读写权限:PEB路径信息可能受到访问权限的限制。如果没有足够的权限来修改PEB路径修改将不会生效。 为解决这个问题,可以尝试以下方法: 1. 以管理员权限运行程序:如果修改路径位于系统关键目录下,确保以管理员身份运行程序,以获取足够的权限来修改PEB路径。 2. 重启程序:修改PEB路径后,尝试重启程序,以使修改能够生效。 3. 强制刷新缓存:可以尝试通过系统API或者特定的程序接口来刷新函数缓存,强制使修改后的PEB路径生效。 需要注意的是,在修改PEB路径前,请确保了解并理解系统的相关保护机制,以及修改后可能会产生的影响和风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值