構造体のアドレスにアクセスできる場合は、少なくとも最初にそこにあるもののバイトダンプを取得できます。これが私が作った5分間のハックです:
#include <stdio.h>
typedef struct {
char c1;
char c2;
int i;
float f;
char *str;
} unknown;
void decode(unsigned char *address, int len) {
unsigned char *p = address;
for (; p < address + len ; p++) {
printf("Byte offset: %p\tByte: 0x%02X\tAscii: %c\n", p - address, *p, *p);
}
}
int main() {
unknown x;
int len = sizeof(unknown); /* or 13 like you've said the size is */
/* this would happen in whatever software
you're using to generate the struct */
x.c1 = 'h';
x.c2 = 'i';
x.i = 25;
x.f = 3.14;
x.str = "Hello";
printf("first x:\n");
decode((unsigned char*)(&x), len);
x.c1 = 'o';
x.c2 = 'l';
x.i = 255;
x.f = -9;
x.str = "Goodbye";
printf("second x:\n");
decode((unsigned char*)(&x), len);
return 0;
}
出力は次のとおりです。
最初の x:
バイト オフセット: (nil) バイト: 0x68 アスキー: h
バイト オフセット: 0x1 バイト: 0x69 アスキー: i
バイト オフセット: 0x2 バイト: 0xF3 アスキー:
バイト オフセット: 0x3 バイト: 0xB7 アスキー: �
バイト オフセット: 0x4 バイト: 0x19 アスキー:
バイト オフセット: 0x5 バイト: 0x00 アスキー:
バイト オフセット: 0x6 バイト: 0x00 アスキー:
バイト オフセット: 0x7 バイト: 0x00 アスキー:
バイト オフセット: 0x8 バイト: 0xC3 アスキー:
バイト オフセット: 0x9 バイト: 0xF5 アスキー:
バイト オフセット: 0xa バイト: 0x48 アスキー: H
バイト オフセット: 0xb バイト: 0x40 アスキー: @
バイト オフセット: 0xc バイト: 0xD8 アスキー:
バイト オフセット: 0xd バイト: 0x85 アスキー: �
バイト オフセット: 0xe バイト: 0x04 アスキー:
バイト オフセット: 0xf バイト: 0x08 アスキー:
2 番目の x:
バイト オフセット: (nil) バイト: 0x6F Ascii: o
バイト オフセット: 0x1 バイト: 0x6C アスキー: l
バイト オフセット: 0x2 バイト: 0xF3 アスキー:
バイト オフセット: 0x3 バイト: 0xB7 アスキー: �
バイト オフセット: 0x4 バイト: 0xFF アスキー: �
バイト オフセット: 0x5 バイト: 0x00 アスキー:
バイト オフセット: 0x6 バイト: 0x00 アスキー:
バイト オフセット: 0x7 バイト: 0x00 アスキー:
バイト オフセット: 0x8 バイト: 0x00 アスキー:
バイト オフセット: 0x9 バイト: 0x00 アスキー:
バイト オフセット: 0xa バイト: 0x10 アスキー:
バイト オフセット: 0xb バイト: 0xC1 アスキー:
バイト オフセット: 0xc バイト: 0xE7 アスキー:
バイト オフセット: 0xd バイト: 0x85 アスキー: �
バイト オフセット: 0xe バイト: 0x04 アスキー:
バイト オフセット: 0xf バイト: 0x08 アスキー:
私が使用している仮定は、データへの入力が何であるかを知っているということですが、レイアウトが何であるか、または必然的にそこに何が含まれているかを知らないだけです。
そこに何が入っているかを知っていても、これはかなり難しいです。明らかに、s は最もchar
簡単にデコードできます。最初に「hi」から「ol」に変わったことがわかります。
次は int で、25 から 255 に変化します。オフセット 0x4 に 0x19 と 0xff の 2 つの値がありますが、残りのバイトはどこにあるのでしょうか? 0x5-0x7 ですか (int が「後方」に格納されていることを示唆しています)? そうかもしれませんし、おそらくオフセット 0x2-0x3 は、使用した 1 バイト文字の単なるパディングです (C 構造体には、ワード サイズに応じたアライメントがあります)。
それから浮動小数点数があります。浮動小数点数が内部でどのようにエンコードされているかは本当にわかりません。そのため、その違いを推測するつもりさえありません。おそらくIEEE標準を調べることができます。
最後に、ポインターで閉じます。その構造体にポインターがある場合は、プログラムをセグメンテーション フォールトせずに、それらのメモリ アドレスを調べて調べる必要があります。それらは他の構造体へのポインターである可能性があり、その場合、このプロセスを繰り返す喜びがあります。
私が言ったように、これは私の5分間のテイクであり、実際にこれを試したことはありません. これは主に私の最初の推測でした。既知の入力から始めて、構造体に格納されているデータ型と対応するバイト オフセットを特定できるまで、一度に 1 つずつ変更します。