Доброго времени суток, уже две недели страдаю над написанием сканера памяти, моЦк пухНед ниМагу, помогите плиз! ##############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): proc CopyMem pointer_s,pointer_d,size_ jmp getSavePlace ;<--------Заталкивается в стэк указатель на безопасное место(getSavePlace символическая ссылка ;казывает на запуск сканера страниц и заталкиваетв стэк рет адресс и возвращается обратно в ;установку seh фрейма) safeCopy: jmp handler_push;<--------Тем же методом заталкиваю в стэк указатель на процедуру обработчика ексепшена copy_handler: push d[fs:0] mov d[fs:0],esp ;-------------------------------------Поехали копировать блок из образа в выделенную память mov esi,[pointer_s] mov edi,[pointer_d] mov ecx,[size_] cld @@: lodsb stosb loop @b pop d[fs:0] add esp,12;<------сколько байт структуры seh затолкнули столько и чистим ret ;вот сам обработчик endp handler_push: call copy_handler proc HANDLER ExeptRec,err,context,Param mov eax,[ExeptRec] cmp d[eax],0C0000005h;<-----------EXCEPTION_ACCESS_VIOLATION ниже написано почему я этот обработчик написал, не ;могу понять почему вылетает на адресе образа 0х00030000, ниже трасе логи из оли. je @f zer0 eax inc eax ret @@: mov eax,[Param] mov ebx,[context] push d[eax+08h];<------Safe place pop d[ebx+0B8h];<------EIP context push d[eax+12];Esp before crash pop d[ebx+ 0C4h];<---recover esp ;push d[eax+16] ;pop d[ebx+0B4h] zer0 eax ret 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): scan: mov ebx,pMap_ mov d[ebx],10000h jmp getblock getSavePlace: call safeCopy jmp getblock getblock_clean_alloc: push edx ebx MEM_RELEASE 0 buffer_ call VirtualFree_ pop ebx edx getblock: mov eax,[ebx+00] add eax,[ebx+12] mov address_,eax push edx ebx 28 ebx address_ call VirtualQuery_ pop ebx edx 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 mov buffer_,eax push ebx edx d[ebx+12] buffer_ address_ call CopyMem pop edx ebx scan_signature: zer0 eax mov edi,buffer_ add edi,6; mov al,'+' mov ecx,[ebx+12] sub ecx,16 cld sygnature: repne scasb jnz getblock_clean_alloc Короче вопросы такие: 1)Почему вообще происходит исключение для адреса 0х00030000, ведь VirtualQuery сказала, что блок read\write ? 2)Нужно ли останавливать (SUSPEND) потоки в процессе, чтоб мой поток мог сканировать образ процесса в котором находтся? 3)Как получить хендлы всех потоков в процессе находясь в процессе? 4)Как получить стэки этих самых потоков? 5)Как сузить область поиска сигнатуры(может передаваться по сокетам, выводиться в окно, забираться с ввода в окне) в образе участков с флагом read\write целевого процесса? Заранее благодарен!!!!
Xect0r 1. Не валидный адрес в Esi или в Edi(предполагается что селекторы дефолтные). Так как читаемая страница доступна(1), то не валидный Edi. Это выход за преелы вашего буфера. 2. Да. 3. Описатели открытые или их нужно создать ? Если описателей нет - перечислить все потоки и открыть необходимые(System[Extended]ProcessesAndThreadsInformation или перечислять TEB и извлекать CID, либо переключать контекст на другие потоки захватом глобальных функций/ переменных, или иные разные способы. Если описатели имеются - перечислять их и получать инфу(SystemHandleInformation). 4. Что значит получить "стеки" ? Если нужен текущий адрес - тогда из контекста извлечь регистр Eip. Если нужен диапазон, то определить TEB(ThreadBasicInformation) и извлечь из него базу, лимит и пр. инфу. 5. Не понятно.
1. Не то написал, почемуто я подумал что там movsb Что говорит отладчик про регион память по 0x30000 ?
Вот исправил, появилась другая запара. 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 вроде четко отработал значит читать можно, я даже реализовал тред суспенд для всех тредов кроме моего, где грабли, у меня уже чердак кипит! Хелп ми плиззззззззз
00010000 00001000 Priv 00021004 RW RW 00020000 00001000 Priv 00021004 RW RW 0012A000 00001000 Priv 00021004 RW RW вот, если ты про мемори мап?!?!
Я сначала думал, что дело в том, что я пытаюсь читать, пока другой тред пишет, я сделал суспенд всем тредам блин пофиг терь в другом месте вылетает!
Xect0r Регион 0x30000 не выделен, разумеется исключение возникает. Это вы обратились к сторожевой странице стека чужёго потока.