Обрабатывать неподписанный адрес int как указатель и разыменовывать его как байтовый массив

Итак, у меня есть unsigned int переменная с адресом десятичного значения, скажем, unsigned int var = 1232342что я пытаюсь сделать, не зная тип переменной но зная его размер и адрес, где он хранится, получите значения как byte array, Например, допустим, у меня есть int var = 20 с его адресом и байтом. Я хочу иметь возможность перейти по этому адресу и вернуть байтовый массив, в этом случае [00001100] и то же самое для char переменные и данные члены структуры.

Немного псевдокода будет что-то вроде:

for var.address until var.address = var.address + bytesize
do
byte_array = *var.address
var.address++

Я столкнулся с некоторыми проблемами, хотя я немного новичок в C, поэтому я не знаю, как трактовать неподписанный int как адрес / указатель. Во-вторых, я не знаю, как получить действительные байты из адреса, всякий раз, когда я разыменовываю адрес, получаю его фактическое значение, но это если я знаю тип переменной.

Немного предыстории: Я работаю над инструментом Pin, который дает мне возможность подключиться к запущенному процессу, затем я использую информацию DWARF и ELF. Таким образом, у меня есть доступ к виртуальной памяти, к которой я пытаюсь получить доступ

0

Решение

Посмотрите на hexdump функция по epatel Вот

Готовый C ++ шестнадцатеричный код дампа

Несмотря на название, это действительно Си-код. Я скопирую это здесь для вашего удобства

#include <ctype.h>
#include <stdio.h>

void hexdump(void *ptr, int buflen) {
unsigned char *buf = (unsigned char*)ptr;
int i, j;
for (i=0; i<buflen; i+=16) {
printf("%06x: ", i);
for (j=0; j<16; j++)
if (i+j < buflen)
printf("%02x ", buf[i+j]);
else
printf("   ");
printf(" ");
for (j=0; j<16; j++)
if (i+j < buflen)
printf("%c", isprint(buf[i+j]) ? buf[i+j] : '.');
printf("\n");
}
}
0

Другие решения

«а» — это адрес, с которого вы хотите получить 4 байта. «байты» — это место, где вы хотите сохранить свои результаты. Я назначил адрес «i» на «a», затем прочитал 4 байта с этого адреса.

#include <stdio.h>
int main(int argc, char *argv[]) {
unsigned char bytes[4];
int i = 65535, j;
unsigned long a = (unsigned long) &i;

for (j = 0; j < 4; j++) {
bytes[j] = *((unsigned char*) a + j);
}

for (j = 0; j < 4; j++) {
printf("bytes[%d]: %d\n", j, bytes[j]);
}
}
0

По вопросам рекламы [email protected]