eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 1 марта!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: stran34 (+4 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Программирование —› Затираем следы в PEB
. 1 . 2 . >>
Посл.ответ Сообщение


Ранг: 522.3 (!)
Статус: Участник
5KRT

Создано: 31 июля 2010 14:19 · Поправил: daFix New!
Цитата · Личное сообщение · #1

Состряпал такой не хитрый код, который должен избавить нас от IsDebuggerPresent:
Code:
  1. DWORD offset;
  2. offset = ThreadLocalBase + 0x18;
  3. ReadProcessMemory(pi.hProcess, (void*)offset, &offset,sizeof(offset),0);
  4. offset+=0x30;
  5. ReadProcessMemory(pi.hProcess, (void*)offset, &offset,sizeof(offset),0);
  6. offset+=0x2;
  7. WriteProcessMemory(pi.hProcess, (void*)offset, "0", 1,0);

Пробовал запускать на болванке, но палимся, не могу понять где ошибся.

ThreadLocalBase получаю из события CREATE_PROCESS_DEBUG_EVENT:
Code:
  1. ThreadLocalBase = (long)DebugEvent.u.CreateProcessInfo.lpThreadLocalBase;


Статус: Пришелец

Создано: 31 июля 2010 14:25 New!
Цитата #2

Лучше дай скомпиленный вариант.

daFix пишет:
WriteProcessMemory(pi.hProcess, (void*)offset, "0", 1,0);

Это ты прикалываешься? Почему "0"?

Думается мне вот так:

Code:
  1. DWORD offset;
  2. char buff = 0;
  3. offset = ThreadLocalBase + 0x18;
  4. ReadProcessMemory(pi.hProcess, (void*)offset, &offset,sizeof(offset),0);
  5. offset+=0x30;
  6. ReadProcessMemory(pi.hProcess, (void*)offset, &offset,sizeof(offset),0);
  7. offset+=0x2;
  8. WriteProcessMemory(pi.hProcess, (void*)offset, &buff, 1,0);

Ранг: 61.4 (постоянный)
Статус: Участник

Создано: 31 июля 2010 14:46 New!
Цитата · Личное сообщение · #3

> WriteProcessMemory(pi.hProcess, (void*)offset, "0", 1,0);
он тебе и записывает значение 0x30
> WriteProcessMemory(pi.hProcess, (void*)offset, buff, 1,0);
так неверно, ловим #ac
скорее
Code:
  1. WriteProcessMemory(pi.hProcess, (void*)offset, (void *)&buff, sizeof(buff), 0);

да, и ничего не слышали про PUCHAR?


Ранг: 522.3 (!)
Статус: Участник
5KRT

Создано: 31 июля 2010 14:49 · Поправил: daFix New!
Цитата · Личное сообщение · #4

int
Блин, вот я олень, сразу не сообразил что это будет байт 0x30
Спасибо, заработало!

Ну тогда уже в догонку, чтобы не создавать новых тем, видел как-то доку по антиотладке,
где описывались API и поля PEB, откуда они берут данные, по которым мы палимся
Может кто нибудь сказать её название?

ADDED
n0name
Признаться честно, не слышал, сейчас погуглю


Статус: Пришелец

Создано: 31 июля 2010 14:55 New!
Цитата #5

n0name пишет:
WriteProcessMemory(pi.hProcess, (void*)offset, buff, 1,0);

Видимо, ты про мой пост, ну так я уже исправил ;)

n0name пишет:
ничего не слышали про PUCHAR

это не стандартный тип, это тип из винды, в топку такое

daFix пишет:
сейчас погуглю


Ранг: 61.4 (постоянный)
Статус: Участник

Создано: 31 июля 2010 14:59 New!
Цитата · Личное сообщение · #6

> это не стандартный тип, это тип из винды, в топку такое
ага, ага, а WriteProcessMemory это кроссплатформенное решение

typedef unsigned char * PUCHAR;

и тогда не понадобитсья конвертация dword'ов в указатели.
что-то типа такого:
Code:
  1. PUCHAR offset = 0;
  2. char buff = 0;
  3.  
  4. offset = (PUCHAR)ThreadLocalBase + 0x18;
  5. ReadProcessMemory(pi.hProcess, offset, &offset, sizeof(offset), 0);
  6. offset += 0x30;
  7. ReadProcessMemory(pi.hProcess, offset, &offset, sizeof(offset), 0);
  8. offset += 0x2;
  9. WriteProcessMemory(pi.hProcess, offset, &buff, sizeof(buff), 0);


ну и само собой более x64-safe.


Ранг: 238.8 (наставник)
Статус: Участник
CyberHunter

Создано: 31 июля 2010 15:01 New!
Цитата · Личное сообщение · #7

IsDebuggerPresent берет значение из _PEB.BeingDebugged


Code:
  1. MOV EAX,DWORD PTR FS:[18h]
  2. MOV EAX,DWORD PTR DS:[EAX+30h]
  3. MOVZX EAX,BYTE PTR DS:[EAX+2]


также _PEB.NtGlobalFlag указывает на наличие отладчика

