Сравнение строк в RING0

Тема в разделе "WASM.BEGINNERS", создана пользователем PsReadRtfm, 16 дек 2006.

  1. PsReadRtfm

    PsReadRtfm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    32
    Перехватываю ZwTerminateProcess , получаю имя процесса по его HANDLE , но не могу сравнить с тем что мне нужно, memcmp всегда -1 возвращяет.помогите.
    Что я не так написал ?
    Код (Text):
    1. BOOL GetProcessName( HANDLE hndl )
    2. {
    3.     PEPROCESS            curproc;
    4.     CHAR                *nameptr;
    5.     CHAR                *fileptr = "core.exe";
    6.  
    7.     curproc     = GetProcessByHandle(hndl);
    8.     nameptr     = (PCHAR) curproc + gProcessNameOffset;
    9.     ObDereferenceObject(&curproc);
    10.  
    11.     DbgPrint("ФАЙЛ : %s | НАШ : %s",nameptr,fileptr);
    12.     if (memcmp(&nameptr,&fileptr,16) == 0)
    13.     {
    14.         return TRUE;
    15.     }   else    {
    16.         return FALSE;
    17.     }
    18.  
    19.     return FALSE;
    20. }
    21. //################################################################################################################################################
    22. //################################################################################################################################################
    23. NTSTATUS NewZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus)
    24. {
    25.     NTSTATUS                 NZTP_STATUS;
    26.  
    27.     if (GetProcessName( ProcessHandle ) == TRUE)
    28.     {
    29.         #ifdef DEBUG
    30.             DbgPrint("Исключение");
    31.         #endif
    32.         NZTP_STATUS = STATUS_ACCESS_DENIED;
    33.     }    else    {
    34.         #ifdef DEBUG
    35.             DbgPrint("Другой файл");
    36.         #endif
    37.         NZTP_STATUS = OldZwTerminateProcess(ProcessHandle, ExitStatus);
    38.     }
    39.     return NZTP_STATUS;
    40. }
    [​IMG]
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    nameptr выодиться правильное?
    ИМХО проще быстро написать свою strcmp.
    Код (Text):
    1. ULONG mystrcmp(char *str1, char *str2){
    2.     while(*str1 && *str2)
    3.         if(*str1 == *str2){
    4.             str1++;
    5.             str2++;
    6.         }else
    7.             return 0;
    8.     if(*str1 && !*str2)
    9.         return 0;
    10.     else
    11.         if (*str2 && !*str1)
    12.             return 0;
    13.     return 1;
    14. }
     
  3. PsReadRtfm

    PsReadRtfm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    32
    DbgPrint(nameptr) выводит нормально именно то что мне надо, я уже всё пробовал и strcmp,memcmp,RtlCompareMemory,strstr :)
    P.S сейчас попробую твою функцию
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
     
  5. PsReadRtfm

    PsReadRtfm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    32
    нифига, memcmp возвращяет 0 если строки равны !
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    я про mystrcmp.
     
  7. PsReadRtfm

    PsReadRtfm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    32
    извиняюсь :) я думал вы про memcmp
     
  8. PsReadRtfm

    PsReadRtfm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    32
    BSOD, сейчас выложу дамп
     
  9. PsReadRtfm

    PsReadRtfm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    32
    if (mystrcmp(nameptr,fileptr) == 1)
     
  10. PsReadRtfm

    PsReadRtfm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    32
    так кто знает как сравнить 2 указателя в ring0 ? \=
     
  11. PsReadRtfm

    PsReadRtfm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    32
    Странно, memcmp вроде "обязан" вернуть 0
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    значит на вход NULL подаётся.
     
  13. PsReadRtfm

    PsReadRtfm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    32
    нет, я DbgPrintом проверяю обе переменных, там всё в порядке. Блин :dntknw:
     
  14. PsReadRtfm

    PsReadRtfm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    32
    Блин ну никто не сталкивался чтоли ? (((
     
  15. PsReadRtfm

    PsReadRtfm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    32
    выложил рисунок , блин уже даже бубен не помогает :dntknw:
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1.  if (memcmp(&nameptr,&fileptr,16) == 0)
    Правильнее
    Код (Text):
    1.  if (memcmp(nameptr, fileptr, 8) == 0)
     
  17. PsReadRtfm

    PsReadRtfm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    32
    Я и так пробовал :dntknw: синий экран выпрыгивает.
     
  18. bolkin

    bolkin New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    34
    Адрес:
    Israel
    Код (Text):
    1. fa79751a e8abffffff      call    driver+0x4ca (fa7974ca) ; ... ObReferenceObjectByHandle(...)
    2.  
    3. fa797525 8d3401          lea     esi,[ecx+eax] ; nameptr     = (PCHAR) curproc + gProcessNameOffset;
    4. ...
    5. fa79754d f3a7            repe cmps dword ptr [esi],dword ptr es:[edi] ds:0023:00000174=???????? es:0023:fa7974ea=65726f63
    потому как видимо ObReferenceObjectByHandle вернул ошибку которую ты не проверяешь.

    http://www.osronline.com/ddkx/kmarch/k107_54qa.htm
     
  19. PsReadRtfm

    PsReadRtfm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    32
    Я же написал, чтобы я не делал, BSOD выходит или на сравнении указателей или при попытки скопировать чтото и этих указателей, ObReferenceObjectByHandle не причём.
     
  20. bolkin

    bolkin New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    34
    Адрес:
    Israel
    угу, только дамп говорит что curproc+gProcessNameOffset = 0х0174 - что ты там сравниваешь?