Объединить DWORD

Я хотел бы объединить 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 (например, 0x0023DA44, 0x - 0x, а 0023DA44 - то, что значение считывается из памяти). Спасибо за любую помощь:) извините, если это не имеет смысла, я не очень хорош в объяснении. В основном мне нужно знать, как объединить типы данных DWORD, чтобы получить переменную типа адреса памяти. Любая помощь, если высоко ценится!

3 ответа

Решение

Если я правильно понял, вы хотите преобразовать значение из строки, содержащей, например, "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);

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

Вам не нужно делать какие-либо объединения.

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

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

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

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

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

Проблема в том, что указатели в C являются абстрактными и не могут быть простым числом (например, они могут быть двумя частями, например, "gment:offset"); и то, как отображаются указатели, должно быть определено реализацией, чтобы код мог быть переносимым, и поскольку его реализация определена, он может использовать или не использовать шестнадцатеричный код, а может или не использовать 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);
Другие вопросы по тегам