Форум программистов, компьютерный форум CyberForum.ru

Получение командой строки для процесса - C++

Восстановить пароль Регистрация
 
myxasa
14 / 14 / 1
Регистрация: 31.05.2012
Сообщений: 210
Записей в блоге: 2
02.08.2013, 19:11     Получение командой строки для процесса #1
Компилирую из под x86 всё здорово... запускаю на x64 - не может прочитать строку командную для процесса...
Для 64 бит компилировать мне не нужно... нужно как то сделать, чтобы работала, скомпилированная из под 32...
Что-то с readprocessmemory
Последний пост http://forum.sysinternals.com/readpr...opic24543.html
Хелп )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <windows.h>
#include <stdio.h>
 
typedef NTSTATUS (NTAPI *_NtQueryInformationProcess)(
    HANDLE ProcessHandle,
    DWORD ProcessInformationClass,
    PVOID ProcessInformation,
    DWORD ProcessInformationLength,
    PDWORD ReturnLength
    );
 
typedef struct _UNICODE_STRING
{
    USHORT Length;
    USHORT MaximumLength;
    PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
 
typedef struct _PROCESS_BASIC_INFORMATION
{
    LONG ExitStatus;
    PVOID PebBaseAddress;
    ULONG_PTR AffinityMask;
    LONG BasePriority;
    ULONG_PTR UniqueProcessId;
    ULONG_PTR ParentProcessId;
} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
 
PVOID GetPebAddress(HANDLE ProcessHandle)
{
    _NtQueryInformationProcess NtQueryInformationProcess =
        (_NtQueryInformationProcess)GetProcAddress(
        GetModuleHandleA("ntdll.dll"), "NtQueryInformationProcess");
    PROCESS_BASIC_INFORMATION pbi;
 
    NtQueryInformationProcess(ProcessHandle, 0, &pbi, sizeof(pbi), NULL);
 
    return pbi.PebBaseAddress;
}
 
int wmain(int argc, WCHAR *argv[])
{
    int pid;
    HANDLE processHandle;
    PVOID pebAddress;
    PVOID rtlUserProcParamsAddress;
    UNICODE_STRING commandLine;
    WCHAR *commandLineContents;
 
    DWORD pp;
 
    //HWND hWnd = FindWindow(NULL, L"Minecraft");
    GetWindowThreadProcessId(FindWindowW(0,L"Minecraft"), &pp);
 
    pid = pp;
   // pid = 4680;//_wtoi(argv[1]);
 
    if ((processHandle = OpenProcess(
        PROCESS_QUERY_INFORMATION | /* required for NtQueryInformationProcess */
        PROCESS_VM_READ, /* required for ReadProcessMemory */
        FALSE, pid)) == 0)
    {
        printf("Could not open process!\n");
        return GetLastError();
    }
 
    pebAddress = GetPebAddress(processHandle);
 
    /* get the address of ProcessParameters */
    if (!ReadProcessMemory(processHandle, (PCHAR)pebAddress + 0x10,
        &rtlUserProcParamsAddress, sizeof(PVOID), NULL))
    {
        printf("Could not read the address of ProcessParameters!\n");
        return GetLastError();
    }
 
    /* read the CommandLine UNICODE_STRING structure */
    if (!ReadProcessMemory(processHandle, (PCHAR)rtlUserProcParamsAddress + 0x40,
        &commandLine, sizeof(commandLine), NULL))
    {
        printf("Could not read CommandLine!\n");
        return GetLastError();
    }
 
    /* allocate memory to hold the command line */
    commandLineContents = (WCHAR *)malloc(commandLine.Length);
 
    /* read the command line */
    if (!ReadProcessMemory(processHandle, commandLine.Buffer,
        commandLineContents, commandLine.Length, NULL))
    {
        printf("Could not read the command line string!\n");
        return GetLastError();
    }
 
    /* print it */
    /* the length specifier is in characters, but commandLine.Length is in bytes */
    /* a WCHAR is 2 bytes */
    printf("%.*S\n", commandLine.Length / 2, commandLineContents);
    CloseHandle(processHandle);
    free(commandLineContents);
    system("pause");
    return 0;
}
Добавлено через 9 часов 42 минуты
Вот решение ReadProcessMemory из x86 для х64
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2013, 19:11     Получение командой строки для процесса
Посмотрите здесь:

Поиск строки в памяти запущенного процесса и её изменение C++
C++ Получение длины строки в пикселях?
C++ Получение последней строки из файла
C++ Различия комбинаций клавиш для остановки процесса
C++ Получение данных из командной строки
C++ Получение виртуального кода клавиши из строки
C++ Получение символа строки (Debian)
Чтение строки из памяти стороннего процесса C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 20:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru