День добрый уважаемые! Пишу процедурку для поиска функций по хэшам, для р0. Но есть одна проблема, в коде указанно: Код (Text): proc SearchFunc,dwHash pushad push eax sidt fword [esp-2] pop esi mov ebx, [esi+4] mov bx, [esi+0] mov ecx, 0FFFh or ebx, ecx inc ecx inc ebx .find_base: sub ebx, ecx mov dx, [ebx] not dx cmp dx, not 'MZ' jne .find_base mov edx, [ebx+3Ch] cmp edx, ecx jae .find_base cmp edx, 40h jb .find_base mov eax, [ebx+edx] neg eax cmp eax, -'PE' jne .find_base mov eax,ebx mov edx, [eax+3Ch] mov edx, [eax+edx+78h] add edx, eax mov ebx, [edx+20h] add ebx, eax xor edi, edi mov ecx, [edx+18h] push eax push edx mov esi, [ebx] add esi,eax xor eax,eax .find_func: cdq .calc: lodsb or al,al jz .compare ror edx,07h add edx,eax jmp .calc .compare: cmp edx,[dwHash] jz .finded inc edi add ebx, 4 loop .find_func .finded: pop edx pop eax mov ecx, [edx+24h] add ecx, eax movzx ecx, word[ecx+edi*2] mov edi, [edx+1Ch] add edi, eax add eax,[edi+ecx*4] ;На этом месте BSOD. mov edx,[dwHash] mov [edx],eax popad ret endp Вот никак не могу разобраться в причине падения.. Подскажите пожалуйста.
Нет. Дело не в стеке. В драйверах частенько встречаются форварды. Т.е. не адресс функции, а запись вида SomeModule.SomeFunc О корректности указателя в данном случае говорить не приходится. вот тут более подробно.
Обрабатываются форварды достаточно просто. Прежде чем, считать дворд из ИАТ, проверяешь, не попадает ли указатель в таблицу экспорта (т.е. берешь РВА таблицы экспорта модуля из РЕ и берешь оттуда размер) Если указатель больше РВА экспорта но меньше "рва+размер" - это форвард. До точки - имя модуля. После точки - имя функции. Находишь базу модуля в списке. И вновь ишешь апишку в экспорте найденного модуля.
ну, для теста передаю хэш DbgPrint. Никаких форвардов там нет ведь? И вообще есть ли в ntoskrnl форварды?
intel_x128 Это нужно правильно экспорт обрабатывать, например в одном из модулей семёрки такое было - просто не нужно отнимать начальный ординал, если результат получается отрицательный: Код (Text): mov ecx,ExportDirectory assume ecx:PIMAGE_EXPORT_DIRECTORY mov eax,[ecx].AddressOfNameOrdinals add eax,ebx movzx edi,word ptr [2*edi+eax] .if edi .if edi >= [ecx]._Base sub edi,[ecx]._Base .endif inc edi .endif mov esi,[ecx].AddressOfFunctions add esi,ebx mov eax,dword ptr [4*edi + esi]
Ну, подскажите пожалуйста, в чем у меня проблема? Я даже и не предполагаю.. Надеюсь только на вашу помощь.