1

したがって、unsigned int10進値のアドレスが格納されている変数があります。たとえば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に少し慣れていないので、unsignedintをアドレス/ポインターとして扱う方法がわかりません。次に、アドレスから実際のバイトを取得する方法がわかりません。アドレスを逆参照するたびに、取得するのは実際の値ですが、それは変数の型を知っている場合です。

少し背景: 実行中のプロセスにフックするオプションを提供するPinというツールに取り組んでおり、DWARFとELFの情報を使用しています。だから私はアクセスしようとしている仮想メモリ空​​間にアクセスできます

4

2 に答える 2

1

ここでepatelhexdumpによる関数を見てください

市販の C++ 16 進ダンプ コード

タイトルにもかかわらず、実際には 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");
  }
}
于 2012-09-27T03:09:55.523 に答える
1

「a」は、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]);
    }
}
于 2012-09-26T22:48:41.193 に答える