Что может быть плохого в такой функции ?

Тема в разделе "WASM.WIN32", создана пользователем WIN32, 23 мар 2011.

  1. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Желателен конструктивный флейм :)
    Код (Text):
    1. BOOL NAKED CompareCurrentProcess(PCHAR pszName)
    2. {
    3.     /*
    4.         1. Found PEB
    5.         2. Found _RTL_USER_PROCESS_PARAMETERS
    6.         3. Found _RTL_USER_PROCESS_PARAMETERS->ImagePathName
    7.         4. Convert UNICODE to ANSI
    8.         5. compare strings
    9.     */
    10.     __asm {
    11.         MOV     ESI,ESP                         // SAVE STACK PTR
    12.  
    13.         MOV     EAX,DWORD PTR FS:[0x30]         // eax == PEB
    14.         MOV     EAX,DWORD PTR DS:[EAX+0x10]     // eax == _RTL_USER_PROCESS_PARAMETERS
    15.         ADD     EAX,0x38                        // eax == _RTL_USER_PROCESS_PARAMETERS->ImagePathName
    16.        
    17.         XOR     EDX,EDX                         //
    18.         XOR     ECX,ECX                         //
    19.         XOR     EDI,EDI                         //
    20.                
    21.         MOV     CL, BYTE PTR [EAX]              // CL = UNICODE_STRING.Length in bytes
    22.        
    23.         SUB     ESP,ECX                         // reserve in stack CL bytes
    24.                    
    25.         ADD     EAX,4                           // EAX ptr to WCHAR ImagePathName
    26.         MOV     EAX,DWORD PTR [EAX]             // EAX = PWCHAR
    27.  
    28. next_char:
    29.         CMP     CL,0                            // WCHAR end
    30.         JZ      end;
    31.  
    32.         MOV     DL,BYTE PTR [EAX]               // DL == *(PCHAR)WCHAR
    33.         ADD     EAX,2                           // GOTO next WIDEchar
    34.         MOV     BYTE PTR [ESP],DL               // SAVE char in memory reserved in stack
    35.         INC     ESP                             // pStr++
    36.         INC     EDI                             // pStrLen++
    37.         SUB     CL,2                            // Length--;
    38.         jmp     next_char                       // goto_next;
    39. end:
    40.         MOV     BYTE PTR [ESP],0                // *pStr = 0; null terminated
    41.         SUB     ESP,EDI                         // pStr = (PCHAR)(pStr - pStrLen)
    42.        
    43.         XOR     EDX,EDX
    44.         XOR     ECX,ECX
    45.  
    46.         mov     ecx,esp                         // ecx = pStr
    47.         mov     edx,esp                         // edx = pStr
    48.  
    49.         //
    50.         // HERE FOUND image file name
    51. m_loop:
    52.         cmp     edi,0
    53.         jz      file_founded
    54.  
    55.         cmp     byte ptr [edx],0x5C             // '\'
    56.         JZ      founded;
    57.         inc     edx
    58.         dec     edi
    59.         jmp     m_loop
    60.  
    61. founded:
    62.         dec     edi
    63.         mov     ecx,edx
    64.         inc     edx
    65.         jmp     m_loop
    66.  
    67. file_founded:
    68.         push    esi
    69.         inc     ecx
    70.         push    ecx
    71.         push    dword ptr [esi+4]
    72.         call    my_strcmp
    73.  
    74.         pop     esi
    75.         mov     esp,esi
    76.  
    77.         ret    
    78.     }
    79. }
     
  2. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    1. ассемблерные вставки не прокатят на x64
    2. find - неправильный глагол; "founded" означает совсем не то, что хотел сказать аффтар.
     
  3. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    1. systeminfo|grep "based" > Тип системы: x64-based PC. Отлично работает код.
    2. Я думаю это всего лишь метки :) founded наверное имелось ввиду что найден символ '\'


    p.s. тестировал на x86/x64 Win7/XP
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    WIN32

    Зачем это писать на ассемблере?
     
  5. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    1. Инлайновый асм там, где он совершенно не нужен (как следствие - не соберётся нативно под x86_64).
    2. Hardcoded смещения полей в PEB (на разных архитектурах они будут отличаться из-за разной размерности указателей).
    3. Ошибки в английском.
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    даааа... канеш в эмуляторе отлично работает)

    затем, что код скопипастили без понимания...
     
  7. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    1. Она написана на asm. Его следует использовать только когда без него уже никак не выйдет.
    2. Почему она ANSI?
    3. Зачем все эти извращения с харкодом? На виста и выше будет достаточно NtQueryInformationProcess, а затем RtlEqualUnicodeString.
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    или __readfsdword для x86, __readgsqword для x64, плюс правильно объявленная структура PEB, если уж так хочется через пеб решить задачу, или если нужно решить задачу без таблицы импорта))) а так еще проще - GetProcessFileName из kernel32.dll)))

    ЗЫ http://govnokod.ru/6075
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Rel

    Еа!
     
  10. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Rel, Вы такой смешной :)


    Всем спасибо, тему можно закрыть :)