Попытка просмотреть структуру _FILE_ID_BOTH_DIR_INFORMATION в памяти с WinDbg - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь просмотреть структуру файловой системы Windows _FILE_ID_BOTH_DIR_INFORMATION в памяти, используя WinDbg, но по какой-то причине он сообщает мне, что символ не найден.

Я подключил WinDbg с помощью канала к Windows XPвиртуальная машина для отладки ее ядра. Я попытался просмотреть данные структуры с помощью команды dt _FILE_ID_BOTH_DIR_INFORMATION esi, поскольку значение ESI - это адрес, который содержит рассматриваемую структуру, которую я хочу проверить.

Все, что я получил, было следующим выводом:

3: kd> dt _FILE_ID_BOTH_DIR_INFORMATION esi
*************************************************************************
***                                                                   ***
***                                                                   ***
***    Either you specified an unqualified symbol, or your debugger   ***
***    doesn't have full symbol information.  Unqualified symbol      ***
***    resolution is turned off by default. Please either specify a   ***
***    fully qualified symbol module!symbolname, or enable resolution ***
***    of unqualified symbols by typing ".symopt- 100". Note that     ***
***    enabling unqualified symbol resolution with network symbol     ***
***    server shares in the symbol path may cause the debugger to     ***
***    appear to hang for long periods of time when an incorrect      ***
***    symbol name is typed or the network symbol server is down.     ***
***                                                                   ***
***    For some commands to work properly, your symbol path           ***
***    must point to .pdb files that have full type information.      ***
***                                                                   ***
***    Certain .pdb files (such as the public OS symbols) do not      ***
***    contain the required information.  Contact the group that      ***
***    provided you with these symbols if you need this command to    ***
***    work.                                                          ***
***                                                                   ***
***    Type referenced: _FILE_ID_BOTH_DIR_INFORMATION                 ***
***                                                                   ***
*************************************************************************
Symbol _FILE_ID_BOTH_DIR_INFORMATION not found.

У меня работают другие структуры, такие как _DRIVER_OBJECT.

Все, что я знаю о символе _FILE_ID_BOTH_DIR_INFORMATION, это то, что он включен в ntifs.h, согласно документации Microsoft. Не удалось найти информацию о том, предоставляется ли этот символ с сервера Microsoft Symbol.

1 Ответ

2 голосов
/ 07 октября 2019

нет, похоже, эта информация о типе недоступна в общедоступных pdbs, предоставленных ms

, вы можете проверить себя, используя подстановочные знаки

0: kd> dt nt!*_FILE_*
          ntkrnlmp!_FILE_INFORMATION_CLASS
          ntkrnlmp!_FILE_OBJECT
          ntkrnlmp!_PF_FILE_ACCESS_TYPE
          ntkrnlmp!_FILE_SEGMENT_ELEMENT
          ntkrnlmp!_IOP_FILE_OBJECT_EXTENSION
          ntkrnlmp!_CREATE_FILE_TYPE
          ntkrnlmp!_FILE_OBJECT_EXTENSION_TYPE
          ntkrnlmp!_DUMMY_FILE_OBJECT
          ntkrnlmp!_IMAGE_FILE_HEADER
          ntkrnlmp!_FILE_BASIC_INFORMATION
          ntkrnlmp!_FILE_GET_QUOTA_INFORMATION
          ntkrnlmp!_FILE_NETWORK_OPEN_INFORMATION
          ntkrnlmp!_MMPAGE_FILE_EXPANSION
          ntkrnlmp!_FILE_STANDARD_INFORMATION
          ntkrnlmp!_MAPPED_FILE_SEGMENT
          ntkrnlmp!_MMPAGE_FILE_EXPANSION_FLAGS
          ntkrnlmp!_MI_PAGING_FILE_SPACE_BITMAPS
0: kd> dt nt!*_FILE_I*
          ntkrnlmp!_FILE_INFORMATION_CLASS

, так как для их просмотра вы можете просматривать необработанное содержимоепамяти просто сделайте dd @esi и сопоставьте их со структурой в ntifs.h

или используйте .printf, а некоторые находят замену в блокноте для печати форматированного вывода

Я просто скопировал и вставил структуруИз Документация в блокнот ++
вставил .printf впереди, используя find replace
вставил \ t% x в конце, используя ту же процедуру
настроил смещения вPseudoRegister и сохранил его как .txt

использовал $$> a <, чтобы запустить его как скрипт windbg, предоставляющий случайное смещение для псевдорегистра (просто убедившись, что есть некоторая строка Unicode со смещением + 0x48, результатыкак показано ниже </p>

r $t0 = (fffff805`19ec53e0-48)

.printf "typedef struct _FILE_ID_BOTH_DIR_INFORMATION {                             \n"
.printf "  ULONG         NextEntryOffset;                                           \t%x\n"  , @$t0+0
.printf "  ULONG         FileIndex;                                                 \t%x\n"  , @$t0+4
.printf "  LARGE_INTEGER CreationTime;                                              \t%N\n"  , @$t0+8
.printf "  LARGE_INTEGER LastAccessTime;                                            \t%N\n"  , @$t0+10
.printf "  LARGE_INTEGER LastWriteTime;                                             \t%N\n"  , @$t0+18
.printf "  LARGE_INTEGER ChangeTime;                                                \t%N\n"  , @$t0+20
.printf "  LARGE_INTEGER EndOfFile;                                                 \t%N\n"  , @$t0+28
.printf "  LARGE_INTEGER AllocationSize;                                            \t%N\n"  , @$t0+30
.printf "  ULONG         FileAttributes;                                            \t%x\n"  , @$t0+38
.printf "  ULONG         FileNameLength;                                            \t%x\n"  , @$t0+3c
.printf "  ULONG         EaSize;                                                    \t%x\n"  , @$t0+40
.printf "  CCHAR         ShortNameLength;                                           \t%x\n"  , @$t0+44
.printf "  WCHAR         ShortName[12];                                             \t%mu\n" , @$t0+48
.printf "  LARGE_INTEGER FileId;                                                    \t%N\n"  , @$t0+54
.printf "  WCHAR         FileName[1];                                               \t%mu\n" , @$t0+58
.printf "} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;            \n"

результаты

0: kd> $$>a< f:\wdscr\fileid.wds
typedef struct _FILE_ID_BOTH_DIR_INFORMATION {                              
  ULONG         NextEntryOffset;                                                19ec5398
  ULONG         FileIndex;                                                      19ec539c
  LARGE_INTEGER CreationTime;                                                   FFFFF80519EC53A0
  LARGE_INTEGER LastAccessTime;                                             FFFFF80519EC53A8
  LARGE_INTEGER LastWriteTime;                                                  FFFFF80519EC53B0
  LARGE_INTEGER ChangeTime;                                                 FFFFF80519EC53B8
  LARGE_INTEGER EndOfFile;                                                      FFFFF80519EC53C0
  LARGE_INTEGER AllocationSize;                                             FFFFF80519EC53C8
  ULONG         FileAttributes;                                             19ec53d0
  ULONG         FileNameLength;                                             19ec53d4
  ULONG         EaSize;                                                     19ec53d8
  CCHAR         ShortNameLength;                                                19ec53dc
  WCHAR         ShortName[12];                                                  KeRevertToUserGroupAffinityThread
  LARGE_INTEGER FileId;                                                     FFFFF80519EC53EC
  WCHAR         FileName[1];                                                    ToUserGroupAffinityThread
} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;            
...