Использование EBp

Тема в разделе "WASM.BEGINNERS", создана пользователем Polimorph, 4 ноя 2005.

Статус темы:
Закрыта.
  1. Polimorph

    Polimorph New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    51
    Адрес:
    Russian
    Срочно нужна помощь



    в испоьзуемой процедуре используется регистр ebp

    а мне нужно его использовать для других целей

    как можно преобразовать код что бы ebp не был занят
    Код (Text):
    1.  
    2.     push    8         ; set number of functions to find...
    3.     pop     ebp  
    4.                                          ; ...in ebp
    5.     mov     edi,KernelTable                          ; address of kernel32 function's hash table
    6.     mov     ebx,dword [ebx+0Ch]       ; EBX = PEB_LDR_DATA
    7.     mov     ebx,dword [ebx+1Ch]; InitOrderModuleList 1st entry
    8.     mov     ebx,dword [ebx]                     ; next entry
    9.     mov     eax,dword [ebx+8]                   ; K32 imagebase in EAX
    10.  
    11. ; ***************** search addresses of api functions *****************
    12. ; * Be careful with it's params coz there are no any checks
    13. ; * so if hash is wrong there'll be a crash!
    14. ; * Look at params of function: they must be in registers not in stack!
    15. SearchApi:      ; eax = module, edi = hashtable, ebp = size                  ; K32 imagebase in EAX                       ; ESI = oaeie oeacaoaeu
    16.     mov     edx,dword [eax+3Ch]                 ; get fileaflign
    17.     mov     esi,dword [eax+edx+78h]             ; get exporttable RVA
    18.     lea     esi,dword [esi+eax+18h]             ; set ESI to .ex_numofnamepointers in export table
    19.     xchg    eax,ebx                             ; save in EBX module image base
    20.     lodsd                                       ; get number of Name Pointers
    21.     push    eax                                 ; save it in stack
    22.     lodsd                                       ; get address table RVA
    23.     push    eax                                 ; save it in stack
    24.     lodsd                                       ; get name pointers RVA
    25.     push    eax                                 ; save it in stack
    26.     add     eax,ebx                             ; add module image base to index (for what?)
    27.     push    eax                                 ; index
    28.     lodsd                                       ; get ordinal table RVA
    29.     push    eax                                 ; save it in stack
    30.  
    31.     .begin_search:                              ; search API function
    32.     mov     ecx,dword [esp+4*4]                 ; get number of Name Pointers
    33.     xor     edx,edx                             ; clear edx
    34.  
    35.     .search_API_name:                           ; search for neccessary function
    36.         mov     esi,dword [esp+4*1]             ; get index
    37.         mov     esi,dword [esi]                 ; get RVA of first element
    38.         add     esi,ebx                         ; get VA of first element
    39.     ; --- Getting hash-value for API function name ---
    40.         xor     eax,eax                         ; clear eax
    41.         push    eax                             ; hash value will be generated in stack
    42.             ror     eax,7                       ; ror :)
    43.             xor     [esp],eax                   ; xor :)
    44.             lodsb                               ; get next symbol
    45.             test    al,al                       ; while not end of string
    46.         jnz     $-9                             ; repeat
    47.         pop     eax                             ; get hash value in EAX
    48.     ; ------------------------------------------------
    49.         cmp     eax,dword [edi]                 ; if hash of function equal with value from table
    50.         je      .ok_api                         ; we've got'em
    51.         add     dword [esp+4*1],4               ; else increase index
    52.         inc     edx                             ; increase counter - function number
    53.     loop    .search_API_name                    ; repeat search
    54.     ret                                         ; exit if no function found
    55.  
    56.     .ok_api:
    57.     shl     edx,1                               ; double function number
    58.     mov     ecx,dword [esp]                     ; get ordinal table RVA
    59.     add     ecx,ebx                             ; get ordinal table VA
    60.     add     ecx,edx                             ; get function ordinal address
    61.     mov     ecx,[ecx]                           ; get function ordinal
    62.     movzx   ecx,cx                              ; clear higher word (ordinal size is word)
    63.     mov     edx,[esp+4*3]                       ; get address table RVA
    64.     add     edx,ebx                             ; get address table VA
    65.     lea     edx,[edx+ecx*4]                     ; get address of api RVA
    66.     mov     edx,[edx]                           ; get api RVA
    67.     add     edx,ebx                             ; get api VA
    68.     mov     dword [edi],edx                     ; save api address
    69.     add     edi,4                               ; get next hash-value
    70.     dec     ebp                                 ; decrease counter of neccessary functions
    71.     jz      .all_apis_founded                   ; go to exit from function
    72.     ; --- search next api function
    73.     mov     ecx,dword [esp+4*2]                 ; get name pointers RVA
    74.     add     ecx,ebx                             ; get name pointers VA
    75.     mov     dword [esp+4*1],ecx                 ; set new index
    76.     jmp     .begin_search                       ; search again
    77.  
    78.     .all_apis_founded:                          ; exit from function
    79.     add     esp,5*4                             ; recover stack
    80.     mov     eax,$                               ; get current address
    81.     mov     byte [eax],0C3h                     ; change instruction to RETN
    82. ; ==========================================================
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Море вариантов, самый простой убрать первые две строки и вместо dec ebp поставить cmp dword[edi],0 или любой признак окончания таблицы, х.з. как там она у тебя заканчивается
     
  3. Polimorph

    Polimorph New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    51
    Адрес:
    Russian
    вОТ ПРИМЕР ТАБЛИЦЫ ХЕШЕЙ
    Код (Text):
    1. kernelFuncs:
    2.   LL dd 71E40722h       ; LoadLibraryA
    3. us32 db 'USER32.DLL',0
    4. u32func:
    5.   msbx  dd         0BE7B3098h                ;MessageBoxA
    6.  


    bogrus НАСЧЁТ MASM->FASM НУ ПЕРЕДАЧА ПАРАМЕТРОВ В ПРОЦЕДУРУ

    ДЕЛО В ТОМ ЧТО Я ПИШУ ВНЕДРЯЕМЫЙ КОД

    ВЫСЧИТЫВАЮ СМЕЩЕНИЕ И МНЕ НАДО НЕ В САМОЙ ПРОЦЕДУРЕ ОПРЕДЕЛЯТЬ АРГУМЕНТЫ А ПЕРЕДАВАТЬ ИХ ПРОЦЕДУРЕ

    А В ФАСМЕ У МЕНЯ НЕТ ХЕЛПА

    ЗНАЮ ЧТО ДОЛЖЕН БЫТЬ НО НЕТ

    СПАСИБО

    ПОМОГИ ПОЖ ТА С ПОИСКОМ АДРЕСОВ

    ДЕЛО В ТОМ ЧТО В ESP У МЕНЯ ДЕЛЬТА СМЕЩЕНИЕ
     
  4. Polimorph

    Polimorph New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    51
    Адрес:
    Russian
    И ЕЩЁ ВОПРОСИК МАЛЕНЬКИЙ ДОПУСТИМ Я ПОПАДАЮ В RING 0 ПОД XP ЧТО РЕАЛЬНОГО МОЖНО СДЕЛАТЬ В НУЛЕВОМ КОЛЬЦЕ
     
Статус темы:
Закрыта.