Помогите снять защиту памяти процесса от записи

Тема в разделе "WASM.WIN32", создана пользователем gloomyraven, 28 мар 2010.

  1. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Добрый день! Такая беда:
    Задался тут вопросом, как клиент Garena защищает память процесса Warcraft III и наткнулся на код (в прикрепленной картинке). Помогите плиз разобраться, как DeviceIOcontrol может запломбиовать память на запись (в юзермоде)?
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    хе-хе...
     
  3. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Разобрался, гарена ставила драйвер, перехвающий zwWritePocessMemory.
    Тему можно закрыть
     
  4. ptr

    ptr New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2009
    Сообщения:
    130
    на архив (_sendspace.com/file/raiyue)
    от не**уй делать, пропатчил ехе, чтобы не дропился драйвер.
    версия клиента 4.0.1.6127, качал отсюда (_garena-game.ru/files/ggc/5-garena-2.3.html)
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Как обычно это примитивная защита, которая выносится такими утилитами как рку - перехваты в секциях кода, возможно есчо самопроверки(проверки целостности). Снимается за минуты.
     
  6. ptr

    ptr New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2009
    Сообщения:
    130
    да там дропится дровина с темповым именнем, хукает (Zw)OpenProcess\WriteVirtualMemory
     
  7. ptr

    ptr New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2009
    Сообщения:
    130
    + проверка на целесность длл, т.е все как "предсказал" клерк :)
     
  8. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Ок, раз тут отписались, спасибо всем. Пропатчить саму гарену смог и я, правда я не создание дрова патчил, а функцию, которая вызывает DeviceIOcontrol в самой гарене. Вопрос тогда назревает такой: как можно записать из юзер-мода, не пребегая к созданию дров, в область памяти, защищенной такой примитивной защиткой? (чтобы лишний раз не патчить экзешник и не палиться)
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    1) разделяемая память
    2) "инжект: лезем через окно"
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    ну всмысле внедряешь одним из методов код, который произведет запись... ну а там уже можно будет или один из потоков переключить на выполнение кода, или новый поток создать...
    ЗЫ верните редактирование, негодяи!))))
     
  11. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Записываешь шелкод на асме который манипулирует памятью напрямую без Read/WriteProcessMemory.
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    ололо))) чего-чего?
     
  13. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    А как напрямую из юзер-мода записать в вирт. память? может я тупой?
     
  14. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    как я его внедрю в процесс, если в него писать нельзя?
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    gloomyraven
    NtSystemDebugControl :)
    Код (Text):
    1. ; Vm.asm
    2. BASE_REGION_SIZE    equ 10000H
    3.  
    4. ; +
    5. ; Опредедяет адрес описателя обьекта(KPROCESS, KTIMER etc).
    6. ;
    7. QueryObject proc uses ebx ObjectHandle:HANDLE, Object:PVOID
    8. Local SystemInformation:PVOID, SystemInformationLength:ULONG
    9. Local ProcessInformation:PROCESS_BASIC_INFORMATION
    10.     invoke ZwQueryInformationProcess, NtCurrentProcess, ProcessBasicInformation, addr ProcessInformation, sizeof(PROCESS_BASIC_INFORMATION), NULL
    11.     test eax,eax
    12.     mov ebx,BASE_REGION_SIZE
    13.     jnz Exit
    14. NextRegion:
    15.     mov SystemInformationLength,ebx
    16.     mov SystemInformation,NULL
    17.     invoke ZwAllocateVirtualMemory, NtCurrentProcess, addr SystemInformation, 0, addr SystemInformationLength, MEM_COMMIT, PAGE_READWRITE
    18.     test eax,eax
    19.     jnz Exit
    20.     invoke ZwQuerySystemInformation, SystemHandleInformation, SystemInformation, SystemInformationLength, Eax
    21.     test eax,eax
    22.     jz ParseInfo
    23.     push eax
    24.     invoke ZwFreeVirtualMemory, NtCurrentProcess, addr SystemInformation, addr SystemInformationLength, MEM_RELEASE
    25.     pop eax
    26.     cmp eax,STATUS_INFO_LENGTH_MISMATCH
    27.     jnz Exit
    28.     add ebx,BASE_REGION_SIZE
    29.     cmp ebx,32*BASE_REGION_SIZE
    30.     jb NextRegion
    31.     jmp Exit
    32. ParseInfo:
    33.     mov edx,SystemInformation
    34.     mov ebx,ProcessInformation.UniqueProcessId
    35.     mov ecx,dword ptr [edx]
    36.     mov eax,ObjectHandle
    37.     add edx,4
    38. NextEntry:
    39.     assume edx:PSYSTEM_HANDLE_INFORMATION
    40.     cmp [edx].ProcessId,ebx
    41.     jne @f
    42.     cmp [edx].Handle,ax
    43.     je GetObject
    44. @@:
    45.     add edx,sizeof(SYSTEM_HANDLE_INFORMATION)
    46.     loop NextEntry
    47.     mov eax,STATUS_NOT_FOUND
    48.     jmp ParseError
    49. GetObject:
    50.     mov edx,[edx].Object
    51.     mov ebx,Object
    52.     xor eax,eax
    53.     mov dword ptr [ebx],edx
    54. ParseError:
    55.     push eax
    56.     invoke ZwFreeVirtualMemory, NtCurrentProcess, addr SystemInformation, addr SystemInformationLength, MEM_RELEASE
    57.     pop eax
    58. Exit:
    59.     ret
    60. QueryObject endp
    61.  
    62. SYSDBG_PHYSICAL struct
    63. Address QWORD ?
    64. Buffer  PVOID ?
    65. Request ULONG ?
    66. SYSDBG_PHYSICAL ends
    67. PSYSDBG_PHYSICAL typedef ptr SYSDBG_PHYSICAL
    68.  
    69. SysDbgReadPhysical  equ 10  ; XP
    70. SysDbgWritePhysical equ 11  ; XP
    71.  
    72. KD_READ equ 0
    73. KD_WRITE    equ 1
    74.  
    75. ; +
    76. ; Чтение/запись физической памяти.
    77. ;
    78. KdPhysicalMemoryOperation proc PhysicalAddress:PVOID, BufferAddress:PVOID, BytesToRead:ULONG, ReadOrWrite:ULONG
    79. Local InputBuffer:SYSDBG_PHYSICAL
    80.     xor eax,eax
    81.     mov ecx,PhysicalAddress
    82.     mov edx,BufferAddress
    83.     mov dword ptr [InputBuffer.Address],ecx
    84.     mov dword ptr [InputBuffer.Address + 4],eax
    85.     mov InputBuffer.Buffer,edx
    86.     push eax
    87.     mov ecx,BytesToRead
    88.     push eax
    89.     push eax
    90.     lea edx,InputBuffer
    91.     mov eax,ReadOrWrite
    92.     mov InputBuffer.Request,ecx
    93.     and eax,1
    94.     push sizeof(SYSDBG_PHYSICAL)
    95.     add eax,SysDbgReadPhysical
    96.     push edx
    97.     push eax
    98.     Call ZwSystemDebugControl
    99.     ret
    100. KdPhysicalMemoryOperation endp
    101.  
    102. ; +
    103. ; Для системного адресного пространства.
    104. ;
    105. VIRTUAL_TO_PHYSICAL macro Ptr32
    106.     .if (Ptr32 > 080000000H)  && (Ptr32 < 0A0000000h)
    107.     and Ptr32,1FFFFFFFH
    108.     .else
    109.     and Ptr32,0FFFFFFH
    110.     .endif
    111. endm   
    112.  
    113. PsDirectoryTableBase    equ 18H ; EPROCESS.Pcb.DirectoryTableBase
    114.  
    115. ; +
    116. ; Определяет адрес каталога страниц.
    117. ;
    118. KdQueryProcessPageDirectoryTableBase proc ProcessHandle:HANDLE, DirectoryTableBase:PVOID
    119. Local Object:DWORD
    120.     invoke QueryObject, ProcessHandle, addr Object
    121.     test eax,eax
    122.     mov ecx,Object
    123.     .if Zero?
    124.     lea ecx,[ecx + PsDirectoryTableBase]
    125.     VIRTUAL_TO_PHYSICAL Ecx ; System space.
    126.     invoke KdPhysicalMemoryOperation, Ecx, DirectoryTableBase, sizeof(PVOID), KD_READ
    127.     .endif
    128.     ret
    129. KdQueryProcessPageDirectoryTableBase endp
    130.  
    131. PDE_P   equ 1B
    132. PDE_PS  equ 10000000B
    133. PTE_P   equ 1B
    134.  
    135. ; +
    136. ; Чтение/запись виртуальной памяти.
    137. ;
    138. KdVirtualMemoryOperation proc uses ebx ProcessHandle:HANDLE, Address:PVOID, Buffer:PVOID, Request:ULONG, ReadOrWrite:ULONG
    139. Local DirectoryTableBase:PVOID
    140. Local TableEntry:PVOID
    141.     invoke KdQueryProcessPageDirectoryTableBase, ProcessHandle, addr DirectoryTableBase ; PD
    142.     test eax,eax
    143.     jnz Exit
    144. Portion:
    145.     mov ecx,Address
    146.     shr ecx,20
    147.     and ecx,111111111100B
    148.     add ecx,DirectoryTableBase
    149.     invoke KdPhysicalMemoryOperation, Ecx, addr TableEntry, 4, KD_READ  ; PDE
    150.     test eax,eax
    151.     mov ecx,TableEntry
    152.     jnz Exit
    153.     test ecx,PDE_P
    154.     mov eax,STATUS_MEMORY_NOT_ALLOCATED
    155.     jz Exit
    156.     test ecx,PDE_PS
    157.     jz @f
    158. ; 4M
    159.     mov ebx,NOT(LARGE_PAGE_SIZE - 1)
    160.     jmp Copy       
    161. @@:
    162. ; 4K
    163.     mov ebx,NOT(PAGE_SIZE - 1)
    164.     mov eax,Address
    165.     and ecx,ebx ; NOT(PAGE_SIZE - 1)
    166.     shr eax,10
    167.     and eax,111111111100B
    168.     add ecx,eax
    169.     invoke KdPhysicalMemoryOperation, Ecx, addr TableEntry, 4, KD_READ  ; PTE
    170.     test eax,eax
    171.     mov ecx,TableEntry
    172.     jnz Exit
    173.     test ecx,PTE_P
    174.     mov eax,STATUS_MEMORY_NOT_ALLOCATED
    175.     jz Exit
    176. Copy:
    177.     mov eax,Address
    178.     and ecx,ebx ; NOT(LARGE_PAGE_SIZE - 1)
    179.     not ebx
    180.     and eax,ebx ; (LARGE_PAGE_SIZE - 1)
    181.     add ecx,eax
    182.     not eax
    183.     lea eax,[eax + ebx + 2]
    184.     .if Request > Eax
    185.     push eax
    186.     sub Request,Eax
    187.     push Buffer
    188.     push ecx
    189.     add Buffer,eax
    190.     invoke KdPhysicalMemoryOperation, Ecx, Buffer, Eax, ReadOrWrite ; P
    191.     test eax,eax
    192.     not ebx
    193.     jnz Exit
    194.     and Address,ebx ; NOT(LARGE_PAGE_SIZE - 1)
    195.     not ebx
    196.     add Address,ebx ; (LARGE_PAGE_SIZE - 1)
    197.     inc Address
    198.     jmp Portion
    199.     .else
    200.     invoke KdPhysicalMemoryOperation, Ecx, Buffer, Request, ReadOrWrite ; P
    201.     .endif
    202. Exit:
    203.     ret
    204. KdVirtualMemoryOperation endp
    205.  
    206. ; +
    207. ;
    208. KdVirtualMemoryOperationEx proc ClientId:PCLIENT_ID, Address:PVOID, Buffer:PVOID, Request:ULONG, ReadOrWrite:ULONG
    209. Local ObjAttr:OBJECT_ATTRIBUTES
    210. Local ProcessHandle:HANDLE
    211.     xor eax,eax
    212.     mov ObjAttr.uLength,sizeof(OBJECT_ATTRIBUTES)
    213.     mov ObjAttr.hRootDirectory,eax
    214.     mov ObjAttr.pSecurityDescriptor,eax
    215.     mov ObjAttr.pSecurityQualityOfService,eax
    216.     mov ObjAttr.pObjectName,eax
    217.     mov ObjAttr.uAttributes,eax
    218.     invoke ZwOpenProcess, addr ProcessHandle, PROCESS_QUERY_INFORMATION, addr ObjAttr, ClientId
    219.     .if !Eax
    220.     invoke KdVirtualMemoryOperation, ProcessHandle, Address, Buffer, Request, ReadOrWrite
    221.     push eax
    222.     invoke ZwClose, ProcessHandle
    223.     pop eax
    224.     .endif
    225.     ret
    226. KdVirtualMemoryOperationEx endp
    Нужна привилегия отладчика:
    Код (Text):
    1. .data
    2. TestVar ULONG 121314H
    3.    
    4. .code
    5.     include Vm.asm 
    6.    
    7.     assume fs:nothing
    8. Entry proc
    9. Local Buffer:ULONG
    10. Local Privilege:ULONG
    11.     invoke RtlAdjustPrivilege, SE_DEBUG_PRIVILEGE, TRUE, FALSE, addr Privilege
    12.     mov eax,fs:[TEB.Tib.Self]
    13.     mov Buffer,12345678H
    14.     lea ebx,[eax + TEB.Cid]
    15.     invoke KdVirtualMemoryOperationEx, Ebx, addr TestVar, addr Buffer, 4, KD_READ
    16.     ret
    17. Entry endp
    тф до кучи:
    Код (Text):
    1. KTRAP_FRAME_LENGTH equ 0008CH
    2.  
    3. ; Trap Frame Offset Definitions
    4. ;
    5. TsDr0   equ 00018H
    6. TsDr1   equ 0001CH
    7. TsDr2   equ 00020H
    8. TsDr3   equ 00024H
    9. TsDr6   equ 00028H
    10. TsDr7   equ 0002CH
    11. TsSegGs equ 00030H
    12. TsSegEs equ 00034H
    13. TsSegDs equ 00038H
    14. TsEdx   equ 0003CH
    15. TsEcx   equ 00040H
    16. TsEax   equ 00044H
    17. TsSegFs equ 00050H
    18. TsEdi   equ 00054H
    19. TsEsi   equ 00058H
    20. TsEbx   equ 0005CH
    21. TsEbp   equ 00060H
    22. ; IRET-frame.
    23. TsEip   equ 00068H
    24. TsSegCs equ 0006CH
    25. TsEflags    equ 00070H
    26. TsHardwareEsp       equ 00074H
    27. TsHardwareSegSs equ 00078H
    28.  
    29. KTRAP_FRAME struct
    30. DbgEbp      ULONG ?
    31. DbgEip      ULONG ?
    32. DbgArgMark  ULONG ?
    33. DbgArgPointer   ULONG ?
    34.  
    35. TempSegCs       ULONG ?
    36. TempEsp     ULONG ?
    37.  
    38. rDr0            ULONG ?
    39. rDr1            ULONG ?
    40. rDr2            ULONG ?
    41. rDr3            ULONG ?
    42. rDr6            ULONG ?
    43. rDr7            ULONG ?
    44.  
    45. SegGs       ULONG ?
    46. SegEs       ULONG ?
    47. SegDs       ULONG ?
    48.  
    49. rEdx            ULONG ?
    50. rEcx            ULONG ?
    51. rEax            ULONG ?
    52.  
    53. PreviousPreviousMode    ULONG ?
    54.  
    55. ExceptionList   PVOID ?
    56.  
    57. SegFs       ULONG ?
    58.  
    59. rEdi            ULONG ?
    60. rEsi            ULONG ?
    61. rEbx            ULONG ?
    62. rEbp            ULONG ?
    63.  
    64. ; IRET-frame.
    65. ErrCode     ULONG ?
    66. rEip            ULONG ?
    67. rSegCs      ULONG ?
    68. rEFlags     ULONG ?
    69.  
    70. HardwareEsp ULONG ?
    71. HardwareSegSs   ULONG ?
    72.  
    73. V86Es       ULONG ?
    74. V86Ds       ULONG ?
    75. V86Fs       ULONG ?
    76. V86Gs       ULONG ?
    77. KTRAP_FRAME ends
    78. PKTRAP_FRAME typedef ptr KTRAP_FRAME
    79.  
    80. ;
    81. ; Usermode callout frame.
    82. ;
    83. CALLOUT_FRAME struct
    84. InitialStack    PVOID ?
    85. TrapFrame       PKTRAP_FRAME ?
    86. CallbackStack   PVOID ? ; PCALLBACK_STACK
    87. rEdi            DWORD ?
    88. rEsi            DWORD ?
    89. rEbx            DWORD ?
    90. rEbp            DWORD ?
    91. rEip            DWORD ?
    92. Buffer      PVOID ?
    93. BufferLength    ULONG ?
    94. CALLOUT_FRAME ends
    95. PCALLOUT_FRAME typedef ptr CALLOUT_FRAME
    96.  
    97. ; ETHREAD.CalloutStack:PCALLOUT_FRAME
    98. ;
    99. ThCallbackStack equ 12CH    ; XP
    100.  
    101. ; KTRAP_FRAME.rEip
    102. ;
    103. TsEip   equ 00068H
     
  16. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Clerk
    Респект и уважуха! Зачот! Спасибо! Пошел проверять и разбираться.
     
  17. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    читай выше:
     
  18. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Бакдор залатан на w2k3 sp1, wxp sp3 и всем, что выше. Мало того, некоторые тулзы для самозащиты урезают функционал NtSystemDebugControl и в ранних версиях NT.
     
  19. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Плохо...
     
  20. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Clerk
    Рано я обрадовался ))) На семерке не работает...
    Проще наверное драйверок маленький написать для записи в процесс