Как восстановить структуру C с учетом содержимого памяти?

#c #struct #gdb

#c #структура #gdb

Вопрос:

Учитывая некоторое содержимое памяти (например, из gdb) Я хотел бы восстановить содержимое структуры C. Определяется struct следующим образом (см. man semop):

 unsigned short sem_num;  /* semaphore number */
short          sem_op;   /* semaphore operation */
short          sem_flg;  /* operation flags */
  

и содержимое памяти (как указано адресом структуры с использованием отладчика) выглядит следующим образом:

 00000000  00 00 ff ff 00 10 78 bd  21 0a 8c c8 24 0a c4 95  |......x.!...$...|
00000010  5e 09 d0 69 22 08 18 78  c9 bf ed f4 28 08 00 00  |^..i"..x....(...|
00000020  00 00 01 00 00 00 01 00  00 00 00 00 00 00 01 00  |................|
  

Каковы значения sem_num , sem_op и sem_flag ? Можно ли с уверенностью предположить, что первая переменная использует один байт, в то время как две другие используют по два байта каждый? Могу ли я затем выполнить только следующее сопоставление?

 sem_num = 00
sem_op  = 00 ff
sem_flg = ff 00
  

Комментарии:

1. Зачем unsigned short использовать один байт, а short использовать два байта?

2. Также рассмотрите заполнение структуры и порядковый номер.

3. Вам не нужно обращаться к исходному коду memcpy в структуру. Просто переопределите структуру в своем тестовом коде, создайте массив байтов с правильными байтами, перепишите его, затем посмотрите на значения в структуре. Если вы используете ту же платформу и компилятор, это должно работать хорошо.

4. @Dirk: Вы имеете в виду, что я должен написать по существу однострочный тестовый код на C, скомпилировать и запустить его, и проверить, как в нем выглядит память, а затем перепроектировать содержимое для реального случая?

5. @Alex, я бы немного предположил и сказал sem_num = 0x0000 (2 bytes), sem_op = 0xffff(ie -1) and sem_flg = 0x0010 . Если вы случайно знаете, какое значение было определено после этого в программе, вы можете проверить последующие значения (0x210a .. ) на соответствие этому.

Ответ №1:

Следуя предложению Dark Falcon, следующий код, похоже, выполняет эту работу:

 #include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int
main (void)
{
  struct sembuf my_sembuf[1]= {
    {0,-1,16*256}
  };

  unsigned char data[sizeof my_sembuf];
  size_t i;
  memcpy(data, amp;my_sembuf, sizeof my_sembuf);
  for (i=0; i < sizeof my_sembuf;   i)
    printf("xn", data[i]);
 return 0;
}
  

Включение гарантирует semop , что структура уже определена, которую необходимо заполнить и сравнить с дампом памяти. Оказывается, содержимое структуры semop должно быть следующим:

 unsigned short sem_num = 0;
short          sem_op  = -1;
short          sem_flg = 16*256; /* Corresponding to the flag SEM_UNDO */