首页
社区
课程
招聘
[求助]win7-x64系统下如何获取32位进程的命令行参数
发表于: 2018-11-29 16:48 4328

[求助]win7-x64系统下如何获取32位进程的命令行参数

2018-11-29 16:48
4328
// Peb
//
typedef struct _CURDIR
{
UNICODE_STRING DosPath;
HANDLE Handle;
} CURDIR, *PCURDIR;

typedef struct _RTL_USER_PROCESS_PARAMETERS {
UINT32 MaximumLength;
UINT32 Length;
UINT32 Flags;
UINT32 DebugFlags;
HANDLE ConsoleHandle;
UINT32 ConsoleFlags;
HANDLE StandardInput;
HANDLE StandardOutput;
HANDLE StandardError;
CURDIR CurrentDirectory;        // ProcessParameters
UNICODE_STRING DllPath;         // ProcessParameters
UNICODE_STRING ImagePathName;   // ProcessParameters
UNICODE_STRING CommandLine;     // ProcessParameters
PVOID   Environment;
UINT32 StartingX;
UINT32 StartingY;
UINT32 CountX;
UINT32 CountY;
UINT32 CountCharsX;
UINT32 CountCharsY;
UINT32 FillAttribute;
UINT32 WindowFlags;
UINT32 ShowWindowFlags;
UNICODE_STRING WindowTitle;
UNICODE_STRING DesktopInfo;
UNICODE_STRING ShellInfo;
UNICODE_STRING RuntimeData;
UINT32 CurrentDirectores[8];
#ifdef _WIN64
UINT64  EnvironmentSize;
UINT64  EnvironmentVersion;
#endif // _WIN64

}RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;



typedef struct _PEB_LDR_DATA32
{
UINT32 Length;
UINT8 Initialized;
UINT32 SsHandle;
LIST_ENTRY32 InLoadOrderModuleList;
LIST_ENTRY32 InMemoryOrderModuleList;
LIST_ENTRY32 InInitializationOrderModuleList;
} PEB_LDR_DATA32, *PPEB_LDR_DATA32;

typedef struct _LDR_DATA_TABLE_ENTRY32
{
LIST_ENTRY32 InLoadOrderLinks;
LIST_ENTRY32 InMemoryOrderLinks;
LIST_ENTRY32 InInitializationOrderLinks;
UINT32 DllBase;
UINT32 EntryPoint;
UINT32 SizeOfImage;
UNICODE_STRING32 FullDllName;
UNICODE_STRING32 BaseDllName;
UINT32 Flags;
UINT16 LoadCount;
UINT16 TlsIndex;
LIST_ENTRY32 HashLinks;
UINT32 TimeDateStamp;
} LDR_DATA_TABLE_ENTRY32, *PLDR_DATA_TABLE_ENTRY32;

typedef struct _PEB32
{
UINT8 InheritedAddressSpace;
UINT8 ReadImageFileExecOptions;
UINT8 BeingDebugged;
UINT8 BitField;
UINT32 Mutant;
UINT32 ImageBaseAddress;
UINT32 Ldr;
UINT32 ProcessParameters;
UINT32 SubSystemData;
UINT32 ProcessHeap;
UINT32 FastPebLock;
UINT32 AtlThunkSListPtr;
UINT32 IFEOKey;
UINT32 CrossProcessFlags;
UINT32 UserSharedInfoPtr;
UINT32 SystemReserved;
UINT32 AtlThunkSListPtr32;
UINT32 ApiSetMap;
} PEB32, *PPEB32;





typedef struct _WOW64_PROCESS {
PVOID Wow64;
} WOW64_PROCESS, *PWOW64_PROCESS;

PWOW64_PROCESS  Wow64Process = NULL;
PPEB32  Peb = NULL;
PRTL_USER_PROCESS_PARAMETERS ProcessParam = NULL;

// PPEB_LDR_DATA32  Ldr = NULL;
//PLDR_DATA_TABLE_ENTRY32  LdrDataTableEntry = NULL;
// PLDR_DATA_TABLE_ENTRY32  FoundDataTableEntry = NULL;