Code:
  1. mov eax,dword ptr fs:[030h]
  2. add eax,068h
  3. mov eax,dword ptr ds:[eax]
  4. cmp eax,070h

Ранг: 255.5 (наставник)
Статус: Участник
vx

Создано: 31 июля 2010 15:09 New!
Цитата · Личное сообщение · #8

Способов обнаружить отладчик куча, неужеле сейчас есчо ктото читает флажки из PEB


Ранг: 522.3 (!)
Статус: Участник
5KRT

Создано: 31 июля 2010 15:14 New!
Цитата · Личное сообщение · #9

n0name
Ничего страшного, пусть будет DWORD'ом

Flint
В приведённом коде я какраз и затирал _PEB.BeingDebugged
А вот за _PEB.NtGlobalFlag огромное спасибо!

Ну и до кучи, не выложите проги для теста, которые показывают на каком из методов детекта палится отладчик?

Ранг: 255.5 (наставник)
Статус: Участник
vx

Создано: 31 июля 2010 15:19 · Поправил: Clerk New!
Цитата · Личное сообщение · #10

daFix
Есть простой способ. Задержки померять. Под отладчиком каждое из 7 событий вносит огромные задержки. Просто измеряем число фолтов за единицу времени. ~2k раз меньше будет чем без отладчика. Или вообще можно отладчик отключить от процесса.


Ранг: 355.4 (мудрец)
Статус: Uploader
5KRT

Создано: 31 июля 2010 15:20 · Поправил: Coderess New!
Цитата · Личное сообщение · #11

Набор примеров антиотладок от ap0x'а
ap0x.jezgra.net/protection.html


Ранг: 238.8 (наставник)
Статус: Участник
CyberHunter

Создано: 31 июля 2010 15:22 New!
Цитата · Личное сообщение · #12

Coderess пишет:
Набор примеров антиотладок от ap0x'а


угу ap0x.jezgra.net/protection.html


Ранг: 522.3 (!)
Статус: Участник
5KRT

Создано: 31 июля 2010 15:25 New!
Цитата · Личное сообщение · #13

Clerk
Знаю что PEB морально устарел, но всёравно есть такие динозавры как армадилла, которые наверняка
всё ещё крутят _PEB.BeingDebugged.
Пока закрою PEB, потом буду извращаться с АнтиАнтиБебагом по мере необходимости.

Coderess
Спасибо!

Ранг: 53.9 (постоянный)
Статус: Участник

Создано: 1 августа 2010 03:04 New!
Цитата · Личное сообщение · #14

Clerk пишет:
неужеле сейчас есчо ктото читает флажки из PEB

Старфорц пятый, причем через АПИ И насколько помню - это единственный его антидебаг


Ранг: 240.2 (наставник)
Статус: Участник

Создано: 1 августа 2010 11:42 New!
Цитата · Личное сообщение · #15

последний стар много чего читает через PEB

Ранг: 516.1 (!)
Статус: Участник

Создано: 2 августа 2010 09:19 · Поправил: Av0id New!
Цитата · Личное сообщение · #16

вот тут можно кое-что подсмотреть про затирание следов в PEB, где-то еще был более новый вариант
http://www.accessroot.com/arteam/site/download.php?view.94

код в последнем посте (прячемся от IsDebuggerPresent и NtGlobalFlags)
http://www.accessroot.com/arteam/forums/index.php?showtopic=8609

можно еще по аналогии дописать проверку heap-flags
Code:
  1. mov eax, fs:[30h]
  2. mov eax, [eax+18h]
  3. mov eax, [eax+10h]

Ранг: 255.5 (наставник)
Статус: Участник
vx

Создано: 4 августа 2010 17:44 New!
Цитата · Личное сообщение · #17

daFix
Нужно было выполнить задержку, вспомнил про этот топик:
Code:
  1. YIELD_CTX macro Reg32
  2.          mov eax,3
  3.          ifdef Reg32
  4.          xor Reg32,Reg32
  5.          endif
  6.          mov gs,ax
  7. @@:
  8.          mov ax,gs        ; ~ iret
  9.          ifdef Reg32
  10.          inc Reg32
  11.          endif
  12.          test eax,eax
  13.          jnz @b
  14. endm
  15.  
  16. YIELD_NPX macro Reg32
  17.          fnop
  18.          ifdef Reg32
  19.          xor Reg32,Reg32
  20.          endif
  21. @@:
  22.          smsw eax         ; 16i
  23.          ifdef Reg32
  24.          inc Reg32
  25.          endif
  26.          bt ax,1 ; Cr0.MP
  27.          jnc @b
  28. endm

Чтоже будет при трассировке ?


Ранг: 522.3 (!)
Статус: Участник
5KRT

Создано: 4 августа 2010 20:25 New!
Цитата · Личное сообщение · #18

Clerk
На трассировку я пока не замахиваюсь. Пишется по мере возникновения новых задач, поэтому
для личного применения вполне сностно

Ранг: 255.5 (наставник)
Статус: Участник
vx

Создано: 4 августа 2010 20:50 New!
Цитата · Личное сообщение · #19

daFix

