Поиск функций по хэшам

Тема в разделе "WASM.BEGINNERS", создана пользователем _Sl4yer, 14 сен 2009.

  1. _Sl4yer

    _Sl4yer New Member

    Публикаций:
    0
    Регистрация:
    2 мар 2009
    Сообщения:
    55
    День добрый уважаемые!
    Пишу процедурку для поиска функций по хэшам, для р0.
    Но есть одна проблема, в коде указанно:
    Код (Text):
    1. proc SearchFunc,dwHash
    2.  
    3.     pushad
    4.     push        eax
    5.     sidt        fword [esp-2]
    6.     pop         esi
    7.     mov         ebx, [esi+4]  
    8.     mov         bx,  [esi+0]    
    9.     mov         ecx, 0FFFh
    10.     or          ebx, ecx
    11.     inc         ecx          
    12.     inc         ebx
    13.  
    14. .find_base:            
    15.     sub     ebx, ecx
    16.     mov     dx, [ebx]
    17.     not     dx
    18.     cmp     dx, not 'MZ'
    19.     jne     .find_base
    20.     mov     edx, [ebx+3Ch]  
    21.     cmp     edx, ecx
    22.     jae     .find_base
    23.     cmp     edx, 40h
    24.     jb      .find_base
    25.     mov     eax, [ebx+edx]
    26.     neg     eax
    27.     cmp     eax, -'PE'
    28.     jne     .find_base
    29.     mov     eax,ebx            
    30.    
    31.     mov     edx, [eax+3Ch]    
    32.     mov     edx, [eax+edx+78h]
    33.     add     edx, eax          
    34.     mov     ebx, [edx+20h]    
    35.     add     ebx, eax          
    36.     xor     edi, edi          
    37.     mov     ecx, [edx+18h]    
    38.  
    39.     push    eax                
    40.     push    edx                
    41.    
    42.     mov     esi, [ebx]        
    43.     add     esi,eax        
    44.    
    45.     xor     eax,eax
    46.    
    47. .find_func:
    48.                    
    49.     cdq                        
    50.    
    51. .calc:
    52.                                
    53.     lodsb
    54.     or al,al
    55.     jz .compare
    56.     ror edx,07h
    57.     add edx,eax
    58.     jmp .calc
    59.  
    60. .compare:    
    61.  
    62.     cmp     edx,[dwHash]
    63.     jz      .finded
    64.     inc     edi
    65.     add     ebx, 4
    66.     loop    .find_func
    67.    
    68. .finded:
    69.    
    70.     pop edx                  
    71.     pop eax                    
    72.  
    73.     mov     ecx, [edx+24h]    
    74.     add     ecx, eax          
    75.     movzx   ecx, word[ecx+edi*2]
    76.    
    77.     mov     edi, [edx+1Ch]    
    78.     add     edi, eax          
    79.    
    80.     add     eax,[edi+ecx*4] ;На этом месте BSOD.
    81.     mov     edx,[dwHash]
    82.     mov     [edx],eax
    83.     popad
    84.         ret
    85. endp
    Вот никак не могу разобраться в причине падения.. Подскажите пожалуйста.
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    _Sl4yer
    глянь в отладчике не расбалансирован ли стэк
     
  3. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Нет. Дело не в стеке.
    В драйверах частенько встречаются форварды. Т.е. не адресс функции, а запись вида SomeModule.SomeFunc
    О корректности указателя в данном случае говорить не приходится. :)

    вот тут более подробно.
     
  4. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Обрабатываются форварды достаточно просто.

    Прежде чем, считать дворд из ИАТ, проверяешь, не попадает ли указатель в таблицу экспорта (т.е. берешь РВА таблицы экспорта модуля из РЕ и берешь оттуда размер) Если указатель больше РВА экспорта но меньше "рва+размер" - это форвард. До точки - имя модуля. После точки - имя функции.

    Находишь базу модуля в списке. И вновь ишешь апишку в экспорте найденного модуля.
     
  5. _Sl4yer

    _Sl4yer New Member

    Публикаций:
    0
    Регистрация:
    2 мар 2009
    Сообщения:
    55
    ну, для теста передаю хэш DbgPrint. Никаких форвардов там нет ведь? И вообще есть ли в ntoskrnl форварды?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    intel_x128
    Это нужно правильно экспорт обрабатывать, например в одном из модулей семёрки такое было - просто не нужно отнимать начальный ординал, если результат получается отрицательный:
    Код (Text):
    1.     mov ecx,ExportDirectory    
    2.     assume ecx:PIMAGE_EXPORT_DIRECTORY
    3.     mov eax,[ecx].AddressOfNameOrdinals
    4.     add eax,ebx
    5.     movzx edi,word ptr [2*edi+eax]
    6.     .if edi
    7.       .if edi >= [ecx]._Base
    8.       sub edi,[ecx]._Base
    9.       .endif
    10.     inc edi
    11.     .endif
    12.     mov esi,[ecx].AddressOfFunctions
    13.     add esi,ebx
    14.     mov eax,dword ptr [4*edi + esi]
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    ребят, а как можно сделать в масм32 в своей дллке форвард, по возможности
    штатными средствами?
     
  8. _Sl4yer

    _Sl4yer New Member

    Публикаций:
    0
    Регистрация:
    2 мар 2009
    Сообщения:
    55
    Ну, подскажите пожалуйста, в чем у меня проблема? Я даже и не предполагаю.. Надеюсь только на вашу помощь.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    _Sl4yer
    Крэшдамп где, уже устал повторять.