Объединить DWORD - PullRequest
       42

Объединить DWORD

0 голосов
/ 18 октября 2018

Я хотел бы объединить 2 нестроковых типа, чтобы я мог использовать их как один.Это основная часть моего кода:

#include<stdio.h>
#include<string.h>
#include<windows.h>

int main() {
    HANDLE hwnd = FindWindowA(NULL, "MyProgram");
    DWORD ProcessId; GetWindowThreadProcessId(hwnd, &ProcessId);
    HANDLE handler = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
    ... ??? (type im not sure about) = 0x;          ??? ...
    ... ??? (type im not sure about) MemoryAddress; ??? ...
    int ValueOfAddress;
    ReadProcessMemory(handle, (LPVOID)(concatenated 0x+MemoryAddress), &ValueOfAddress, sizeof(ValueOfAddress), 0);
    printf("Value Of Address %? Is %d", (concatenated 0x+MemoryAddress), ValueOfAddress);
    return 0;
}

Мне нужно объединить 0x с адресом памяти, который я нахожу через ReadProcessMemory (EG 0x0023DA44, 0x это 0x и 0023DA44 это то, из чего читается значениепамять).Спасибо за любую помощь :) извините, если это не имеет смысла, я не очень хорош в объяснении.По сути, мне нужно знать, как объединить типы данных DWORD, чтобы получить переменную типа адреса памяти.Любая помощь, если высоко ценится!

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Если я правильно понял, вы хотите преобразовать значение из строки, содержащей, например, "DEADBEEF", в целочисленное значение 0xDEADBEEF?Вы ищете семейство функций strtol.

void *ptr = (void *)strtoull("DEADBEEF", NULL, 16);

Затем вы можете сделать:

ReadProcessMemory(handle, ptr, &ValueOfAddress, sizeof(ValueOfAddress), 0);
printf("Value Of Address %p Is %d", ptr, ValueOfAddress);

Обратите внимание, что в этом коде нет проверки ошибок (в частности, выдолжен проверить, что значение вписывается в указатель и строка является действительной шестнадцатеричной).

0 голосов
/ 18 октября 2018

Конкатенация не требуется.

0x в этом контексте - просто префикс, применяемый к числовой константе, чтобы указать, что данное значение имеет шестнадцатеричный формат.Какое бы значение не было присвоено MemoryAddress (который, как я предполагаю, является типом указателя), действительно для передачи в качестве второго параметра в ReadProcessMemory само по себе.

0 голосов
/ 18 октября 2018

Данные в переменной MemoryAddress являются указателем, а не строкой символов.Он должен быть преобразован в строку символов, прежде чем он может быть объединен с другими символами.C не выполняет это преобразование автоматически.

Функция printf() способна принимать указатели (и целые числа и другие типы чисел) и преобразовывать их в символы перед их печатью.Это то, что делают спецификаторы формата (например, %d означает «получить следующий параметр и преобразовать его из знака int в символы, а затем вставить символы в этот момент»).

Другими словами, вы можете сделать это:

printf("Value At Address %p Is %d", (void *)MemoryAddress, ValueOfAddress);

Проблема в том, что указатели в C являются абстрактными и не могут быть простыми числами (например, они могут состоять из двух частей, например «сегмент: смещение»);и то, как отображаются указатели, должно быть определено реализацией, чтобы код мог быть переносимым, и поскольку его реализация определена, он может использовать или не использовать шестнадцатеричный код, а может или не использовать префикс 0x (в зависимости от того, что чувствовал компилятор).

Другими словами;%p означает «получить следующий параметр и преобразовать его из пустого указателя в символы, используя все, что имеет смысл для конкретного типа процессора, а затем вставить символы в этой точке».

Чтобы указатель былодиночное число и заставить printf() отобразить это единственное число в шестнадцатеричном формате (без суффикса 0x);если вы используете C99 (или более позднюю версию), вы можете #include <inttypes.h> и сделать это:

printf("Value At Address " PRIXPTR " Is %d", (uintptr_t)MemoryAddress, ValueOfAddress);

Теперь мы вернулись к исходной проблеме - как объединить суффикс 0x?C не поддерживает внутреннюю конкатенацию во время выполнения (например, вам нужно использовать функции библиотеки, связанные со строками - например, strcat()), и поддерживает только внутреннюю конкатенацию строк во время компиляции;и преобразование MemoryAddress в символы, а затем объединение с strcat() и последующая печать объединенной строки будет грязным.Самое простое решение состоит в том, чтобы избежать конкатенации и вместо этого поместить 0x в строку формата, например:

printf("Value At Address 0x" PRIXPTR " Is %d", (uintptr_t)MemoryAddress, ValueOfAddress);
...