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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
myxasa
14 / 14 / 1
Регистрация: 31.05.2012
Сообщений: 210
Записей в блоге: 2
#1

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

02.08.2013, 19:11. Просмотров 536. Ответов 0
Метки нет (Все метки)

Компилирую из под 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++
Здравствуйте! Запущен процесс пытаюсь получить его адрес по аналогии с dll модулями MODULEINFO GetModuleInfo(char *szModule) { ...

Функции для работы со строками - получение символа строки - C++
Всем доброго времени суток! Начал изучать C++ пару дней назад, а так как я знаком с PHP, его изучение пошло как по маслу. Но...

Получение переменных из строки, изменение строки, запись в файл - C++
Всем доброго времени суток. У меня есть текстовый документ, который содержит в себе пару сотен строк, которые выглядят следующим...

Чтение строки из памяти стороннего процесса - C++
Никогда не думал, что будут проблемы с чтением строки из памяти, но они есть :D Пишу так: cout &lt;&lt; Proc.Read&lt;PCHAR&gt;(dwAddr) &lt;&lt; endl; ...

Поиск строки в памяти запущенного процесса и её изменение - C++
Подскажи пожалуйста, что я делаю не так. Вот мой код. #include &quot;windows.h&quot; #include &lt;iostream&gt; using namespace std; int...

Получение подстроки из строки - C++
Разработать программу, выполняющую чтение из произвольного текстового файла символьных строк. Необходимо вывести на экран исходный текст и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2013, 19:11
Привет! Вот еще темы с ответами:

Получение последней строки из файла - C++
Вообщем прощу помощи, мне нужно получить последнюю строку из текстового файла и запихнуть ее в string. Желательно не перебирая весь файл,...

Строки: кириллица + получение подстроки - C++
задание: как осуществить вывод кириллицы, содержащейся в памяти? (т.е. не cout &lt;&lt; &quot;СТРОКA&quot;&quot; ). p.s. : использовал велосипед с выводом...

Получение данных из командной строки - C++
#include&lt;iostream&gt; using std::cout;using std::endl; int main(int argc, char *argv){ cout&lt;&lt;&quot;argc=&quot;&lt;&lt;argc&lt;&lt;endl; for (int i=0;...

Получение длины строки в пикселях? - C++
Как получить длину любой строки ListBoxa в пикселях?


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru