【发布时间】:2016-10-20 18:37:34
【问题描述】:
我正在尝试获取进程环境字符串,下面的代码是我已经写的。
#include <windows.h>
#include <tchar.h>
#define ProcessBasicInformation 0
typedef struct _PROCESS_BASIC_INFORMATION {
NTSTATUS ExitStatus;
PVOID PebBaseAddress;
ULONG_PTR AffinityMask;
LONG BasePriority;
HANDLE UniqueProcessId;
HANDLE InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
int _tmain(int argc, TCHAR* argv[]) {
TCHAR *app;
DWORD pid;
HANDLE proc;
NTSTATUS nts;
PVOID rupp; // RTL_USER_PROCESS_PARAMETERS, offset 0x10
PVOID env; // Environment, offset 0x48
TCHAR *buf;
PROCESS_BASIC_INFORMATION pbi;
MEMORY_BASIC_INFORMATION mbi;
if (argc != 2) {
app = _tcsrchr(argv[0], '\\');
_tprintf(TEXT("Usage: %s [PID]\n"), app ? ++app : argv[0]);
return -1;
}
_stscanf_s(argv[1], TEXT("%lu"), &pid);
if (!(proc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid))) {
return -1;
}
if (!(nts = NtQueryInformationProcess(
proc, ProcessBasicInformation, &pbi, sizeof(pbi), NULL
))) {
if (ReadProcessMemory(
proc, (PCHAR)pbi.PebBaseAddress + 0x10, &rupp, sizeof(rupp), NULL
)) {
if (ReadProcessMemory(proc, (PCHAR)rupp + 0x48, &env, sizeof(env), NULL)) {
//what I need to do to get enironment strings?
}
}
}
CloseHandle(proc);
return 0;
}
有人可以解释我需要做什么来获取进程的环境字符串吗?
【问题讨论】:
-
我不知道这样做的支持方式。保护环境变量的锁是进程本地的。您不能从另一个进程中获取锁。环境变量被认为是进程私有的,不应在外部进行操作。如果要操作进程的环境变量,则需要与进程协调。 (例如,请参阅the WM_SETTINGSCHANGE "Environment" notification。)
-
目前尚不清楚,当存在已记录且受支持的解决方案时,为什么还要坚持使用未记录的方法。为什么痴迷于
ReadProcessMemory? -
ReadProcessMemory 是与调用 SetEnvironmentVariable 的进程的固有竞争条件。它还依赖于大量未记录/不受支持的技术。
-
@kate:我们已经充分确定,调用
ReadProcessMemory不能可靠地检索另一个进程的环境。为什么老是找错树?你为什么坚持,你绝对必须使用ReadProcessMemory,而不是使用可以可靠工作的替代品?请尝试在不使用以下单词列表的情况下回答该问题:"idiots"、"stupid"、"loosers"(包括正确的拼写吊坠“失败者”)。祝你好运(你需要它)。 -
请避免侮辱其他 Stack Overflow 成员并保持专业。