Объединить 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);