Wow64Process = PsGetCurrentProcessWow64Process();
if (NULL != Wow64Process)
{
DbgPrint("it is 32bit\n");

Peb = (PPEB32)&Wow64Process->Wow64;

if (NULL != Peb)
{
DbgPrint("Peb is not NULL\n");

ProcessParam = ULongToPtr(Peb->ProcessParameters);
if (NULL != ProcessParam)
{
DbgPrint("ProcessParam is not NULL\n");
DbgPrint("command:%ws\n", ProcessParam->CommandLine.Buffer);
}

// PUNICODE_STRING commandline = (PUNICODE_STRING)((UINT32)param+40);
// DbgPrint("command:%ws\n", commandline->Buffer);


}
这是我的代码,我是通过回调的方式,检测32进程启动,然后抓获进程,但是打印时从未显示正确过,跪求大神指点!

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

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
用调试工具分析,偏移是否正确,成员是否可访问
涉及到底层的时候,结构体并不一定兼容,驱动的坑
2018-11-29 18:50
0
雪    币: 7559
活跃值: (5397)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
32位的UNICODE_STRING重新定义.
typedef struct _STRING32 {
    USHORT   Length;
    USHORT   MaximumLength;
    ULONG  Buffer;
} STRING32;
typedef STRING32 *PSTRING32;

typedef STRING32 UNICODE_STRING32;
2018-11-30 00:19
0
雪    币: 7
活跃值: (1461)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢lononan ,确实是这个问题。
2018-11-30 09:15
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
5
32位进程不是一样有PsGetProcessPeb的吗?没事去整wow64peb干嘛。。
2018-11-30 10:35
0
雪    币: 7
活跃值: (1461)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
@hzqst 
想获取其命令行,然后进行修改,不知道大神是否做过。
2018-11-30 11:38
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
7
流浪者 @hzqst 想获取其命令行,然后进行修改,不知道大神是否做过。
进程起来之后再改peb里的没用了,纯粹骗自己
2018-11-30 14:52
0
雪    币: 7
活跃值: (1461)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
hzqst 进程起来之后再改peb里的没用了,纯粹骗自己
可以的,64位进程我已经修改成功了,现在正研究32位的。
2018-11-30 17:20
0
雪    币: 4006
活跃值: (726)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
过来人 告诉你,这个东西没啥用,骗骗小白还是可以的,这个玩意在两年前就搞过稳定版本的,后面遗弃了,原因你后面会知道的.
2018-11-30 18:12
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
10
流浪者 可以的,64位进程我已经修改成功了,现在正研究32位的。
所以你改的只是任务管理器看到的东西,到进程里调一下GetCommandLineA/W立马原形毕露
2018-11-30 18:54
0
雪    币: 5734
活跃值: (1737)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
用Ustr32ToUstr 先转换一下 然后用 %wZ 打印 基本功, 表哥 GetCommandLineA/W 就是从这里拿的哦
2018-11-30 20:07
0
雪    币: 7
活跃值: (1461)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
放学打我不 过来人 告诉你,这个东西没啥用,骗骗小白还是可以的,这个玩意在两年前就搞过稳定版本的,后面遗弃了,原因你后面会知道的.
能否给个版本,给指点一二,本人刚开始研究内核驱动编写,一共不到2个月时间,实在惭愧。
2018-11-30 22:37
0
雪    币: 7
活跃值: (1461)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
小艾 用Ustr32ToUstr 先转换一下 然后用 %wZ 打印 基本功, 表哥 GetCommandLineA/W 就是从这里拿的哦[em_13]
这个问题解决了,还是32位与64位的定位问题
2018-11-30 22:38
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
14
小艾 用Ustr32ToUstr 先转换一下 然后用 %wZ 打印 基本功, 表哥 GetCommandLineA/W 就是从这里拿的哦[em_13]
其他系统没看过,xp的GetCommandLineA/W都从kernel32里的某个私有变量里拿的,kernel32加载时就保存了一份
最后于 2018-12-1 16:53 被hzqst编辑 ,原因:
2018-12-1 16:53
0
游客
登录 | 注册 方可回帖
返回
//