Современные технологии дампинга и защиты от него

Тема в разделе "WASM.NT.KERNEL", создана пользователем skyproc, 27 ноя 2011.

  1. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Почитал тут статью
    http://www.wasm.ru/article.php?article=dumping
    но так как и с Kernel mode и с английским я на ВЫ, синий экран не даёт жить спокойно.

    Собственно нужно сделать дамп главного треда User Mode приложения
    Беру PID, получаю hProcess а дальше

    Код (Text):
    1. void CopyProcessMem(HANDLE hProcess, PVOID SrcAddr, PVOID DstAddr, ULONG *Size)
    2. {
    3.     PEPROCESS process = NULL;
    4.     NTSTATUS  st;
    5.     PUCHAR pMem = NULL;
    6.     ULONG Addr, Bytes;
    7.     PUCHAR cPtr, dPtr;
    8.     KAPC_STATE ApcState;
    9.  
    10.     st = ObReferenceObjectByHandle(hProcess, 0, NULL, UserMode, &process, NULL);
    11.  
    12.     if (NT_SUCCESS(st))
    13.     {  
    14.         Bytes = *Size;
    15.         pMem = ExAllocatePool(NonPagedPool, Bytes);
    16.         dPtr = pMem;
    17.  
    18.         cPtr = (PUCHAR)SrcAddr;
    19.  
    20.         KeStackAttachProcess(process, &ApcState);
    21.    
    22.         __try
    23.         {
    24.             while (Bytes)
    25.             {
    26.                 *dPtr = *cPtr;
    27.                 cPtr++;
    28.                 dPtr++;
    29.                 Bytes --;
    30.             }
    31.         }
    32.  
    33.         __except(EXCEPTION_EXECUTE_HANDLER)
    34.         {
    35.         }
    36.  
    37.         KeUnstackDetachProcess(&ApcState);
    38.  
    39.         Bytes = *Size - Bytes;
    40.  
    41.         __try
    42.         {
    43.             memcpy(DstAddr, pMem, Bytes);
    44.             *Size = Bytes;
    45.         }
    46.         __except(EXCEPTION_EXECUTE_HANDLER)
    47.         {
    48.         }
    49.  
    50.         ExFreePool(pMem);
    51.  
    52.         ObDereferenceObject(process);
    53.     }
    54.     return;
    55. }
    Где собственно и появляется синий экран
    Что должно быть здесь?
    Код (Text):
    1. PVOID SrcAddr, PVOID DstAddr
    И как выделять память
    Просьба ссылками не Бросаться!
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А можно !analyze -v?

    И хотелось бы знать, выделена ли память по адресу DstAddr?
     
  3. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    ExAllocatePool(NonPagedPool, 1024);

    Я ж говорю я хз как память выделять то

    и что это за шляпа?
    !analyze -v?
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Size == 1024?

    '!analyze -v' -- команда WinDbg, анализирующая minidump. Ну или как вариант можно minidump сюда выложить, кто-нибудь посмотрит.
     
  5. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Size = 100
    это критично
    с дампом буду разбираться
     
  6. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Код (Text):
    1. Microsoft (R) Windows Debugger Version 6.11.0001.404 X86
    2. Copyright (c) Microsoft Corporation. All rights reserved.
    3.  
    4.  
    5. Loading Dump File [C:\WINDOWS\Minidump\Mini112811-03.dmp]
    6. Mini Kernel Dump File: Only registers and stack trace are available
    7.  
    8. Symbol search path is: *** Invalid ***
    9. ****************************************************************************
    10. * Symbol loading may be unreliable without a symbol search path.           *
    11. * Use .symfix to have the debugger choose a symbol path.                   *
    12. * After setting your symbol path, use .reload to refresh symbol locations. *
    13. ****************************************************************************
    14. Executable search path is:
    15. *********************************************************************
    16. * Symbols can not be loaded because symbol path is not initialized. *
    17. *                                                                   *
    18. * The Symbol Path can be set by:                                    *
    19. *   using the _NT_SYMBOL_PATH environment variable.                 *
    20. *   using the -y <symbol_path> argument when starting the debugger. *
    21. *   using .sympath and .sympath+                                    *
    22. *********************************************************************
    23. Unable to load image ntoskrnl.exe, Win32 error 0n2
    24. *** WARNING: Unable to verify timestamp for ntoskrnl.exe
    25. *** ERROR: Module load completed but symbols could not be loaded for ntoskrnl.exe
    26. Windows XP Kernel Version 2600 (Service Pack 3) MP (2 procs) Free x86 compatible
    27. Product: WinNt, suite: TerminalServer SingleUserTS
    28. Machine Name:
    29. Kernel base = 0x804d7000 PsLoadedModuleList = 0x805634c0
    30. Debug session time: Mon Nov 28 00:39:29.343 2011 (GMT+2)
    31. System Uptime: 0 days 0:13:26.035
    32. *********************************************************************
    33. * Symbols can not be loaded because symbol path is not initialized. *
    34. *                                                                   *
    35. * The Symbol Path can be set by:                                    *
    36. *   using the _NT_SYMBOL_PATH environment variable.                 *
    37. *   using the -y <symbol_path> argument when starting the debugger. *
    38. *   using .sympath and .sympath+                                    *
    39. *********************************************************************
    40. Unable to load image ntoskrnl.exe, Win32 error 0n2
    41. *** WARNING: Unable to verify timestamp for ntoskrnl.exe
    42. *** ERROR: Module load completed but symbols could not be loaded for ntoskrnl.exe
    43. Loading Kernel Symbols
    44. ...............................................................
    45. ................................................................
    46. .
    47. Loading User Symbols
    48. Loading unloaded module list
    49. ..............
    50. Unable to load image TC.sys, Win32 error 0n2
    51. *******************************************************************************
    52. *                                                                             *
    53. *                        Bugcheck Analysis                                    *
    54. *                                                                             *
    55. *******************************************************************************
    56.  
    57. Use !analyze -v to get detailed debugging information.
    58.  
    59. BugCheck 1000007E, {c0000005, f799d4f9, f78e2738, f78e2434}
    60.  
    61. ***** Kernel symbols are WRONG. Please fix symbols to do analysis.
    62.  
    63. *************************************************************************
    64. ***                                                                   ***
    65. ***                                                                   ***
    66. ***    Your debugger is not using the correct symbols                 ***
    67. ***                                                                   ***
    68. ***    In order for this command to work properly, your symbol path   ***
    69. ***    must point to .pdb files that have full type information.      ***
    70. ***                                                                   ***
    71. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    72. ***    contain the required information.  Contact the group that      ***
    73. ***    provided you with these symbols if you need this command to    ***
    74. ***    work.                                                          ***
    75. ***                                                                   ***
    76. ***    Type referenced: nt!_KPRCB                                     ***
    77. ***                                                                   ***
    78. *************************************************************************
    79. *************************************************************************
    80. ***                                                                   ***
    81. ***                                                                   ***
    82. ***    Your debugger is not using the correct symbols                 ***
    83. ***                                                                   ***
    84. ***    In order for this command to work properly, your symbol path   ***
    85. ***    must point to .pdb files that have full type information.      ***
    86. ***                                                                   ***
    87. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    88. ***    contain the required information.  Contact the group that      ***
    89. ***    provided you with these symbols if you need this command to    ***
    90. ***    work.                                                          ***
    91. ***                                                                   ***
    92. ***    Type referenced: nt!_KPRCB                                     ***
    93. ***                                                                   ***
    94. *************************************************************************
    95. *********************************************************************
    96. * Symbols can not be loaded because symbol path is not initialized. *
    97. *                                                                   *
    98. * The Symbol Path can be set by:                                    *
    99. *   using the _NT_SYMBOL_PATH environment variable.                 *
    100. *   using the -y <symbol_path> argument when starting the debugger. *
    101. *   using .sympath and .sympath+                                    *
    102. *********************************************************************
    103. *********************************************************************
    104. * Symbols can not be loaded because symbol path is not initialized. *
    105. *                                                                   *
    106. * The Symbol Path can be set by:                                    *
    107. *   using the _NT_SYMBOL_PATH environment variable.                 *
    108. *   using the -y <symbol_path> argument when starting the debugger. *
    109. *   using .sympath and .sympath+                                    *
    110. *********************************************************************
    111. Probably caused by : TC.sys ( TC!CopyProcessMem+69 )
    112.  
    113. Followup: MachineOwner
    114. ---------
    115.  
    116. 1: kd> !analyze -v
    117. *******************************************************************************
    118. *                                                                             *
    119. *                        Bugcheck Analysis                                    *
    120. *                                                                             *
    121. *******************************************************************************
    122.  
    123. SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M (1000007e)
    124. This is a very common bugcheck.  Usually the exception address pinpoints
    125. the driver/function that caused the problem.  Always note this address
    126. as well as the link date of the driver/image that contains this address.
    127. Some common problems are exception code 0x80000003.  This means a hard
    128. coded breakpoint or assertion was hit, but this system was booted
    129. /NODEBUG.  This is not supposed to happen as developers should never have
    130. hardcoded breakpoints in retail code, but ...
    131. If this happens, make sure a debugger gets connected, and the
    132. system is booted /DEBUG.  This will let us see why this breakpoint is
    133. happening.
    134. Arguments:
    135. Arg1: c0000005, The exception code that was not handled
    136. Arg2: f799d4f9, The address that the exception occurred at
    137. Arg3: f78e2738, Exception Record Address
    138. Arg4: f78e2434, Context Record Address
    139.  
    140. Debugging Details:
    141. ------------------
    142.  
    143. ***** Kernel symbols are WRONG. Please fix symbols to do analysis.
    144.  
    145. *************************************************************************
    146. ***                                                                   ***
    147. ***                                                                   ***
    148. ***    Your debugger is not using the correct symbols                 ***
    149. ***                                                                   ***
    150. ***    In order for this command to work properly, your symbol path   ***
    151. ***    must point to .pdb files that have full type information.      ***
    152. ***                                                                   ***
    153. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    154. ***    contain the required information.  Contact the group that      ***
    155. ***    provided you with these symbols if you need this command to    ***
    156. ***    work.                                                          ***
    157. ***                                                                   ***
    158. ***    Type referenced: nt!_KPRCB                                     ***
    159. ***                                                                   ***
    160. *************************************************************************
    161. *************************************************************************
    162. ***                                                                   ***
    163. ***                                                                   ***
    164. ***    Your debugger is not using the correct symbols                 ***
    165. ***                                                                   ***
    166. ***    In order for this command to work properly, your symbol path   ***
    167. ***    must point to .pdb files that have full type information.      ***
    168. ***                                                                   ***
    169. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    170. ***    contain the required information.  Contact the group that      ***
    171. ***    provided you with these symbols if you need this command to    ***
    172. ***    work.                                                          ***
    173. ***                                                                   ***
    174. ***    Type referenced: nt!_KPRCB                                     ***
    175. ***                                                                   ***
    176. *************************************************************************
    177. *********************************************************************
    178. * Symbols can not be loaded because symbol path is not initialized. *
    179. *                                                                   *
    180. * The Symbol Path can be set by:                                    *
    181. *   using the _NT_SYMBOL_PATH environment variable.                 *
    182. *   using the -y <symbol_path> argument when starting the debugger. *
    183. *   using .sympath and .sympath+                                    *
    184. *********************************************************************
    185. *********************************************************************
    186. * Symbols can not be loaded because symbol path is not initialized. *
    187. *                                                                   *
    188. * The Symbol Path can be set by:                                    *
    189. *   using the _NT_SYMBOL_PATH environment variable.                 *
    190. *   using the -y <symbol_path> argument when starting the debugger. *
    191. *   using .sympath and .sympath+                                    *
    192. *********************************************************************
    193.  
    194. ADDITIONAL_DEBUG_TEXT:  
    195. Use '!findthebuild' command to search for the target build information.
    196. If the build information is available, run '!findthebuild -s ; .reload' to set symbol path and load symbols.
    197.  
    198. MODULE_NAME: TC
    199.  
    200. FAULTING_MODULE: 804d7000 nt
    201.  
    202. DEBUG_FLR_IMAGE_TIMESTAMP:  4ed2bc1a
    203.  
    204. EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - <Unable to get error code text>
    205.  
    206. FAULTING_IP:
    207. TC!CopyProcessMem+69 [c:\tc\tc.c @ 57]
    208. f799d4f9 8b02            mov     eax,dword ptr [edx]
    209.  
    210. EXCEPTION_RECORD:  f78e2738 -- (.exr 0xfffffffff78e2738)
    211. ExceptionAddress: f799d4f9 (TC!CopyProcessMem+0x00000069)
    212.    ExceptionCode: c0000005 (Access violation)
    213.   ExceptionFlags: 00000000
    214. NumberParameters: 2
    215.    Parameter[0]: 00000000
    216.    Parameter[1]: 00000400
    217. Attempt to read from address 00000400
    218.  
    219. CONTEXT:  f78e2434 -- (.cxr 0xfffffffff78e2434)
    220. eax=00000000 ebx=00000000 ecx=e1003e44 edx=00000400 esi=e334a266 edi=886fa5d8
    221. eip=f799d4f9 esp=f78e2800 ebp=f78e285c iopl=0         nv up ei pl zr na pe nc
    222. cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00210246
    223. TC!CopyProcessMem+0x69:
    224. f799d4f9 8b02            mov     eax,dword ptr [edx]  ds:0023:00000400=????????
    225. Resetting default scope
    226.  
    227. CUSTOMER_CRASH_COUNT:  3
    228.  
    229. DEFAULT_BUCKET_ID:  DRIVER_FAULT
    230.  
    231. BUGCHECK_STR:  0x7E
    232.  
    233. LAST_CONTROL_TRANSFER:  from f799e05e to f799d4f9
    234.  
    235. STACK_TEXT:  
    236. f78e285c f799e05e 00000850 00400000 f78e2874 TC!CopyProcessMem+0x69 [c:\tc\tc.c @ 57]
    237. f78e2c84 805a5303 886fa5d8 8670c000 00000000 TC!DriverEntry+0x14e [c:\tc\tc.c @ 174]
    238. WARNING: Stack unwind information not available. Following frames may be wrong.
    239. f78e2d54 805aeee7 80000c20 00000001 00000000 nt+0xce303
    240. f78e2d7c 804e23d5 80000c20 00000000 89bb9020 nt+0xd7ee7
    241. f78e2dac 80576316 a971cc6c 00000000 00000000 nt+0xb3d5
    242. f78e2ddc 804ec6f9 804e2311 00000001 00000000 nt+0x9f316
    243. 00000000 00000000 00000000 00000000 00000000 nt+0x156f9
    244.  
    245.  
    246. FOLLOWUP_IP:
    247. TC!CopyProcessMem+69 [c:\tc\tc.c @ 57]
    248. f799d4f9 8b02            mov     eax,dword ptr [edx]
    249.  
    250. FAULTING_SOURCE_CODE:  
    251.     53:     st = ObReferenceObjectByHandle(hProcess, 0, NULL, UserMode, &process, NULL);
    252.     54:
    253.     55:     if (NT_SUCCESS(st))
    254.     56:     {  
    255. >   57:         Bytes = *Size;
    256.     58:         pMem = ExAllocatePool(NonPagedPool, Bytes);
    257.     59:         dPtr = pMem;
    258.     60:
    259.     61:         cPtr = (PUCHAR)SrcAddr;
    260.     62:
    261.  
    262.  
    263. SYMBOL_STACK_INDEX:  0
    264.  
    265. SYMBOL_NAME:  TC!CopyProcessMem+69
    266.  
    267. FOLLOWUP_NAME:  MachineOwner
    268.  
    269. IMAGE_NAME:  TC.sys
    270.  
    271. STACK_COMMAND:  .cxr 0xfffffffff78e2434 ; kb
    272.  
    273. BUCKET_ID:  WRONG_SYMBOLS
    274.  
    275. Followup: MachineOwner
    276. ---------
    277.  
    278. 1: kd> .exr 0xfffffffff78e2738
    279. ExceptionAddress: f799d4f9 (TC!CopyProcessMem+0x00000069)
    280.    ExceptionCode: c0000005 (Access violation)
    281.   ExceptionFlags: 00000000
    282. NumberParameters: 2
    283.    Parameter[0]: 00000000
    284.    Parameter[1]: 00000400
    285. Attempt to read from address 00000400
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Судя по всему, вместо указателя на Size передано значение самого Size. Оно, кстати, равно 1024.

    И да, неплохо бы настроить символы, чтобы скачались. Без них тяжело будет. File ->Symbol File Path, вводим значение: srv*_full_path_to_symbol_directory_*http://msdl.microsoft.com/download/symbols

    _full_path_to_symbol_directory_ заменяем на реальный путь в файловой системе.
     
  8. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    skyproc
    Падает на этой строчке:
    Ты правильно передал параметры ? покажи как передаешь .

    Упс...опередили)
     
  9. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    НЕ правильно!!!
    исправил, но тут ещё как минимум один косяк который опять же синий экран вызывает.
    Так всё таки

    PVOID SrcAddr - это указатель на переменную содержащую адрес с которого будем читать из юзер мода к примеру 0x400000


    PVOID DstAddr - это указатель на переменную содержащую адрес буфера в ядре?


    ???
     
  10. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Назревает драма. Какой !analyze -v теперь? (Желательно с символами) И что вообще требуется сделать? Прочитать память процесса в память ядра? Тогда да, в DstAddr надо положить указатель на ExAllocatePool(...);
     
  11. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Спакойстьвие только спакойстьвие!!!
    Драмма разрешилась, грабли раскидал всё пашет.
    Наверное....

    В буфере есть какой то мусор после выполнения поставленной задачи
    А
    ExAllocatePool(NonPagedPool, 1024);
    Ваще чистый пул выделяет или?
    Суде по тому что дампы каждый раз разные пул надо бы мыть перед использованием

    И всёже мрак над параметром

    PVOID SrcAddr - это указатель на переменную содержащую адрес с которого будем читать из юзер мода к примеру 0x400000
    ??????
     
  12. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Фуффффф
    С этой задачей справился!

    Теперь задача посложнее, как её реализовать ума не приложу.

    Процесс юзер мода продавпил, теперь нужно модифицировать его данные, код, регистры CPU и и продолжить его выполнение с указанной точки.
     
  13. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    В этом тебе поможет ZwGetContextThread/ZwSetContextThread zwprotectvirtualmemory
     
  14. skyproc

    skyproc New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    217
    Всем пасиба
    Бум разбираться!