Почему LEA EBX,DWORD PTR SS:[ESP+6E] на байт длинее LEA EBX,DWORD PTR SS:[EBP+6E]??? Возможно ли написать функцию вычисляющую хеш строки, размером(функция) меньше 24 байт. Дано: в ecx длина строки в edi указатель на строку. P.S. Если не жалко, поделитесь пожалуйста своими поисковыми системами API функций. РАЗМЕРОМ меньше 64 байт, хотя если там реализация вычисления хеша то тоже давайте
1 Потому, что появляется поле SIB. 2. Вот - для поиска апи подойдёт Код (Text): xor eax,eax @@: add al,[edi+ecx] rol eax,3 dec ecx jne @b 3. А откуда такие жёсткие ограничения(про 64 байта). Когда-то писал в 48, тодько не помнё в какой системе(hex/dec) эти 48 были .
jeni API Ищу вот так (собственно как и драйвер гружу). Код (Text): ;─────────────────────────────────────────────────────────────────────────── ; 1. Первым делом определим как нас загрузили. Если как драйвер, то переход ;─────────────────────────────────────────────────────────────────────────── Start32bit: mov ax,cs test al,011b jz StartWinNTDrv ;─────────────────────────────────────────────────────────────────────────── ; 2. Найдем базовый адрес необходимые нам функции в kernel32.dll ;─────────────────────────────────────────────────────────────────────────── call FillFunctionName NumOfFuctions equ 3+5 GetModuleHandleA equ <[ebp]> db "GetModuleHandleA",0 GetModuleFileNameA equ <[ebp+4]> db "GetModuleFileNameA",0 LoadLibraryA equ <[ebp+8]> db "LoadLibraryA",0 db 0 advapi32 db "advapi32.dll",0 OpenSCManagerA equ <[ebp+0Ch]> advapy32Functions db "OpenSCManagerA",0 CreateServiceA equ <[ebp+10h]> db "CreateServiceA",0 StartServiceA equ <[ebp+14h]> db "StartServiceA",0 CloseServiceHandle equ <[ebp+18h]> db "CloseServiceHandle",0 OpenServiceA equ <[ebp+1Ch]> db "OpenServiceA",0 db 0 ;─────────────────────────────────────────────────────────────────────────── FillFunctionName: pop esi ;─────────────────────────────────────────────────────────────────────────── ; 3. Теперь определим систему Windows. Адрес возврата - тело kernel32.dll. ; Если адрес более 80000000h, то мы под Windows 9x. Иначе под NT. ;─────────────────────────────────────────────────────────────────────────── mov edi,[esp] ; адрес возврата and edi,0FFFFFFFEh ; выравниваем на 2 байта js StartWin9x ; бит 31 = 1 - Windows9x sub esp,NumOfFuctions*4 mov ebp,esp call FoundMZHeaderGetFunctions jnz ExitCriticalError ;─────────────────────────────────────────────────────────────────────────── ; 4. Подгрузим advapi32.dll и найдем там функции Service Manager для ; загрузки нашего exe как драйвера ;─────────────────────────────────────────────────────────────────────────── inc esi push esi call LoadLibraryA ..... ;┌───────────────────────────────────────────────────────────────────────────┐ ;│ Подпрограммы Windows 32 бит │ ;└───────────────────────────────────────────────────────────────────────────┘ ;────────────────────────────────────────────────────────────────────────────── ; Вход: edi - адрес возврата основной прогаммы ; esi - адрес таблицы имен ; ebp - адрес таблицы адресов для заполнения ;────────────────────────────────────────────────────────────────────────────── FoundMZHeaderGetFunctions: mov ax,"ZM" mov ecx,1024*1024*10 ; 20 Мб std ; обратный поиск NoFoundMZ: or ecx,ecx jnz ContinueFoundMZ ExitFoundMZ: or al,al ; не найден базовый адрес kernel32.dll retn ; или ntoskernel.exe ZF = 0 ContinueFoundMZ: repnz scasw cmp W [edi+1Ah],40h ; Если здесь не 40h jnz NoFoundMZ ; то это не Win32 EXE inc edi ; файл inc edi cld ; Приведем регистры xchg eax,edi mov edi,ebp ;────────────────────────────────────────────────────────────────────────────── ; Вход esi-адрес таблицы имен ; edi-адрес таблицы адресов для заполняется ; eax-ImageBase модуля ;────────────────────────────────────────────────────────────────────────────── GetAddressFromName: push eax push edi push eax push eax push eax add eax,[eax+3Ch] ; PE - header pop ebx add ebx,[eax+78h] ; ebx - Export Directory pop edx add edx,[ebx+20h] ; edx - AddressOfNames push esi xor ecx,ecx GAFNLabel2: lodsb inc ecx or al,al jnz GAFNLabel2 pop esi GAFNLabel1: pop edi push edi add edi,[edx] add edx,4 push ecx push esi repz cmpsb pop esi pop ecx jnz GAFNLabel1 sub edx,4 pop eax sub edx,eax sub edx,[ebx+20h] shr edx,1 add edx,[ebx+24h] add edx,eax push ecx xor ecx,ecx mov cx,[edx] shl ecx,2 add ecx,eax add ecx,[ebx+1Ch] add eax,[ecx] pop ecx pop edi stosd add esi,ecx cmp byte ptr [esi],NULL pop eax jnz GetAddressFromName retn
Можешь у lsd (last stage of delerium group) посмотреть. Здесь на сайте есть много материала. Billy B. Win32 Vir G.
"FileOffset = RVA - SectionRVA + SectionOffset" А как мне определить что секция является секцией кода???
Посмотри, куда указывает точка входа. Если сюда (если программа не пакованная), то это она и есть. Можно по атрибутам секции посмотреть
Что делает? Узнает, где секция кода или находит точку входа в запакованных программах? Если второе, то не знаю. А если первое - то как я сказал. Можно так же посмотреть поле по смещению +2Ch, но оно может не совпадать с реальностью.