.mdmp -> ida/ghidra

Тема в разделе "WASM.RESEARCH", создана пользователем sn0w, 3 фев 2024.

  1. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    Всем привет. Кто-нибудь пилил такую штуку, чтобы запарсить данные с минидампа/фуллдампа и продукт скормить иде или гидре (грубо говоря, - образ конкретного модуля из адресного пространства)? поделитесь опытом, пожалуйста :)
     
  2. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    315
  3. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.941
    Есть наскоро зачем-то сделанный vbs-скрипт, который windbg'ом видимо че-то вытаскивает из дампа. Не помню зачем.
    Код (Text):
    1. sNtkdCmd = chr(34) & "C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\ntkd" & chr(34) & " -y c:\symbols -i c:\windows\i386"
    2.  
    3. set wshell = CreateObject("WScript.Shell")
    4. set fso = CreateObject("Scripting.FileSystemObject")
    5. set directory = fso.GetFolder(".").Files
    6. for each file in directory
    7.     if lcase(fso.getextensionname(file.path)) = "dmp" then
    8.         set oexec = wshell.exec(sNtkdCmd & " -z " & chr(34) & file.path & chr(34) & " -c " & chr(34) & "!address;q" & chr(34) & " -logo " & chr(34) & "~temp.txt" & chr(34))
    9.         do while oexec.status = 0
    10.             wscript.sleep 10
    11.         loop
    12.         set oexec = nothing
    13.         if fso.fileexists("~temp.txt") then
    14.             last_range_address_hi = 0
    15.             set oTempFile = fso.OpenTextFile("~temp.txt",1)
    16.             do until oTempFile.AtEndOfStream
    17.                 line = oTempFile.readline
    18.                 if mid(line,10,2) = "0`" then
    19.                     range_address_lo = cdbl("&h"&mid(line,12,8))
    20.                     range_address_hi = cdbl("&h"&mid(line,30,8))
    21.                     if range_address_lo < last_range_address_hi then
    22.                         range_address_lo = last_range_address_hi
    23.                     end if
    24.                     if ((range_address_hi - range_address_lo) < &h1000000) and (range_address_lo < range_address_hi) then
    25.                         do until range_address_lo >= range_address_hi
    26.                             current_range_size = ((range_address_lo + &hFFFFF) and not &hFFFFF) - range_address_lo
    27.                             if current_range_size = 0 then
    28.                                 current_range_size = &h100000
    29.                             end if
    30.                             if range_address_lo = &h7FF00000 then
    31.                                 current_range_size = &hFFFFF
    32.                             end if
    33.                             wscript.stdout.write "+last_range_address_hi=" & right("00000000" & hex(last_range_address_hi),8) & " current_range_size=" & right("00000000" & hex(current_range_size),8) & " " & right("00000000" & hex(range_address_lo),8) & " " & right("00000000" & hex(range_address_hi),8)
    34.                             wscript.stdout.writeline "   " & fso.getbasename(file.name) & "_" & right("00000000" & hex(range_address_lo),8) & "_" & right("00000000" & hex(range_address_lo+current_range_size),8) & ".bin"
    35.                            
    36.                             set oexec = wshell.exec(sNtkdCmd & " -z " & chr(34) & file.path & chr(34) & " -c " & chr(34) & ".writemem " & fso.getbasename(file.name) & "_" & right("00000000" & hex(range_address_lo),8) & "_" & right("00000000" & hex(range_address_lo+current_range_size),8) & ".bin " & right("00000000" & hex(range_address_lo),8) & " L " & right("00000000" & hex(current_range_size),8) & ";q" & chr(34))
    37.                             do while oexec.status = 0
    38.                                 wscript.sleep 10
    39.                             loop
    40.                             set oexec = nothing
    41.                             range_address_lo = range_address_lo + current_range_size
    42.                         loop
    43.                         last_range_address_hi = range_address_lo
    44.                     end if
    45.                 end if
    46.             loop
    47.             set oTempFile = nothing
    48.         end if
    49.     end if
    50. next
     
    sn0w нравится это.
  4. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    мерси! мне главное-то - концепт
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.327
    В смысле "обещает"? Оно уже давно там есть.

    И вообще. у минидампа крайне простой формат (https://learn.microsoft.com/en-us/windows/win32/debug/minidump-files), можно и самому что-то написать. Хотя о чем это я? Найти на гитхабе, конечно же :)
     
    sn0w нравится это.
  6. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    меня просто смутил момент с символами в покемоне, там где вопросы. хотя настроены верно (и в _NT_SYMBOL_PATH и в самом прокмоне). ида всё хавает, symchk - качает, а прокмон - нет, почемуто. впрочем затем выяснил что и нужные хидеры и интерфейсы есть в винките :/

    может кто встречался с этой фигнёй с символами? как решали?
    [​IMG]
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Гидра кстати меня не оч впечатлила. После много лет в IDA, не так давно пользовался гидрой. С точки зрения дизасма и удобства реверса - IDA лучше, на мой взгляд. Ида иногда подбешивает если попадается прога на MFC и часто вместо норм вызовов она пишет какюу нить ересть в виде
    upload_2024-2-3_22-56-33.png
    Вместо норм вызова MFC на подобие MFC_GetString и тд
     
  8. Marylin

    Marylin Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    92
    Думаю перед там-как самому читать из дампов инфу, нужно ознакомится с их содержимым и посмотреть, что сбрасывает в логи например тот-же WinDbg. У него-же есть для этого спец.расшинение !analyze. Он может парсить как крэш-дампы бсодов, так и сброшенные из системного "диспетчера-задач" дампы обычных прог. Нужно сказать, что инфы там предостаточно, чтобы сделать выводы: по Ctrl+D выбираем файл-дампа из папки Win\Minidump, после чего запрашиваем расширение "!analyze". Более подробно здесь: https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/using-the--analyze-extension

    Код (Text):
    1. Microsoft (R) Windows Debugger Version 6.12.0002.633 AMD64
    2. Loading Dump File [C:\Windows\Minidump\101723-37830-01.dmp]
    3. Mini Kernel Dump File: Only registers and stack trace are available
    4.  
    5. Loading Kernel Symbols
    6. ..............................................................
    7. ................................................................
    8. ....................................
    9. Loading User Symbols
    10. Loading unloaded module list
    11. ................
    12.  
    13. *******************************************************************************
    14. *                        Bugcheck Analysis                                    *
    15. *******************************************************************************
    16. Use !analyze -v to get detailed debugging information.
    17.  
    18. BugCheck 3B, {c0000096, fffff88005ae5b15, fffff88005d41f20, 0}
    19. Unable to load image C:\Windows\system32\Drivers\RwDrv.sys, Win32 error 0n2
    20. Probably caused by : RwDrv.sys ( RwDrv+2b15 )
    21.  
    22. 0: kd> !analyze -v
    23. *******************************************************************************
    24. *                        Bugcheck Analysis                                    *
    25. *******************************************************************************
    26.  
    27. SYSTEM_SERVICE_EXCEPTION (3b)
    28. An exception happened while executing a system service routine.
    29.  
    30. Arguments:
    31. Arg1: 00000000c0000096,  Exception code that caused the bugcheck
    32. Arg2: fffff88005ae5b15,  Address of the instruction which caused the bugcheck
    33. Arg3: fffff88005d41f20,  Address of the context record for the exception that caused the bugcheck
    34. Arg4: 0000000000000000,  zero.
    35.  
    36. Debugging Details:
    37. ------------------
    38.  
    39. ADDITIONAL_DEBUG_TEXT:
    40. Use '!findthebuild' command to search for the target build information.
    41. If the build information is available, run '!findthebuild -s ; .reload' to set symbol path and load symbols.
    42.  
    43. MODULE_NAME    :  RwDrv
    44. FAULTING_MODULE:  fffff80002c17000 nt
    45. EXCEPTION_CODE : (NTSTATUS) 0xc0000096 - {
    46. FAULTING_IP    :  RwDrv + 2b15
    47.  
    48. fffff880`05ae5b15  0f32            rdmsr
    49.  
    50. CONTEXT:  fffff88005d41f20 -- (.cxr 0xfffff88005d41f20)
    51. rax=0000000000000000  rbx=0000000000000002  rcx=00000000000001f2
    52. rdx=0000000000000000  rsi=00000000380dcb0f  rdi=000000009c5a203a
    53. rip=fffff88005ae5b15  rsp=fffff88005d42900  rbp=fffffa80034045a0
    54. r8=fffffa8003d85380   r9=000000000000000e  r10=fffff80002e069a0
    55. r11=fffffa8003d85380  r12=0000000000000000  r13=0000000000000000
    56. r14=fffffa80034046b8  r15=0000000000000000
    57. iopl=0         nv up ei pl zr na po nc
    58. cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b  efl=00010246
    59.  
    60. Resetting default scope
    61. CUSTOMER_CRASH_COUNT:  1
    62. DEFAULT_BUCKET_ID   :  VISTA_DRIVER_FAULT
    63. BUGCHECK_STR        :  0x3B
    64. CURRENT_IRQL        :  0
    65. LAST_CTRL_TRANSFER  :  from 0000000000000000  to fffff88005ae5b15
    66.  
    67. STACK_TEXT:
    68. fffff880`05d42900 00000000`00000000 : 00000000`00000000  00000000`00000000  00000000`00000000  00000000`00000000 : RwDrv+0x2b15
    69.  
    70. SYMBOL_STACK_INDEX:  0
    71. SYMBOL_NAME       :  RwDrv + 2b15
    72. FOLLOWUP_NAME     :  MachineOwner
    73. IMAGE_NAME        :  RwDrv.sys
    74. STACK_COMMAND     :  .cxr 0xfffff88005d41f20 ; kb
    75. BUCKET_ID         :  WRONG_SYMBOLS
    Структура файлов *.dmp есть здесь-же, остаётся лишь написать утилиту:
    https://wasm.in/blogs/description-of-dmp-format.505/
     
    sn0w нравится это.
  9. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    315
    импорт по ординалам, вестимо
    я в таких случаях скриптом пользуюсь, бежит по БД Ида и заменяет на user-frienly имена (берутся с .def файлов MFCxxx)
     
  10. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    alex_dz, ага да приходистя . хотя казалось бы что мешало внедрить в саму иду
     
  11. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    315
    слишкмо много гуана наплодила месе
    сколько епох MFC в мире? x32, x64, с недавних пор еще и АРМ туда прицепился
    + постоянно меняют/добавляют/удаляют функи - кому охота с етим дермецом гнаться :)
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    да - но мфс до сих пор часто встречаются. И чаще всего просят не снять защиту а разревестить какой нить алгос или формат данных ))) но я согласен с вами - УГ