На что влияет NtGlobalFlag ?

Тема в разделе "WASM.WIN32", создана пользователем Asterix, 3 июн 2005.

  1. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    Asterix

    дело вот в чем: метод в оригинале вызывает ZwQueryObject и в полученном списке структур ищет объект с именем DebugObject. Затем проверяется определенный флаг в этом объекте на основании чего делается вывод о работе под отладчиком.



    Теперь, в моем примере (я его писал под W2K) вывод о работе под отладчиком делается ТОЛЬКО на основании наличия объекта DebugObject (это неправильно, нужно еще и флаг проверять в этом объекте), но т.к. в W2K под отладчиком и без него этой структуры НЕТ, то и флаг проверять я уже не стал.



    Теперь, видать в WXP эта структура есть и под отладчиком и без него, поэтому мой тестовый пример все время будет писать что он под отладчиком.



    Аттачи с exetools на W2K тоже не работают как и ожидалось - не находится DebugObject и он никогда не найдет отладчик.
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    По DebugObject не детектит в NT4.0 и w2k (такой строки в ObjectInformation нету), debug2.exe олли не находит, но через ZwSetInformationThread прячет поток в w2k (в NT4.0 ZwSetInformationThread c параметром 17 (ThreadHideFromDebugger) возвращает ошибку)
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Насколько я понял по ZwQueryObject можно только определить, что в данный момент в системе зарегестрирован DebugObject (один или несколько ) и совершенно не факт, что отлаживают нашу прогу или вообще кого-то отлаживают. DebugObject создается автоматом при открытии процесса с флагом DEBUG_PROCESS (или даже не при открытии, а при вызове WaitForDebugEvent - не проверял), но он не удаляется автоматом при закрытии дебажного процесса. Поэтому, например, "безобидный" DebugObject может присутствовать если на компе запущена IDE Delphi или C++Builder'а, или ничего не отлаживающая "забытая" Оля после Debug->Close.



    Кстати, ради баловства можно и ничего не отлаживая просто создать DebugObject вызовом ZwCreateDebugObject или DbgUiConnectToDbg. Хэндл созданного объект записывается в TEB.DbgSsReserved (TEB+0F24h). Отсюда вопрос - почему в NT4.0 и w2k не детектится тип "DebugObject" ? Создаваться-то он должен, может он скрывается под другим типом или просто другим именем ? Можно полный списочек типов с числом хэндлов вывести до и после создания DebugObject и посмотреть что изменилось
     
  4. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    Я ещё тогда перерыл у себя \system32, эта строка встретилась только в ole32.dll
    Код (Text):
    1. NtSystemDebugControl            Implements a range of debugger support commands.
    2. NtRegisterThreadTerminatePort   A debugger registers for thread termination notification with this API.
    3.  
    4. NtCreateDebugObject             New to WinXP. Creates a debug object.
    5. NtDebugActiveProcess            New to WinXP. Enables a debugger to attach to an active process and debug it.
    6. NtDebugContinue Continue        New to WinXP. Allows a process to contiue a thread that has generated a debug event.
    7. NtQueryDebugFilterState         New to WinXP. Queries the debug filter state level for a specific component.
    8. NtRemoveProcessDebug            New to WinXP. Stops debugging the specified process.
    9. NtSetDebugFilterState           New to WinXP. Sets the debug output filter level for the specified component.
    10. NtSetInformationDebugObject     New to WinXP. Sets the attributes of a debug object.
    11. NtWaitForDebugEvent             New to WinXP. Waits for a debugging event on a process being debugged.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    bogrus

    Да, но ведь насколько я понимаю с подачи volodya поле TEB.DbgSsReserved существует во всех NT, причем

    DbgSsReserved[0] - объект синхронизации

    DbgSsReserved[1] - хендл LPC-порта на стороне клиента

    Что тогда скрывается за "объектом синхронизации" ?

    ИМХО отсутствие перечисленных тобой функций не доказывает, что никакого объекта синхронизации не создается. Посмотри что в твоем minidebug по адресу TEB+0F24h, но лучше бы конечно "огласить весь список, пжалста" ;)
     
  6. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Нули там у меня, я сделал 2 проги
    Код (Text):
    1. ;===========================================
    2. format      pe gui                          
    3. include     '%fasminc%\win32a.inc'          
    4. ;===========================================
    5. entry       $                              
    6.           ; int3                            
    7.             invoke  ExitProcess,0          
    8. ;===========================================
    9. data        import                          
    10. library     kernel32,'kernel32.dll'        
    11. include     '%fasminc%\apia\kernel32.inc'  
    12. end         data                            
    13. ;===========================================
    Одну без int3 стартую в олли (DEBUG_PROCESS), вторую с int3 запускаю сам потом аттачусь олькой (каталог ATTACH в аттаче :) В обоих снял дампы TEB\PEB, если надо можно по ним порытся
     
  7. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    bogrus

    Надеюсь это дампы Олиного TEB, а не твоей тестовой проги ;))
     
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Тестовой :), а зачем олиного, я чет не понял? Вот что возвращает ZwQueryObject(ObjectAllTypesInformation) в проге Broken Sword под олли



    [​IMG] _983607985__test_00403000.mem
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    bogrus

    В дебажной проге DbgSsReserved и в XP всегда по нулям - иначе это был бы еще один IsDebuggerPresent. Я так думаю ссылка на объект синхронизации должна быть в TEB отладчика (если она вообще туда пишется без спец запроса)



    Судя по дампу, имена типов похоже все стандартные, так что ловить тут видимо нечего (если и изменяется число хэндлов какого-то типа, то фиг знает сколько их должно быть)
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Asterix

    Не помешало бы краткое описалово приложить - по одним названиям опций не все понятно :dntknw:



    Защита от хип-триков работает

    [deleted], но заглянув в Memory map я ужаснулся - сколько твой хайдер длл-лек подгружает в память процесса. Получается за Олей ты тщательно все следы заметаешь, а сам нещадно топчешь в чужой избе :)))) Конечно если прога использует все эти dll, то вроде как подгрузка и не заметна.[/deleted]



    PS: Упс !!! Прошу прощения - с подгрузкой длл-лек меня похоже глюкануло :dntknw:( HideDebugger тут ни при чем
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    я уж испугался %)



    в этом релизе есть один маленький недочет, некритичный

    но в предыдущих было правильнее сделано в этом месте,

    поправлю в следующем



    с опциями и так вроде все понятно, единственное что

    можно сказать вторая опция скрывает только заголовок

    главного окна, класс окна нужно патчить вручную в OllyDbg.exe
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Решил продолжить топик, читаю на некоторых форумах что любой ring-3
    подвержен обнаружению путем трюка с INVALID_HANDLE, но не получилось
    проверить, у меня вроде как не работает, вот исходник вытащенный из xADT

    Код (Text):
    1. #include "Invalid_HandleException.h"
    2.  
    3. int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
    4. {
    5.     return TRUE ;
    6. }
    7.  
    8. void internalfcn(char *message, Result *bRet);
    9.  
    10. EXPORT Result tst_Invalid_HandleException(char *message) {
    11.  
    12.     Result bRet=UNKNOWN;
    13.    
    14.     try {
    15.         internalfcn(message, &bRet);
    16.     }
    17.     catch(...) {
    18.         strcat(message,"7!");
    19.         return bRet;
    20.        
    21.     }
    22.     return bRet;
    23. }
    24.  
    25.  
    26. void internalfcn(char *message, Result *bRet) {
    27.    
    28.     HANDLE hproc=OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
    29.        
    30.     strcat(message,"steps:");
    31.     if(hproc) {
    32.         __try {
    33.             strcat(message,"1, ");
    34.             *bRet=NEGATIVE;
    35.             RaiseException(0x0C0000008,0,0,NULL);
    36.             //If goes here means something has not went like expected, debugger catched exception.
    37.             strcat(message,"2, ");
    38.             CloseHandle(hproc);
    39.             *bRet=POSITIVE;
    40.         }
    41.         __finally {
    42.             DWORD deadcode=0x0DEADC0DE;
    43.             __try{
    44.                 strcat(message,"3, ");
    45.                 *bRet=POSITIVE;
    46.                 CloseHandle((LPVOID)deadcode); //raise exception, if handled by the debugger does not go on next instruction
    47.                 *bRet=NEGATIVE;
    48.                 strcat(message,"4, ");
    49.             }
    50.             __finally {
    51.                 *bRet=NEGATIVE;
    52.                 strcat(message,"5, ");
    53.                 CloseHandle(hproc);
    54.             }
    55.         }
    56.     }
    57.  
    58.     strcat(message,"6, ");
    59.     *bRet=POSITIVE;
    60.     CloseHandle(hproc);
    61. }
    62.  
    63. EXPORT char* tst_Invalid_HandleException_description()
    64. {
    65.     return "Test looking if the Invalid_Handle Exception is caught or not";
    66.  
    67. }
    68.  
    69. EXPORT char* tst_Invalid_HandleException_name()
    70. {
    71.     return "Invalid_Handle Exception Test";
    72. }
    73.  
    74. EXPORT char* tst_Invalid_HandleException_about() {
    75.     return "Implemented by Shub-Nigurrath, from an idea of deroko";
    76. }
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    вот вроде топик о том же http://www.wasm.ru/forum/viewtopic.php?pid=97123#p97123
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Asterix
    В OllyAdvanced галочка есть, игнорировать C0000008. А вообще да, -1 сразу отсекает, а любые другие значения трапаются.
     
  17. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    я что-то не понимаю суть способа
    Зачем в сорце открывают процесс?
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Сорец я тоже не понял. Может для того, чтобы открыт был какой-то хэндл. Хотя и без него работает.
     
  19. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    решил положить сорцы в этой теме, может кому сгодятся =)