Сейчас на форуме: tyns777 (+5 невидимых) |
![]() |
eXeL@B —› Программирование —› Как читать/писать FS (context.SegFs) из дебагера? |
Посл.ответ | Сообщение |
|
Создано: 11 августа 2007 13:22 · Личное сообщение · #1 Кое-что известно из MSDN о сегментном регистре FS. Как правильно записать туда из дебагера? Смотрю код IsDebug.asm из IsDebuggerPresent plugin для OllyDbg и не понимаю почему оно работает. Там есть код: mov eax,dword ptr fs:[30h] ; pointer to PEB add eax,2h mov byte_location,eax где dword ptr fs:[30h] - есть содержимое fs:[30h] в текущем потоке, как я понимаю - это поток созданный из дебагера, и соответственно, - читающий FS из процесса дебагера. Потом там вызывается Олина функция Writememory, которая пишет. У меня WriteProcessMemory (XP sp2) падает с ошибкой (писал по byte_location=7FFD4002) : 'Попытка обращения к неверному адресу'. Оно вобдщем-то не удивительно, потому что читаю мой FS а пишу в чужой. Возможно плагин написано в расчете на совпадение адресов в FS. Как мне кажется, этот код должен выполняться в отлаживаемом процессе. Может я где-то ошибаюсь. Но суть не в этом, нужна информация про то как туда писать/читать правильно. ![]() |
|
Создано: 11 августа 2007 16:11 · Личное сообщение · #2 |
|
Создано: 11 августа 2007 17:19 · Личное сообщение · #3 Код, вот он : bool RemoveIsDebuggerPresents(CONTEXT &context,PROCESS_INFORMATION &pi)
Функция вызывается из потока, который является дебагером, вызвающий WaitForDebugEvent и ContinueDebugEvent. ![]() |
|
Создано: 11 августа 2007 18:59 · Личное сообщение · #4 |
|
Создано: 11 августа 2007 19:59 · Личное сообщение · #5 проходил мимо просто не мог не ответить AlexKlm пишет: потому что читаю мой FS а пишу в чужой В этом ничего страшного, главное осознание этого факта, лично у меня когда-то тоже такое было) AlexKlm пишет: нужна информация про то как туда писать/читать правильно Если я тебя правильно понял, ты собираешся читать и писать в PEB процесса, я тут накидал код, посмотри если будет сложно, то могу потом предложить другой способ но он не такой "элегантный", хотя иногда я им пользуюсь ![]() ![]() |
|
Создано: 11 августа 2007 20:11 · Личное сообщение · #6 |
|
Создано: 11 августа 2007 21:01 · Личное сообщение · #7 Вот лог, что вышло: RemoveIsDebuggerPresents: Not BadReadPtr 7FFDD002 , OK RemoveIsDebuggerPresents: Not BadWritePtr 7FFDD002 , OK Мой процесс (дебагер): VirtualQueryEx( dwPageStartAdr: 7FFDD000 &mbi: 15CFD3C dwLength: 1C ) returns 1C VirtualQueryEx: _MEMORY_BASIC_INFORMATION : Base 7FFDD000 AllocationProtect ' "PAGE_READWRITE"' AllocationState ' "MEM_COMMIT"' RegionSize 1000 Protect ' "PAGE_READWRITE"' AllocationType ' "MEM_PRIVATE"' Чужой процесс (подопытный): VirtualQueryEx( dwPageStartAdr: 7FFDD000 &mbi: 15CFD3C dwLength: 1C ) returns 1C VirtualQueryEx: _MEMORY_BASIC_INFORMATION : Base 7FFDD000 AllocationProtect ' "(empty (0))"' AllocationState ' "MEM_FREE"' RegionSize 2000 Protect ' "PAGE_NOACCESS"' AllocationType ' "(empty (0))"' RemoveIsDebuggerPresents: WriteProcessMemory failed byte_location=7FFDD002 pErr=Попытка обращения к неверному адресу. Что-то не так, ведь должен же плагин работать. Там бы что-нибудь знакомое прочитать, чтобы понять что верный адрес читаю. Структура большая по размеру, но там все Reserved. ![]() |
|
Создано: 11 августа 2007 21:15 · Личное сообщение · #8 |
|
Создано: 11 августа 2007 21:50 · Личное сообщение · #9 |
|
Создано: 11 августа 2007 22:03 · Личное сообщение · #10 |
|
Создано: 11 августа 2007 22:21 · Личное сообщение · #11 Исходя из логов, я так понимаю код RemoveIsDebuggerPresents ты не переделал... моим тоже воспользоваться не хочеш... Попробую обьяснить тогда AlexKlm пишет: __asm{ mov eax,dword ptr fs:[30h] // ; pointer to PEB add eax,2h mov byte_location,eax } здесь ты получаеш адрес BeingDebugged структуры PEB своего(!) процесса (тот кот отлаживает) AlexKlm пишет: bool bRet=WriteProcessMemory(pi.hProcess, (PVOID)byte_location, &cNull, sizeof(BYTE), &dwBytesMoved); а здесь ты записываеш по этому адресу, но в другой(!) процесс (отлаживаемый) и ты считаеш это правильно? если не хочеш использовать код кот я дал, AlexKlm пишет: написать кусок кода и испольнить в другом процессе не проблема тогда так и делай, именно этот способ я иногда использую) ![]() |
|
Создано: 11 августа 2007 23:25 · Личное сообщение · #12 nik0g0rРезультат такой: По коду из IsDebug.asm адрес PEB = 7FFDC000 а по коду из be31_11.08.2007_CRACKLAB.rU.tgz - PEB.rar ( nik0g0r ) PEB = 7FFDE000 --------------------------------------------------------------- ошибка в 2 страницы Зато работает, вызвлал ReadProcessMemory еще раз и BeingDebugged = 00. ![]() |
|
Создано: 11 августа 2007 23:35 · Личное сообщение · #13 |
|
Создано: 12 августа 2007 00:51 · Поправил: AlexKlm · Личное сообщение · #14 |
|
Создано: 12 августа 2007 06:47 · Личное сообщение · #15 |
|
Создано: 13 августа 2007 19:55 · Личное сообщение · #16 pushick - а можно ли достать адрес TIB также, при помощи ntdll.dll, не выполняя код в подопытном процессе? Я понадеялся что это просто, оказалось - никто не хочет об этом распростроняться, писатели дебагеров. А пока я попробую вписать в процесс код, потом перевести на адрес кода eip подопытного: push eax mov eax, dword ptr fs:[0] int 3 ; - здесь я ловлю бряк и читаю из context.Eax что в fs:[0] pop eax int 3 ; - здесь я возвращаю eip на место (через context.Eip) ![]() |
|
Создано: 13 августа 2007 21:16 · Личное сообщение · #17 |
|
Создано: 13 августа 2007 21:53 · Личное сообщение · #18 |
|
Создано: 13 августа 2007 22:51 · Личное сообщение · #19 Вызвал GetThreadSelectorEntry, собрал : DWORD dwFS_Adr=MAKELONG(ldte.BaseLow, MAKEWORD(ldte.HighWord.Bytes.BaseMid,ldte.HighWord.Bytes.BaseHi) ); получил dwFS_Adr 7FFDF000. Проверил: VirtualQueryEx: _MEMORY_BASIC_INFORMATION : Base 7FFDF000 AllocationProtect "PAGE_READWRITE" AllocationState "MEM_COMMIT" RegionSize 1000 Protect "PAGE_READWRITE" AllocationType "MEM_PRIVATE" Похоже что правильно. Попробую рассмотреть что там лежит, надо же получить стека начало и. т.д. ![]() |
|
Создано: 13 августа 2007 23:18 · Поправил: AlexKlm · Личное сообщение · #20 Вот что там на начале страницы: 000000 00000000 FF FF FF FF 00 00 13 00 00 E0 12 00 00 00 00 00 |яяяя.....а......| 000010 00000010 00 1E 00 00 00 00 00 00 00 F0 FD 7F 00 00 00 00 |........аэ....| 000020 00000020 48 0E 00 00 78 0B 00 00 00 00 00 00 00 00 00 00 |H...x...........| 000030 00000030 00 F0 FD 7F 00 00 00 00 00 00 00 00 00 00 00 00 |.рэ............| Второй и третий DWORD очень похожи на стек. А Exception handler не установлен (-1). Считаю что эксперимент удался. Спасибо за помощь! ![]() |
|
Создано: 14 августа 2007 12:53 · Поправил: AlexKlm · Личное сообщение · #21 |
|
Создано: 15 августа 2007 05:23 · Личное сообщение · #22 |
|
Создано: 15 августа 2007 06:17 · Личное сообщение · #23 |
|
Создано: 17 августа 2007 07:03 · Личное сообщение · #24 |
|
Создано: 17 августа 2007 10:53 · Личное сообщение · #25 |
|
Создано: 17 августа 2007 16:03 · Личное сообщение · #26 Еще я бьюсь с одной проблемой. Никак не хочет загрузчик разрешить мне обработать точку останова на EP апликации запакованной ExeCryptor'ом. И это - серьезная проблема, и связана она, как я предполагаю, - с безопасностью. На обычных прогах все нормально, а тут - болт. Без WinIce бесполезно искать, можно попробовать методом перебора вариантов, попробовать убрать возможно установленный операционкой нелегальный обработчик. Но это - другая тема. Когда найду причину - сообщу. Спасибо всем за участие. ![]() |
|
Создано: 17 августа 2007 16:16 · Личное сообщение · #27 |
|
Создано: 17 августа 2007 16:19 · Личное сообщение · #28 |
|
Создано: 31 августа 2007 00:30 · Личное сообщение · #29 И что же? Кажется причина найдена, ещё не понял механизм, но копать надо в дата директорию TLS. Это я сам нашел, и только сейчас увидел что Archer правильно сказал, видимо. Ntdll.dll выходит туда. А я ссылку 4 го DWORD на ссылку на второй EP (который запускается раньше) обнулил, тогда апликация стала запускаться с EP указанного в PE заголовке. Ура! Осталось изучить материал по дата директории TLS. Наадеюсь что-то накопаю. ![]() |
|
Создано: 31 августа 2007 08:53 · Личное сообщение · #30 |
![]() |
eXeL@B —› Программирование —› Как читать/писать FS (context.SegFs) из дебагера? |