PDBRipper

Тема в разделе "WASM.PROJECTS", создана пользователем hors, 23 ноя 2011.

  1. hors

    hors New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2010
    Сообщения:
    21
    Написал утилиту, может кому пригодится.

    Много людей, изучавших внутреннее устройство Windows, пользовались программой pdbdump для извлечения информации из файлов отладочной информации. Но к сожалению программа pdbdump создает некорректные заголовочные файлы( в частности не распознает unions http://www.wasm.ru/forum/viewtopic.php?pid=328285#p328285 ). Мне надоело вручную править структуры и поэтому я решил написать программу, генерирующую правильные структуры. Утилита не является полноценной заменой pdbdump/DIA2Dump. Так как pdbdump/DIA2Dump показывает ВСЕ отладочные символы( включая например названия меток ), а моя программа только те, которые можно будет использовать в своих заголовочных файлах( структуры, объединения, перечисления ).

    Итак PDBRipper: http://ntinfo.biz/index.php/pdbripper

    Для сравнения структура _LDR_DATA_TABLE_ENTRY:

    pdbdump:

    Код (Text):
    1. struct _LDR_DATA_TABLE_ENTRY {
    2.  
    3.   // static data ------------------------------------
    4.  
    5.   // non-static data --------------------------------
    6.   /*<thisrel this+0x0>*/ /*|0x8|*/ struct _LIST_ENTRY InLoadOrderLinks;
    7.   /*<thisrel this+0x8>*/ /*|0x8|*/ struct _LIST_ENTRY InMemoryOrderLinks;
    8.   /*<thisrel this+0x10>*/ /*|0x8|*/ struct _LIST_ENTRY InInitializationOrderLinks;
    9.   /*<thisrel this+0x18>*/ /*|0x4|*/ void* DllBase;
    10.   /*<thisrel this+0x1c>*/ /*|0x4|*/ void* EntryPoint;
    11.   /*<thisrel this+0x20>*/ /*|0x4|*/ unsigned long SizeOfImage;
    12.   /*<thisrel this+0x24>*/ /*|0x8|*/ struct _UNICODE_STRING FullDllName;
    13.   /*<thisrel this+0x2c>*/ /*|0x8|*/ struct _UNICODE_STRING BaseDllName;
    14.   /*<thisrel this+0x34>*/ /*|0x4|*/ unsigned long Flags;
    15.   /*<thisrel this+0x38>*/ /*|0x2|*/ unsigned short LoadCount;
    16.   /*<thisrel this+0x3a>*/ /*|0x2|*/ unsigned short TlsIndex;
    17.   /*<thisrel this+0x3c>*/ /*|0x8|*/ struct _LIST_ENTRY HashLinks;
    18.   /*<thisrel this+0x3c>*/ /*|0x4|*/ void* SectionPointer;
    19.   /*<thisrel this+0x40>*/ /*|0x4|*/ unsigned long CheckSum;
    20.   /*<thisrel this+0x44>*/ /*|0x4|*/ unsigned long TimeDateStamp;
    21.   /*<thisrel this+0x44>*/ /*|0x4|*/ void* LoadedImports;
    22.   /*<thisrel this+0x48>*/ /*|0x4|*/ struct _ACTIVATION_CONTEXT* EntryPointActivationContext;
    23.   /*<thisrel this+0x4c>*/ /*|0x4|*/ void* PatchInformation;
    24.   /*<thisrel this+0x50>*/ /*|0x8|*/ struct _LIST_ENTRY ForwarderLinks;
    25.   /*<thisrel this+0x58>*/ /*|0x8|*/ struct _LIST_ENTRY ServiceTagLinks;
    26.   /*<thisrel this+0x60>*/ /*|0x8|*/ struct _LIST_ENTRY StaticLinks;
    27.  
    28.   // base classes -----------------------------------
    29.  
    30.   // friends ----------------------------------------
    31.  
    32.   // static functions -------------------------------
    33.  
    34.   // non-virtual functions --------------------------
    35.  
    36.   // virtual functions ------------------------------
    37. };
    38. // <size 0x68>
    PDBRipper:

    Код (Text):
    1. struct _LDR_DATA_TABLE_ENTRY // Size=104
    2. {
    3.     struct _LIST_ENTRY InLoadOrderLinks; //Size=8 Offset=0
    4.     struct _LIST_ENTRY InMemoryOrderLinks; //Size=8 Offset=8
    5.     struct _LIST_ENTRY InInitializationOrderLinks; //Size=8 Offset=16
    6.     void * DllBase; //Size=4 Offset=24
    7.     void * EntryPoint; //Size=4 Offset=28
    8.     unsigned long SizeOfImage; //Size=4 Offset=32
    9.     struct _UNICODE_STRING FullDllName; //Size=8 Offset=36
    10.     struct _UNICODE_STRING BaseDllName; //Size=8 Offset=44
    11.     unsigned long Flags; //Size=4 Offset=52
    12.     unsigned short LoadCount; //Size=2 Offset=56
    13.     unsigned short TlsIndex; //Size=2 Offset=58
    14.     union
    15.     {
    16.         struct _LIST_ENTRY HashLinks; //Size=8 Offset=60
    17.         struct
    18.         {
    19.             void * SectionPointer; //Size=4 Offset=60
    20.             unsigned long CheckSum; //Size=4 Offset=64
    21.         };
    22.     };
    23.     union
    24.     {
    25.         unsigned long TimeDateStamp; //Size=4 Offset=68
    26.         void * LoadedImports; //Size=4 Offset=68
    27.     };
    28.     struct _ACTIVATION_CONTEXT * EntryPointActivationContext; //Size=4 Offset=72
    29.     void * PatchInformation; //Size=4 Offset=76
    30.     struct _LIST_ENTRY ForwarderLinks; //Size=8 Offset=80
    31.     struct _LIST_ENTRY ServiceTagLinks; //Size=8 Offset=88
    32.     struct _LIST_ENTRY StaticLinks; //Size=8 Offset=96
    33. };
    Возможны ошибки при работе с какими-нибудь классами с хитрыми виртуальными функциями, так как PDBRipper имеет назначение в первую очередь извлекать информацию из вот этих файлов: http://msdn.microsoft.com/en-us/windows/hardware/gg463028
    , а полноценную реализацию поддержки классов я пока не планирую(так как не вижу в этом смысла).

    У кого есть желание протестировать утилиту на разных файлах, отписаться об ошибках, предложить новые идеи, то всегда пожалуйста.
     
  2. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    hors, асм структуры забыли. делайте с расчетом на плагины.
     
  3. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Интересно, но у меня падает на XP SP3 x86 при попытке загрузить любой pdb, который я пробовал. Минидамп в аттаче, колстек вот:

    Код (Text):
    1. Executable search path is:
    2. Windows XP Version 2600 (Service Pack 3) MP (2 procs) Free x86 compatible
    3. Product: WinNt, suite: SingleUserTS
    4. Machine Name:
    5. Debug session time: Wed Nov 23 14:48:08.000 2011 (GMT+4)
    6. System Uptime: not available
    7. Process Uptime: 0 days 0:00:56.000
    8. ................................................................
    9. ...................
    10. This dump file has an exception of interest stored in it.
    11. The stored exception information can be accessed via .ecxr.
    12. (89c.d14): Access violation - code c0000005 (first/second chance not available)
    13. eax=00b22b52 ebx=0022fe64 ecx=77c1c2e3 edx=0022ceec esi=0022ceb8 edi=0000001c
    14. eip=00000000 esp=0022ce7c ebp=0022cf08 iopl=0         nv up ei pl nz na pe nc
    15. cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200206
    16. 00000000 ??              ???
    17.  
    18. 0:000> kv
    19.   *** Stack trace for last set context - .thread/.cxr resets it
    20. ChildEBP RetAddr  Args to Child              
    21. WARNING: Frame IP not in any known module. Following frames may be wrong.
    22. 0022ce78 004038bf 00b22b52 0000001c 0022ceec 0x0
    23. 0022cf08 004105b7 0022fe64 00000000 00000023 pdbripper+0x38bf
    24. 0022cf38 6a2c7575 0022fe64 00000000 00000023 pdbripper+0x105b7
    25. 0022cfc8 651098ac 003e9db8 65803640 00000001 QtCore4!ZN11QMetaObject8activateEP7QObjectPKS_iPPv+0x25d
    26. 0022d008 6510ada4 003e9db8 00000000 0022d048 QtGui4!ZN7QAction9triggeredEb+0x3c
    27. 0022d048 654cea76 003e9db8 00000000 ffffffff QtGui4!ZN7QAction8activateENS_11ActionEventE+0x60
    28. 0022d098 654d3fc8 00b11f30 0022d10c 003e9db8 QtGui4!ZNK5QMenu4iconEv+0x2aa
    29. 0022d128 654d4a16 00b11f30 003e9db8 00000000 QtGui4!ZN5QMenu10timerEventEP11QTimerEvent+0x694
    30. 0022d158 6515a1b8 00b11da0 0022d730 ffffffe4 QtGui4!ZN5QMenu17mouseReleaseEventEP11QMouseEvent+0xda
    31. 0022d2a8 654d60fc 00b11da0 0022d730 003e5284 QtGui4!ZN7QWidget5eventEP6QEvent+0x968
    32. 0022d338 6510fa38 00b11da0 0022d730 0022d730 QtGui4!ZN5QMenu5eventEP6QEvent+0x4c
    33. 0022d378 65118cbd 003e4f60 00b11da0 0022d730 QtGui4!ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent+0x8c
    34. 0022d638 6a2b425c 0022fe98 00b11da0 0022d730 QtGui4!ZN12QApplication6notifyEP7QObjectP6QEvent+0xafd
    35. 0022d688 651135bb 0022fe98 00b11da0 0022d730 QtCore4!ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent+0x60
    36. 0022d6d8 65176ffb 00b11da0 0022d730 00000000 QtGui4!ZN19QApplicationPrivate14sendMouseEventEP7QWidgetP11QMouseEventS1_S1_PS1_R8QPointerIS0_Eb+0x14f
    37. 0022d858 6517a897 00b11da0 0022dc1c 0022dddc QtGui4!ZN19QApplicationPrivate19translateTouchEventERK6tagMSG+0xdcb
    38. 0022ddf8 7e368734 00000000 00000001 7e368734 QtGui4!ZN19QApplicationPrivate27initializeWidgetPaletteHashEv+0x245b
    39. 0022de30 7e368816 65179f34 001f0af4 00000202 user32!InternalCallWinProc+0x28
    40. 0022de98 7e3689cd 00000000 65179f34 001f0af4 user32!UserCallWinProcCheckWow+0x150 (FPO: [Non-Fpo])
    41. 0022def8 7e368a10 0022fce4 00000000 0022fd18 user32!DispatchMessageWorker+0x306 (FPO: [Non-Fpo])
     
  4. hors

    hors New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2010
    Сообщения:
    21
    Four-F, спасибо, буду разбираться.
     
  5. hors

    hors New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2010
    Сообщения:
    21
    Проблема с WinXP SP3 решена. Начальный пост обновлен.
     
  6. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Теперь не падает, но для любого файла:
    Код (Text):
    1. Open File: c:\blah.pdb
    2. Cannot Open File: c:\blah.pdb
     
  7. hors

    hors New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2010
    Сообщения:
    21
    Спасибо, буду разбираться.
     
  8. hors

    hors New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2010
    Сообщения:
    21
    Исправлены ошибки. Начальный пост обновлён.
     
  9. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    ОК, работает. Огорчает использование тяжёлого фреймворка, при том, что функциональность гуя его совершенно не требует и вряд ли когда-нибудь потребует.
     
  10. hors

    hors New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2010
    Сообщения:
    21
    Просто это всё первоначально писалось на скорую руку, для себя. А так конечно можно было бы переписать GUI на чистом WinAPI.
     
  11. hors

    hors New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2010
    Сообщения:
    21
    Если кого-то заинтересует, то могу сделать вывод не только в С/С++ заголовочные файлы, но и в другие форматы, например ассемблер, но нужно тогда договориться, как это лучше представить, какой синтаксис. К примеру как лучше и корректнее представить перечисления, битовые структуры и т.д.