Внутрипроцессный сканер виртуальной памяти

Тема в разделе "WASM.BEGINNERS", создана пользователем Xect0r, 24 мар 2010.

  1. Xect0r

    Xect0r New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2010
    Сообщения:
    4
    Доброго времени суток, уже две недели страдаю над написанием сканера памяти, моЦк пухНед ниМагу, помогите плиз!
    ##############Code#####################
    Переменные(в стэке)
    pMap_ <------Тут хранится адрес кучи, полученной HeapCreate в ней в находится структура MEMORY_BASIC_INFORMATION необходимая для VirtualQuery.
    buffer_ <-----Адрес выделеной памяти VirtualAlloc для хранения блока страниц размером MEMORY_BASIC_INFORMATION.RegionSize помеченных как PAGE_READWRITE по запросу ф-и VirtualQuery.
    address_ <------Текущий адрес поиска read/write страниц образа процесса. С это адреса происходит копирования блока страниц по средствам моей процедуры CopyMem(описаной ниже)в выделенное место памяти ф-ей VirtualAlloc для последующего поиска в этом самом месте сигнатур.

    ##############Процедура CopyMem#####################
    вызов этой процедуры выполняется после выделения памяти для хранения блока страниц с флагом read/write и помещением в переменную buffer_ указателя на эту самую память.
    push MEMORY_BASIC_INFORMATION.RegionSize
    push buffer_
    push address_ <-----текущий адрес проверяемого блока страниц на чтение\запись
    call CopyMem

    Код (Text):
    1. proc CopyMem pointer_s,pointer_d,size_
    2.      jmp getSavePlace ;<--------Заталкивается в стэк указатель на безопасное место(getSavePlace символическая ссылка
    3.                                   ;казывает на запуск сканера страниц и заталкиваетв стэк рет адресс и возвращается обратно в
    4.                                   ;установку seh фрейма)
    5.      safeCopy:
    6.      jmp handler_push;<--------Тем же методом заталкиваю в стэк указатель на процедуру обработчика ексепшена
    7.      copy_handler:
    8.      push d[fs:0]
    9.      mov d[fs:0],esp
    10. ;-------------------------------------Поехали копировать блок из образа в выделенную память
    11.      mov esi,[pointer_s]
    12.      mov edi,[pointer_d]
    13.      mov ecx,[size_]
    14.      cld
    15.      @@:
    16.      lodsb
    17.      stosb
    18.      loop @b
    19.      pop d[fs:0]
    20.      add esp,12;<------сколько байт структуры seh затолкнули столько и чистим
    21.  
    22.      ret
    23. ;вот сам обработчик
    24. endp
    25.  
    26.      handler_push:
    27.      call copy_handler
    28. proc HANDLER ExeptRec,err,context,Param
    29.      mov eax,[ExeptRec]
    30.      cmp d[eax],0C0000005h;<-----------EXCEPTION_ACCESS_VIOLATION ниже написано почему я этот обработчик написал, не
    31.                                            ;могу понять почему вылетает на адресе образа 0х00030000, ниже трасе логи из оли.
    32.      je @f
    33.      zer0 eax
    34.      inc eax
    35.      ret
    36.      @@:
    37.      mov eax,[Param]
    38.      mov ebx,[context]
    39.      push d[eax+08h];<------Safe place
    40.      pop d[ebx+0B8h];<------EIP context
    41.      push d[eax+12];Esp before crash
    42.      pop d[ebx+ 0C4h];<---recover esp
    43.      ;push d[eax+16]
    44.      ;pop d[ebx+0B4h]
    45.      zer0 eax
    46.      ret
    47.  
    48.  
    49. endp
    ########################
    Странно, но после того как доходет дело до копирования блока страниц из образа AkelPad.exe по адресу 0х00030000 сразу EXCEPTION_ACCESS_VIOLATION !!!! вот я добавил обработчик и после этого появились еще EXCEPTIONS, короче вот трасе логи оли, че делать хелп ми плиз!!!!
    ################Olly trace log
    00350000 Module C:\WINDOWS\system32\AkelFiles\Plugs\ToolBar.dll
    00A30000 Module C:\WINDOWS\system32\AkelFiles\Plugs\ContextMenu.dll
    00A50000 Module C:\WINDOWS\system32\AkelFiles\Plugs\PasteSerial.dll
    00A60000 Module C:\WINDOWS\system32\AkelFiles\Plugs\QSearch.dll
    00B10000 Module C:\WINDOWS\system32\AkelFiles\Plugs\RecentFiles.dll
    00B10000 Unload C:\WINDOWS\system32\AkelFiles\Plugs\RecentFiles.dll
    00B10000 Module C:\WINDOWS\system32\AkelFiles\Plugs\NoSelEOL.dll
    00B20000 Module C:\WINDOWS\system32\AkelFiles\Plugs\LineBoard.dll
    00B30000 Module C:\WINDOWS\system32\AkelFiles\Plugs\XBrackets.dll
    00B70000 Module C:\WINDOWS\system32\AkelFiles\Plugs\HexSel.dll
    00BC0000 Module C:\WINDOWS\system32\xpsp2res.dll
    7C8106F9 New thread with ID 000013D0 created
    7C8106F9 New thread with ID 00000B78 created
    010F0000 Module C:\WINDOWS\system32\AkelFiles\Plugs\Sessions.dll
    01110000 Module C:\WINDOWS\system32\AkelFiles\Plugs\HighLight.dll
    7C8106F9 New thread with ID 000016BC created
    01210392 INT3 command at 01210392;<----------------------Это int 3 чтоб вывалиться в оле в потоке который я инджектил в AkelPad.exe
    012106ED Access violation when reading [00030000];<---------------Вот тут происходит в инструкции lodsb когда грузит байт из образа AkelPad.exe и копирует stosb в выделеную память в процедуре CopyMem

    А после установленной галочки игнорировать Memory access vialation, появляются дом исклучения
    Address=01240004;<----------Это уже за пределами кода моего потока
    Message=Privileged instruction


    Код (Text):
    1. scan:
    2.      mov ebx,pMap_
    3.      mov d[ebx],10000h
    4.      jmp getblock
    5. getSavePlace:
    6.  
    7.      call safeCopy
    8.      jmp getblock
    9.  
    10. getblock_clean_alloc:
    11.      push edx ebx MEM_RELEASE 0 buffer_
    12.      call VirtualFree_
    13.      pop ebx edx
    14. getblock:
    15.      mov eax,[ebx+00]
    16.      add eax,[ebx+12]
    17.      mov address_,eax
    18.      push edx ebx 28 ebx address_
    19.      call VirtualQuery_
    20.      pop ebx edx
    21.      mov eax,PAGE_READWRITE
    22.      cmp [ebx+8],eax ;проверить доступ
    23.      jne getblock
    24.      push ebx edx PAGE_READWRITE MEM_RESERVE+MEM_COMMIT d[ebx+12] NULL
    25.      call VirtualAlloc_
    26.      pop edx ebx
    27.      mov buffer_,eax
    28.      push ebx edx d[ebx+12] buffer_ address_
    29.      call CopyMem
    30.      pop edx ebx
    31.  
    32. scan_signature:
    33.      zer0 eax
    34.      mov edi,buffer_
    35.      add edi,6;
    36.      mov al,'+'
    37.      mov ecx,[ebx+12]
    38.      sub ecx,16
    39.      cld          
    40.                    
    41. sygnature:
    42.      repne scasb
    43.      jnz getblock_clean_alloc
    Короче вопросы такие:
    1)Почему вообще происходит исключение для адреса 0х00030000, ведь VirtualQuery сказала, что блок read\write ?
    2)Нужно ли останавливать (SUSPEND) потоки в процессе, чтоб мой поток мог сканировать образ процесса в котором находтся?
    3)Как получить хендлы всех потоков в процессе находясь в процессе?
    4)Как получить стэки этих самых потоков?
    5)Как сузить область поиска сигнатуры(может передаваться по сокетам, выводиться в окно, забираться с ввода в окне) в образе участков с флагом read\write целевого процесса?

    Заранее благодарен!!!!
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Xect0r
    1.
    Не валидный адрес в Esi или в Edi(предполагается что селекторы дефолтные). Так как читаемая страница доступна(1), то не валидный Edi. Это выход за преелы вашего буфера.
    2. Да.
    3. Описатели открытые или их нужно создать ?
    Если описателей нет - перечислить все потоки и открыть необходимые(System[Extended]ProcessesAndThreadsInformation или перечислять TEB и извлекать CID, либо переключать контекст на другие потоки захватом глобальных функций/ переменных, или иные разные способы.
    Если описатели имеются - перечислять их и получать инфу(SystemHandleInformation).
    4. Что значит получить "стеки" ?
    Если нужен текущий адрес - тогда из контекста извлечь регистр Eip. Если нужен диапазон, то определить TEB(ThreadBasicInformation) и извлечь из него базу, лимит и пр. инфу.
    5. Не понятно.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    1. Не то написал, почемуто я подумал что там movsb :)
    Что говорит отладчик про регион память по 0x30000 ?
     
  4. Xect0r

    Xect0r New Member

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

    mov eax,[ebx+00]
    cmp eax,7fff0000h;<----------И тут ограничил 2Г юзер модную память
    jge exit_sygn
    add eax,[ebx+12]
    mov address_,eax
    push edx ebx 28 ebx address_
    call VirtualQuery_
    pop ebx edx
    mov eax,MEM_COMMIT;<------------------вот добавил
    cmp [ebx+16],eax
    jne getblock
    mov eax,PAGE_READWRITE
    cmp [ebx+8],eax ;проверить доступ
    jne getblock
    push ebx edx PAGE_READWRITE MEM_RESERVE+MEM_COMMIT d[ebx+12] NULL
    call VirtualAlloc_
    pop edx ebx\


    но теперь ругается на другое
    Log data, item 0
    Address=0122088B
    Message=Break-on-access when reading [0012A000]
    ---------------------------------
    вот мемори мап образа целевого процесса
    Memory map
    Address Size Owner Section Contains Type Access Initial Mapped as
    00010000 00001000 Priv 00021004 RW RW
    00020000 00001000 Priv 00021004 RW RW
    0012A000 00001000 Priv 00021004 RW RW
    0012B000 00005000 stack of main thread Priv 00021004 RW RW
    00130000 00003000 Map 00041002 R R
    00140000 00002000 Map 00041002 R R
    00150000 000C8000 Priv 00021004 RW RW
    00250000 00006000 Priv 00021004 RW RW
    00260000 00003000 Map 00041004 RW RW
    00270000 00016000 Map 00041002 R R \Device\HarddiskVolume1\WINDOWS\system32\unicode.nls
    00290000 00041000 Map 00041002 R R \Device\HarddiskVolume1\WINDOWS\system32\locale.nls
    002E0000 00041000 Map 00041002 R R \Device\HarddiskVolume1\WINDOWS\system32\sortkey.nls
    00330000 00006000 Map 00041002 R R \Device\HarddiskVolume1\WINDOWS\system32\sorttbls.nls
    00340000 00001000 Map 00041004 RW RW
    00350000 00001000 Priv 00021004 RW RW
    00360000 00001000 Priv 00021004 RW RW
    00370000 00009000 Priv 00021004 RW RW
    00380000 00003000 Map 00041002 R R \Device\HarddiskVolume1\WINDOWS\system32\ctype.nls
    00390000 00002000 Map 00041002 R R
    003A0000 00001000 Map 00041002 R R
    003B0000 00002000 Map 00041002 R R
    может ли такое выдавать оля когда lodsb натыкается на PAGE_GUARD ?
    VirtualQuery вроде четко отработал значит читать можно, я даже реализовал тред суспенд для всех тредов кроме моего, где грабли, у меня уже чердак кипит! Хелп ми плиззззззззз
     
  5. Xect0r

    Xect0r New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2010
    Сообщения:
    4
    00010000 00001000 Priv 00021004 RW RW
    00020000 00001000 Priv 00021004 RW RW
    0012A000 00001000 Priv 00021004 RW RW
    вот, если ты про мемори мап?!?!
     
  6. Xect0r

    Xect0r New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2010
    Сообщения:
    4
    Я сначала думал, что дело в том, что я пытаюсь читать, пока другой тред пишет, я сделал суспенд всем тредам блин пофиг терь в другом месте вылетает!
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Xect0r
    Регион 0x30000 не выделен, разумеется исключение возникает.
    Это вы обратились к сторожевой странице стека чужёго потока.
     
  8. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    А ReadProcessMemory не устраивает? Если будет работать, то так можно сохранить массу клеток моЦка.