Раз вам ничего не интересно, тогда решение в лоб:
Получаете описатель отладочного порта посредством NtQueryInformationProcess(ProcessDebugObjectHandle) и удаляете его нафиг с помощью NtRemoveProcessDebug. Добавляете сюда NtContinue чтобы наебать трейсер или например это http://exelab.ru/f/index.php?action=vthread&forum=6&topic=16000
Всё тривиально. А вы там какието флажки в среде чекаете


Ранг: 355.4 (мудрец)
Статус: Uploader
5KRT

Создано: 4 августа 2010 21:58 New!
Цитата · Личное сообщение · #20

Clerk

Из драйвера делаю так

Code:
  1. VOID DebugPortClean()
  2. {
  3.          PEPROCESS peproc = NULL;
  4.  
  5.          PsLookupProcessByProcessId((HANDLE)PID, &peproc);
  6.          if (peproc->DebugPort)
  7.          {
  8.                  peproc->DebugPort = (PVOID)0;
  9.          }
  10. }


Есть разница если сделаю в юзермоде по вашему?
NtQueryInformationProcess(ProcessDebugObjectHandle) и удаляете его нафиг с помощью NtRemoveProcessDebug

Ранг: 255.5 (наставник)
Статус: Участник
vx

Создано: 4 августа 2010 22:05 · Поправил: Clerk New!
Цитата · Личное сообщение · #21

Coderess
Из лузермода обьекты не доступны для записи и чтения, так как в ядерной памяти расположены. А так по сути разницы нет.


Ранг: 647.0 (!)
Статус: Участник
ALIEN Hack Team

Создано: 5 августа 2010 11:26 · Поправил: ARCHANGEL New!
Цитата · Личное сообщение · #22

По сути нет, но EPROCESS разнится от версии винды к версии. Нужно либо точно вычислять смещения DebugObject, либо юзать экспортируемые функции. Это, конечно, не значит, что из ядра никак нельзя это сделать, опираясь на экспорт. В ядре тоже есть нужные для такого дела функи.

Только во всём этом есть принципиальная разница. Если daFix хотел скрыть присутствие отладчика, то метод Clerk'a выполнит Detach отладчика от отлаживаемого процесса. Требовалось совсем не это.


Ранг: 522.3 (!)
Статус: Участник
5KRT

Создано: 5 августа 2010 12:12 New!
Цитата · Личное сообщение · #23

ARCHANGEL
После удаления отладочного порта, отладчик перестанет получать отладочные сообщения?


Ранг: 647.0 (!)
Статус: Участник
ALIEN Hack Team

Создано: 5 августа 2010 13:33 New!
Цитата · Личное сообщение · #24

daFix
Да, по аналогии с DebugActiveProcessStop.

Ранг: 255.5 (наставник)
Статус: Участник
vx

Создано: 5 августа 2010 15:54 New!
Цитата · Личное сообщение · #25

ARCHANGEL
Скрыть отладчик не возможно. Тот который системный механизм пользовательский.


Ранг: 522.3 (!)
Статус: Участник
5KRT

Создано: 7 августа 2010 00:37 · Поправил: daFix New!
Цитата · Личное сообщение · #26

Clerk, советы дельные, только до них дорасти надо
Можете пролить свет на одну фигню?
Потёр PEB, начал запускать разные проты. Протестировал EXECryptor и ASProtect 2.3 max prot с затёртым PEB.
ASPrptect запустился без проблем, а вот EXECryptor ни в какую, но если PEB не трогать, то запускается нормально
В PEB затирал только _PEB.BeingDebugged
Это в крипторе какая-то извратная проверка или я что-то не учёл?

Ранг: 61.4 (постоянный)
Статус: Участник

Создано: 7 августа 2010 07:28 New!
Цитата · Личное сообщение · #27

некоторые юзают самоотладку.

Ранг: 255.5 (наставник)
Статус: Участник
vx

Создано: 7 августа 2010 15:38 New!
Цитата · Личное сообщение · #28

daFix
> Это в крипторе какая-то извратная проверка или я что-то не учёл?
Вам уже стопяцот раз сказали что способов обнаружить отладчик немеряно. Откуда мне знать что эта кривая тулза делает.


Ранг: 522.3 (!)
Статус: Участник
5KRT

Создано: 7 августа 2010 16:51 · Поправил: daFix New!
Цитата · Личное сообщение · #29

n0name
В крипторе нету DebugBlocker'а
Clerk
Обращение шло не конкретно к вам, а ко всем, кто заходит в этот топик.
Расчёт был на людей, кто разбирается в крипторе
Разобрался в чём дело. Надо было затирать поля PEB после попадания на System Breakpoint

Ранг: 255.5 (наставник)
Статус: Участник
vx

Создано: 7 августа 2010 20:27 New!
Цитата · Личное сообщение · #30

daFix
Смотрел эту поделку http://exelab.ru/download.php?action=get&n=NzM1
так у меня на XP эта херня отваливается на сепшине, потом вобще зависает.
. 1 . 2 . >>
 eXeL@B —› Программирование —› Затираем следы в PEB

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS